RabbitMQ使用场景练习:监听器Listener(九)

[list][*][b]监听器[/b][/list]
RabbitMQ中监听器有ReturnListener、ConfirmListener、ShutdownListener,本练习中使用ReturnListener,在发布消息时设置mandatory等于true,监听消息是否有相匹配的队列,没有时ReturnListener将执行handleReturn方法,消息将返给发送者
设置mandatory=true,当路由不到队列时返回给消息发送者,在return监听器中接收
设置immediate=true,当路由不到消费者时返回,3.0以后版本已废弃,会影响镜像队列性能,建议采用消息TTL和DLX


[list]
[*][b]注意要点[/b]
[/list]
[i]发送消息时mandatory设置为true[/i]:
//设置mandatory=true,当路由不到队列时返回给消息发送者,在return监听器中接收
channel.basicPublish("header_exchange", "" ,true,false,properties.build(), SerializationUtils.serialize(object));

[i]创建Return监听器[/i]:
//增加return监听器,当发布消息且无匹配的队列时消息被返回给接收者
channel.addReturnListener(new ReturnListener() {
@Override
public void handleReturn(int replyCode, String replyText, String exchange,
String routingKey, BasicProperties properties, byte[] body)
throws IOException {
System.out.println(SerializationUtils.deserialize(body));
}
});

[i]除了Return监听器,还有ConfirmListener、ShutdownListener监听器[/i]

[list]
[*][b]mandatory、Return监听器练习[/b]
[/list]
package com.demo.mq.rabbitmq.example09;

import java.io.IOException;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang3.SerializationUtils;
import com.demo.mq.rabbitmq.MqManager;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ReturnListener;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.AMQP.BasicProperties.Builder;

/**
* mandatory、监听器使用练习
* @author sheungxin
*
*/
public class SendListener {

/**
* 1、设置mandatory=true,当路由不到队列时返回给消息发送者,在return监听器中接收
* 2、immediate,当路由不到消费者时返回,3.0以后版本已废弃,会影响镜像队列性能,建议采用消息TTL和DLX
* 3、监听器:ReturnListener:mandatory=true时,无匹配queue时接收返回消息
* ConfirmListener:Ack、Nack,confirm模式,服务端监听
* ShutdownListener:监听关闭
* @param object 消息主体
* @throws IOException
*/
public static void sendAToB(Serializable object) throws Exception{
Connection conn=MqManager.newConnection();
Channel channel=conn.createChannel();
//声明headers转发器
channel.exchangeDeclare("header_exchange", BuiltinExchangeType.HEADERS);
//定义headers存储的键值对
Map<String, Object> headers=new HashMap<String, Object>();
headers.put("key", "123456");
headers.put("token", "654321");
//把键值对放在properties
Builder properties=new BasicProperties.Builder();
properties.headers(headers);
properties.deliveryMode(2);//持久化
//指定消息过期时间为12秒,队列上也可以指定消息的过期时间,两者以较小时间为准
// properties.expiration("12000");//延时30秒,不会及时删除(在consuemr消费时判定是否过期,因为每条消息的过期时间不一致,删除过期消息就需要扫描整个队列)
//增加return监听器,当发布消息且无匹配的队列时消息被返回给接收者
channel.addReturnListener(new ReturnListener() {
@Override
public void handleReturn(int replyCode, String replyText, String exchange,
String routingKey, BasicProperties properties, byte[] body)
throws IOException {
System.out.println(SerializationUtils.deserialize(body));
}
});
//设置mandatory=true,当路由不到队列时返回给消息发送者,在return监听器中接收
channel.basicPublish("header_exchange", "" ,true,false,properties.build(), SerializationUtils.serialize(object));
System.out.println("Send '"+object+"'");
}

public static void main(String[] args) throws Exception {
sendAToB("Hello World !");
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值