如何在RabbitMQ(Spring AMQP)中注册多个消息列表器

如何在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: " +

我是拉比犬的新手。我使用的是SpringRabbit1.3.5版本。 我想注册多个消息列表器。怎么做

我可以注册一个消息列表器

@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?