在发布消息时设置mandatory等于true,监听消息是否有相匹配的队列,
没有时ReturnListener将执行handleReturn方法,消息将返给发送者 ;
看个例子
消费者
package rabbitmq.api.returnListener;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Auther: lizhi
* @Date: 2018/9/28 19:25
* @Description:
*/
public class Consumer {
public static void main(String[] args) throws IOException, TimeoutException, InterruptedException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
String exchangeName = "test_return_exchange";
String routingKey = "return.#";
String queueName = "test_return_queue";
channel.exchangeDeclare(exchangeName, "topic", true, false, null);
channel.queueDeclare(queueName, true, false, false, null);
channel.queueBind(queueName, exchangeName, routingKey);
QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
channel.basicConsume(queueName, true, queueingConsumer);
while (true) {
QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
String msg = new String(delivery.getBody());
System.out.println(msg);
}
}
}
生产者
package rabbitmq.api.returnListener;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Auther: lizhi
* @Date: 2018/9/28 19:24
* @Description:
*/
public class Produce {
/**
* @param args
* @throws IOException
* @throws TimeoutException
*/
public static void main(String[] args) throws IOException, TimeoutException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
Connection connection = connectionFactory.newConnection();
Channel channel = connection.createChannel();
String exchangeName = "test_return_exchange";
// String routingKey = "return.save";
String routingKeyError = "abc.save";
channel.addReturnListener(new ReturnListener() {
/**
* int replyCode, 响应吗, 路由成没成功
* String replyText, 回复内容
* String exchange,
* String routingKey,
* AMQP.BasicProperties properties,
* byte[] body 实际的消息体内容
* @param replyCode
* @param replyText
* @param exchange
* @param routingKey
* @param properties
* @param body
* @throws IOException 跑出ioexception 异常
*/
public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("handle return");
System.out.println("replyCode: " + replyCode);
System.out.println("exchange: " + exchange);
System.out.println("routingKey: " + routingKey);
System.out.println("properties: " + properties.toString());
System.out.println("body: " + new String(body));
}
});
String msg = "Hello RabbitMQ return Message";
// Mandatory:强制性的,如果为true, 则监听器会接收到路由不可达的消息,然后进行后续处理, 如果为false, 那么broker端自动删除该消息;
channel.basicPublish(exchangeName, routingKeyError, true, null, msg.getBytes());
}
}
如果为routingKeyError 则找不到队列,会走handleReturn ,
handle return
replyCode: 312
exchange: test_return_exchange
routingKey: abc.save
properties: #contentHeader<basic>(content-type=null, content-encoding=null, headers=null, delivery-mode=null, priority=null, correlation-id=null, reply-to=null, expiration=null, message-id=null, timestamp=null, type=null, user-id=null, app-id=null, cluster-id=null)
body: Hello RabbitMQ return Message
看不懂就复制下来跑一下
// String routingKey = "return.save"; // 可以找到,返回成功,不走监听
String routingKeyError = "abc.save"; // 失败,找不到相应的队列,进行相关操作