2017-01-23 6 views
1

実際にはこれは実行されません。たぶん私は何か誤解してしまったが、これはとにかくできない。私は2つのリスナを1つの同じキューに設定しようとしていますが、同じ交換はしますが、ルーティングキーだけが異なるはずです。私の問題は何とか物事が乱れることです。その結果、リスナーAはリスナーB向けのメッセージを取得しますが、時には時にはすべてがうまく動作することもあります。助言がありますか?spring ampq注釈は1つのキューを駆動します2つのリスナーはルーティングキーを区別します

のMyConfig

@Bean 
public ConnectionFactory connectionFactory() { 
    CachingConnectionFactory connectionFactory = new CachingConnectionFactory(getHostname()); 
    connectionFactory.setUsername(getUsername()); 
    connectionFactory.setPassword(getPassword()); 
    return connectionFactory; 
} 

@Bean 
public RabbitAdmin rabbitAdmin() { 
    return new RabbitAdmin(connectionFactory()); 
} 

@Bean 
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { 
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
    factory.setMessageConverter(new CustomMessageConverter()); 
    factory.setConnectionFactory(connectionFactory()); 
    factory.setAcknowledgeMode(AcknowledgeMode.AUTO); 
    factory.setConcurrentConsumers(10); 
    factory.setMaxConcurrentConsumers(10); 
    return factory; 
} 

@Override 
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) { 
    registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory()); 
} 

@Bean 
public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() { 
    DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory(); 
    factory.setMessageConverter(new MappingJackson2MessageConverter()); 
    return factory; 
} 

MyListeners

@RabbitListener(bindings = @QueueBinding(value = @Queue(value = QUEUE, durable = "true"), exchange = @Exchange(value = EXCHANGE, type = "topic", durable = "true", ignoreDeclarationExceptions = "true"), key = "routingKeyA")) 
public String myListenerA(@Payload PayloadA payload, @Header(AmqpHeaders.CORRELATION_ID) byte[] correlationId) { 

    return SUCCESS_RESPONSE; 
} 

MyListener B

@RabbitListener(bindings = @QueueBinding(value = @Queue(value = QUEUE, durable = "true"), exchange = @Exchange(value = EXCHANGE, type = "topic", durable = "true", ignoreDeclarationExceptions = "true"), key = "routingKeyB")) 
public String myListenerB(@Payload PayloadB payload, @Header(AmqpHeaders.CORRELATION_ID) byte[] correlationId) { 

    return SUCCESS_RESPONSE; 
} 

追加情報:私は、このキューで20人の消費者を持っています。 Thxで事前に!

答えて

1

このようにRabbitMQは機能しません。 JMSとは異なり、(例えば、ルーティングキーに基づいて)キューからメッセージを選択する方法はありません。

これまで行ってきたことは、2つの異なるルーティングキーを使用して同じキューに入れ替えられました。したがって、どちらのリスナーも、どのようにキューに入ったかに関係なく、メッセージを取得します。

RabbitMQでは、リスナーごとに別々のキューが必要です。プロデューサがエクスチェンジにパブリッシュすると、ブローカは使用したルーティングキーに基づいてメッセージを正しいキューにルーティングします。

各リスナーのインスタンスが複数ある場合は、それに応じてメッセージが配信されます(キューごとに1つの配信のみ)。

+0

大変ありがとうございます。あなたのアンカーはとても役に立ちました。 – stritzi

+0

問題ありません。私はあなたが新しいここにいるのを見ます。ここでは、「受け入れられた」(投票ボタンの下にあるチェックマーク/チェックマークをクリック)というマークを付けるのが通例です。これは、同様の質問に対する回答を探すときに他の人を助けるでしょう。 –

+0

ありがとうございました。確かに私はここでもっと活発にしようとしています!また、本当に私を助けてくれたstackoverflowに関する他の質問をお寄せいただきありがとうございます。 – stritzi

関連する問題