深入剖析 rabbitMQ( 五 )


  • 第一个参数:表示队列名称
  • 第二个参数:表示是否持久化,为true表示会将队列持久化存储到硬盘
  • 第三个参数:表示是否排它性,为true表示只对首次声明它的连接可见,会在其连接断开的时候自动删除
  • 第四个参数:表示是否自动删除,为true表示有过消费者并且所有消费者都解除订阅了,自动删除队列
  • 第五个参数:表示设置参数,参数类型为Map<String, Object>
5.5、创建绑定当交换器和队列都创建成功之后,就可以建立绑定关系 。
//交换器和队列进行绑定(可重复执行,不会重复创建)channel.queueBind(queueName, exchangeName, routingKey);//异步进行绑定,最后一个参数表示可以带自定义参数channel.queueBindNoWait(queueName,exchangeName,routingKey,null);//exchange和queue进行解绑(可重复执行)channel.queueUnbind(queueName, exchangeName, routingKey);//exchange与exchange进行绑定(可重复执行,不会重复创建)//第一个参数表示目标交换器//第二个参数表示原地址交换器//第三个参数表绑定路由keychannel.exchangeBind(destination,source,routingKey);//exchange和exchange进行解绑(可重复执行)channel.exchangeUnbind(destination,source,routingKey);绑定关系参数解读:
  • queueName:队列名称,取自创建的队列名称
  • exchangeName:交换器,取自创建的交换器名称
  • routingKey:路由键key,自定义
5.6、发送消息发送消息到交换器就会使用我们上文所提到的channel管道 。
//发送的消息内容byte[] messageBodyBytes = "Hello, world!".getBytes();channel.basicPublish(exchangeName, routingKey, null, messageBodyBytes);也可以在发送消息前设定一些消息属性 。
//自己构建BasicProperties的对象channel.basicPublish(exchangeName, routingKey,             new AMQP.BasicProperties.Builder()               .contentType("text/plain")               .deliveryMode(2)               .priority(1)               .userId("zhangsan")               .build()),               messageBodyBytes);发送指定头信息的消息 。
Map<String, Object> headers = new HashMap<String, Object>();headers.put("userName",  '"zhangsan');headers.put("userCode", "123");//发送消息到交换器channel.basicPublish(exchangeName, routingKey,             new AMQP.BasicProperties.Builder()               .headers(headers)               .build()),               messageBodyBytes);发送一个有过期时间的消息,单位:ms 。
//设置消息过期时间,单位mschannel.basicPublish(exchangeName, routingKey,             new AMQP.BasicProperties.Builder()               .expiration("6000")               .build()),               messageBodyBytes);更多用法,可以参见官方 API
5.7、接受消息从消息队列中接受消息也会使用我们上文所提到的channel管道 。
//监听队列中的消息channel.basicConsume(queueName,true,new SimpleConsumer(channel));监听队列消息参数解读:
  • 第一个参数:表示需要监听的队列名称
  • 第二个参数:表示是否自动确认,如果配置false表示手动确认消息是否收到
  • 第三个参数:表示消息处理类
具体的消息处理类需要继承DefaultConsumer,并重写handleDelivery方法,代码如下:
public class SimpleConsumer extends DefaultConsumer{    public SimpleConsumer(Channel channel){        super(channel);    }    @Override    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {  //接受从队列中发送的消息        System.out.println(consumerTag);        System.out.println("-----收到消息了---------------");        System.out.println("消息属性为:"+properties);        System.out.println("消息内容为:"+new String(body));    }}


推荐阅读