zoukankan      html  css  js  c++  java
  • RabbitMQ简单Java示例——生产者和消费者

    添加Maven依赖:

    使用rabbitmq-client的最新Maven坐标:

    <!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
    <dependency>
        <groupId>com.rabbitmq</groupId>
        <artifactId>amqp-client</artifactId>
        <version>5.3.0</version>
    </dependency>
    

    添加账户

    默认情况下,访问RabbitMQ服务的用户名和密码都是“guest”,这个账号有限制,默认只能通过本地网络(如localhost)访问,远程网络访问受限,所以在实现生产和消费消息之前,需要另外添加一个用户,并设置相应的访问权限。

    添加新用户,用户名为“zifeiy”,密码为“passwd”:

    C:Userszifeiy>rabbitmqctl add_user zifeiy passwd
    Adding user "zifeiy" ...
    

    为zifeiy用户设置所有权限:

    C:Userszifeiy>rabbitmqctl set_permissions -p / zifeiy ".*" ".*" ".*"
    Setting permissions for user "zifeiy" in vhost "/" ...
    

    设置用户zifeiy为管理员角色:

    C:Userszifeiy>rabbitmqctl set_user_tags zifeiy administrator
    Setting tags for user "zifeiy" to [administrator] ...
    

    计算机的世界是从“Hello World!”开始的,这里我们也沿用惯例,首先生产者发送一条消息”Hello World!“至RabbitMQ中,之后由消费者消费。
    下面先演示生产者客户端的代码,然后再演示消费者客户端的代码。

    生产者客户端代码

    package com.zifeiy.springtest.rabbitmq;
    
    import java.io.IOException;
    import java.util.concurrent.TimeoutException;
    
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.Connection;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.MessageProperties;
    
    public class RabbitProducer {
    	private static final String EXCHANGE_NAME = "exchange_demo";
    	private static final String ROUTING_KEY = "routingkey_demo";
    	private static final String QUEUE_NAME = "queue_demo";
    	private static final String IP_ADDRESS = "127.0.0.1";
    	private static final int PORT = 5672;	// RabbitMQ服务端默认端口号为5672
    	
    	public static void main(String[] args) throws IOException, TimeoutException {
    		ConnectionFactory factory = new ConnectionFactory();
    		factory.setHost(IP_ADDRESS);
    		factory.setPort(PORT);
    		factory.setUsername("zifeiy");
    		factory.setPassword("passwd");
    		Connection connection = factory.newConnection();	// 建立连接
    		Channel channel = connection.createChannel();		// 创建信道
    		// 创建一个type="direct"、持久化的、非自动删除的交换器
    		channel.exchangeDeclare(EXCHANGE_NAME, "direct", true, false, null);
    		// 创建一个持久化、非排他的、非自动删除的队列
    		channel.queueDeclare(QUEUE_NAME, true, false, false, null);
    		// 将交换器和队列通过路由绑定
    		channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
    		// 发送一条持久化的消息:hello world!
    		String message = "hello,world!";
    		channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, 
    					MessageProperties.PERSISTENT_TEXT_PLAIN, 
    					message.getBytes());
    		// 关闭资源
    		channel.close();
    		connection.close();
    	}
    }
    

    运行。

    消费者客户端代码

    package com.zifeiy.springtest.rabbitmq;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.TimeoutException;
    
    import com.rabbitmq.client.AMQP;
    import com.rabbitmq.client.Address;
    import com.rabbitmq.client.Channel;
    import com.rabbitmq.client.ConnectionFactory;
    import com.rabbitmq.client.Consumer;
    import com.rabbitmq.client.DefaultConsumer;
    import com.rabbitmq.client.Envelope;
    import com.rabbitmq.client.Connection;
    
    public class RabbitConsumer {
    	private static final String QUEUE_NAME = "queue_demo";
    	private static final String IP_ADDRESS = "127.0.0.1";
    	private static final int PORT = 5672;
    	
    	public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
    		Address[] addresses = new Address[] {
    				new Address(IP_ADDRESS, PORT)
    		};
    		ConnectionFactory factory = new ConnectionFactory();
    		factory.setUsername("zifeiy");
    		factory.setPassword("passwd");
    		// 这里的连接方式与生产者的demo略有不同,注意区分
    		Connection connection = factory.newConnection(addresses);	// 创建连接
    		final Channel channel = connection.createChannel();	// 创建信道
    		channel.basicQos(64); 	// 设置客户端最多接受未被ack的消息的个数
    		Consumer consumer = new DefaultConsumer(channel) {
    			@Override
    			public void handleDelivery(String consumerTag, Envelope envelope, 
    							AMQP.BasicProperties properties, byte[] body) throws IOException {
    				System.out.println("recv message: " + new String(body));
    				try {
    					TimeUnit.SECONDS.sleep(1);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    				channel.basicAck(envelope.getDeliveryTag(), false);
    			}
    		};
    		channel.basicConsume(QUEUE_NAME, consumer);
    		// 等待回调函数执行完毕后,关闭资源
    		TimeUnit.SECONDS.sleep(5);
    		channel.close();
    		connection.close();
    	}
    }
    
    

    运行,命令行输出如下:

    recv message: hello,world!
    
    
  • 相关阅读:
    ln 硬链接与软链接
    Fujitsu存储多路径管理
    Ansible 模块详解
    思科光纤交换机9124管理手册
    Fujitsu DX100S3配置方案
    富士通存储的TPP池和SDPV池
    Solaris 10 ZFS文件系统挂载
    经分测试M5000重启进入维护模式
    finally在return之后还是之前运行
    gradle构建
  • 原文地址:https://www.cnblogs.com/zifeiy/p/9490660.html
Copyright © 2011-2022 走看看