如何在RabbitMQ(Spring AMQP)中注册多个消息列表器
我是拉比犬的新手。我使用的是SpringRabbit1.3.5版本。 我想注册多个消息列表器。怎么做 我可以注册一个消息列表器如何在RabbitMQ(Spring AMQP)中注册多个消息列表器,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,我是拉比犬的新手。我使用的是SpringRabbit1.3.5版本。 我想注册多个消息列表器。怎么做 我可以注册一个消息列表器 @Service("myMessageListener") public class MessageHandler implements MessageListener { @Override public void onMessage(Message message) { log.info("Received message: " +
@Service("myMessageListener")
public class MessageHandler implements MessageListener {
@Override
public void onMessage(Message message) {
log.info("Received message: " + message);
log.info("Text: " + new String(message.getBody()));
}
}
这是我的密码:
1) 扩展MessageListner接口的接口
public interface MessageQueueManager extends MessageListener{
public String createQueue(String queueName);
public void sendMessage(String message, String destinationQueueName) throws Exception;
}
2) 以下是实施方案:
@Service("messageQueueManager")
public class MessageQueueManagerImpl implements MessageQueueManager {
@Autowired
private AmqpAdmin admin;
@Autowired
private AmqpTemplate template;
@Autowired
private ConnectionFactory connectionFactory;
@Autowired
private SimpleMessageListenerContainer container;
@Override
public void onMessage(Message message) {
// Different message can behave differently.
}
@Override
public String createQueue(String queueName) {
// survive a server restart
boolean durable = true;
// keep it even if nobody is using it
boolean autoDelete = false;
boolean exclusive = false;
// create queue
Queue newQueue = new Queue(queueName, durable, exclusive, autoDelete);
queueName = admin.declareQueue(newQueue);
// create binding with exchange
// Producer sends to an Exchange and a Consumer receives from a Queue, the bindings that connect Queues to Exchanges are critical for connecting those producers and consumers via messaging.
/*admin.declareBinding(new Binding(queueName, DestinationType.QUEUE,
"directExchange", queueName, new HashMap<String, Object>()));*/
Binding binding = BindingBuilder.bind(newQueue).to(DirectExchange.DEFAULT).with(queueName);
admin.declareBinding(binding);
// add queue to listener
container.addQueues(newQueue);
// start listener
container.start();
return queueName;
}
@Override
public void sendMessage(String message, String destinationQueueName)
throws Exception {
template.convertAndSend("directExchange", destinationQueueName,
MessageBuilder.withBody(message.getBytes()).build());
}
}
1) 注册您的队列:
<rabbit:queue id="spring.queue" auto-delete="false" durable="true" exclusive="false" name="spring.queue"/>
<rabbit:queue id="user.login.notification" auto-delete="false" durable="true" exclusive="false" name="user.login.notification"/>
2) 声明绑定:
<rabbit:direct-exchange name="directExchange" auto-delete="false">
<rabbit:bindings>
<rabbit:binding queue="spring.queue" key="spring.queue" />
<rabbit:binding queue="user.login.notification" key="user.login.notification MAIYAM" />
</rabbit:bindings>
</rabbit:direct-exchange>
3) 当任何队列发布消息时,告诉容器调用onMessage(Message Message)方法
<rabbit:listener-container
connection-factory="connectionFactory" acknowledge="auto" concurrency="10"
requeue-rejected="true">
<rabbit:listener ref="myMessageListener" queues="spring.queue" />
<rabbit:listener ref="messageQueueManager" queues="user.login.notification" />
</rabbit:listener-container>
4) 移除私有SimpleMessageListenerContainer容器代码>来自MessageQueueManagerImpl类
现在它应该可以工作了。1)注册您的队列:
<rabbit:queue id="spring.queue" auto-delete="false" durable="true" exclusive="false" name="spring.queue"/>
<rabbit:queue id="user.login.notification" auto-delete="false" durable="true" exclusive="false" name="user.login.notification"/>
2) 声明绑定:
<rabbit:direct-exchange name="directExchange" auto-delete="false">
<rabbit:bindings>
<rabbit:binding queue="spring.queue" key="spring.queue" />
<rabbit:binding queue="user.login.notification" key="user.login.notification MAIYAM" />
</rabbit:bindings>
</rabbit:direct-exchange>
3) 当任何队列发布消息时,告诉容器调用onMessage(Message Message)方法
<rabbit:listener-container
connection-factory="connectionFactory" acknowledge="auto" concurrency="10"
requeue-rejected="true">
<rabbit:listener ref="myMessageListener" queues="spring.queue" />
<rabbit:listener ref="messageQueueManager" queues="user.login.notification" />
</rabbit:listener-container>
4) 移除私有SimpleMessageListenerContainer容器代码>来自MessageQueueManagerImpl类
现在它应该可以工作了。不清楚你想要实现什么。如果您想根据消息的内容来区分消息,那么应该在onMessage函数中实现一个开关大小写。如果您试图侦听不同的exchange绑定,请使用多个绑定对象。不清楚您试图实现什么。如果您想根据消息的内容来区分消息,那么应该在onMessage函数中实现一个开关大小写。如果您试图侦听不同的exchange绑定,请使用多个绑定对象。是否了解JAVACONFIG?是否了解JAVACONFIG?