簡體   English   中英

具有2個偵聽器的Spring AMQP,僅一個偵聽器有效

[英]Spring AMQP with 2 Listeners, only one listener works

我有一個FanoutExchange具有2個隊列。 每個隊列都有一個偵聽器,當我為每個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 ,這是自動連接的。 這是因為自動裝配是byType。 如果您使用自動byName byName,則可以解決此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");
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM