Spring AMQP 有 2 个监听器,只有一个监听器工作
Spring AMQP with 2 Listeners, only one listener works
我有一个具有 2 个队列的 FanoutExchange。每个队列都有一个 Listener,当我为每个 ListenerAdapter 创建两个 SimpleMessageListenerContainer 时,只有第一个有效。
我在这里留下我的代码以便更好地解释:
public static final String BROADCAST_PERSISTENCE_QUEUE = "persistence.rabbit.queue";
public static final String BROADCAST_WEBAPP_QUEUE = "webapp.rabbit.queue";
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(
"localhost");
return connectionFactory;
}
@Bean
public AmqpAdmin amqpAdmin() {
return new RabbitAdmin(connectionFactory());
}
@Bean
public Queue persistenceQueue() {
return new Queue(BROADCAST_PERSISTENCE_QUEUE);
}
@Bean
public Queue webAppQueue() {
return new Queue(BROADCAST_WEBAPP_QUEUE);
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
return rabbitTemplate;
}
@Bean
public FanoutExchange trashRouteExchange() {
FanoutExchange exchange = new FanoutExchange("trashroute");
return exchange;
}
@Bean
public Binding trashRouteBinding() {
return BindingBuilder.bind(persistenceQueue()).to(trashRouteExchange());
}
@Bean
public Binding webAppBinding() {
return BindingBuilder.bind(webAppQueue()).to(trashRouteExchange());
}
@Bean
MessageListenerAdapter persistenceListenerAdapter(PersistenceListener persistenceListener) {
return new MessageListenerAdapter(persistenceListener, "receiveMessage");
}
@Bean
SimpleMessageListenerContainer persistenceListenerContainer(
ConnectionFactory connectionFactory,
@Qualifier("persistenceListenerAdapter") MessageListenerAdapter persistenceListenerAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueues(persistenceQueue(), webAppQueue());
container.setMessageListener(persistenceListenerAdapter);
return container;
}
@Bean
MessageListenerAdapter webAppListenerAdapter(WebAppListener webAppListener) {
return new MessageListenerAdapter(webAppListener, "receiveMessage");
}
@Bean
SimpleMessageListenerContainer webAppListenerContainer(
ConnectionFactory connectionFactory,
@Qualifier("webAppListenerAdapter") MessageListenerAdapter webAppListenerAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueues(persistenceQueue(), webAppQueue());
container.setMessageListener(webAppListenerAdapter);
return container;
}
@Bean
PersistenceListener persistenceListener() {
return new PersistenceListener();
}
@Bean
WebAppListener webAppListener() {
return new WebAppListener();
}
奇怪的情况是,如果我首先放置 persistenceListenerContainer() 方法,这是可以正常工作的监听器,但是,如果我更改我的代码并放置 webAppListenerContainer() 方法,则 PersistenceListener 不起作用并且 WebAppListener开始工作。
谁能帮我解决这个问题?
正如您所说 MessageListenerAdapter
您放在第一位的那个正在自动装配。这是因为自动装配是按类型的。如果您使用自动装配 byName
.
,则可以解决此问题
@Bean(name="persistenceListenerAdapter")
MessageListenerAdapter persistenceListenerAdapter(PersistenceListener persistenceListener) {
return new MessageListenerAdapter(persistenceListener, "receiveMessage");
}
@Bean(name="webListenerAdapter")
MessageListenerAdapter webAppListenerAdapter(WebAppListener webAppListener) {
return new MessageListenerAdapter(webAppListener, "receiveMessage");
}
我有一个具有 2 个队列的 FanoutExchange。每个队列都有一个 Listener,当我为每个 ListenerAdapter 创建两个 SimpleMessageListenerContainer 时,只有第一个有效。
我在这里留下我的代码以便更好地解释:
public static final String BROADCAST_PERSISTENCE_QUEUE = "persistence.rabbit.queue";
public static final String BROADCAST_WEBAPP_QUEUE = "webapp.rabbit.queue";
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(
"localhost");
return connectionFactory;
}
@Bean
public AmqpAdmin amqpAdmin() {
return new RabbitAdmin(connectionFactory());
}
@Bean
public Queue persistenceQueue() {
return new Queue(BROADCAST_PERSISTENCE_QUEUE);
}
@Bean
public Queue webAppQueue() {
return new Queue(BROADCAST_WEBAPP_QUEUE);
}
@Bean
public RabbitTemplate rabbitTemplate() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory());
return rabbitTemplate;
}
@Bean
public FanoutExchange trashRouteExchange() {
FanoutExchange exchange = new FanoutExchange("trashroute");
return exchange;
}
@Bean
public Binding trashRouteBinding() {
return BindingBuilder.bind(persistenceQueue()).to(trashRouteExchange());
}
@Bean
public Binding webAppBinding() {
return BindingBuilder.bind(webAppQueue()).to(trashRouteExchange());
}
@Bean
MessageListenerAdapter persistenceListenerAdapter(PersistenceListener persistenceListener) {
return new MessageListenerAdapter(persistenceListener, "receiveMessage");
}
@Bean
SimpleMessageListenerContainer persistenceListenerContainer(
ConnectionFactory connectionFactory,
@Qualifier("persistenceListenerAdapter") MessageListenerAdapter persistenceListenerAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueues(persistenceQueue(), webAppQueue());
container.setMessageListener(persistenceListenerAdapter);
return container;
}
@Bean
MessageListenerAdapter webAppListenerAdapter(WebAppListener webAppListener) {
return new MessageListenerAdapter(webAppListener, "receiveMessage");
}
@Bean
SimpleMessageListenerContainer webAppListenerContainer(
ConnectionFactory connectionFactory,
@Qualifier("webAppListenerAdapter") MessageListenerAdapter webAppListenerAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueues(persistenceQueue(), webAppQueue());
container.setMessageListener(webAppListenerAdapter);
return container;
}
@Bean
PersistenceListener persistenceListener() {
return new PersistenceListener();
}
@Bean
WebAppListener webAppListener() {
return new WebAppListener();
}
奇怪的情况是,如果我首先放置 persistenceListenerContainer() 方法,这是可以正常工作的监听器,但是,如果我更改我的代码并放置 webAppListenerContainer() 方法,则 PersistenceListener 不起作用并且 WebAppListener开始工作。
谁能帮我解决这个问题?
正如您所说 MessageListenerAdapter
您放在第一位的那个正在自动装配。这是因为自动装配是按类型的。如果您使用自动装配 byName
.
@Bean(name="persistenceListenerAdapter")
MessageListenerAdapter persistenceListenerAdapter(PersistenceListener persistenceListener) {
return new MessageListenerAdapter(persistenceListener, "receiveMessage");
}
@Bean(name="webListenerAdapter")
MessageListenerAdapter webAppListenerAdapter(WebAppListener webAppListener) {
return new MessageListenerAdapter(webAppListener, "receiveMessage");
}