2017-08-23 10 views
1

生JMSコード:スプリングjmsは永続的トピックリスナー間でメッセージをどのように配布しますか?

TopicSubscriber durSubscriber1 = receiverSession.createDurableSubscriber(topic,"subscription_1"); 
durSubscriber1.setMessageListener(new MessageListener() { 
    @Override 
    public void onMessage(Message message) { 

     RMQTextMessage rmqTextMessage = ((RMQTextMessage) message); 
     try { 
      System.out.println("sub_1:" + rmqTextMessage.getText()); 
     } catch (JMSException e) { 
      e.printStackTrace(); 
     } 

    } 
}); 


TopicSubscriber durSubscriber2 = receiverSession.createDurableSubscriber(topic,"subscription_2"); 
    durSubscriber2.setMessageListener(new MessageListener() { 
     @Override 
     public void onMessage(Message message) { 

      RMQTextMessage rmqTextMessage = ((RMQTextMessage) message); 
      try { 
       System.out.println("sub_2:" + rmqTextMessage.getText()); 
      } catch (JMSException e) { 
       e.printStackTrace(); 
      } 

     } 
}); 

私は次のコードを使用すると、各リスナーがすべてのメッセージを取得します。同じサブスクリプション名を使用すると、アプリケーションが起動しません。

IがばねJMSを使用するコードを書いた別の手から:

設定:

@Bean 
public JmsListenerContainerFactory<?> myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) { 
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
    // This provides all boot's default to this factory, including the message converter 
    configurer.configure(factory, connectionFactory); 
    // You could still override some of Boot's default if necessary. 
    factory.setPubSubDomain(true); 
    factory.setSubscriptionDurable(true); 
    return factory; 
} 

リスナー:

@JmsListener(destination = "my_topic_new", containerFactory = "myFactory") 
public void receiveTopic(Email email) { 
    System.out.println("list_1:" + email); 
} 

@JmsListener(destination = "my_topic_new", containerFactory = "myFactory") 
public void receiveTopicDup(Email email) { 
    System.out.println("list_2:" + email); 
} 

この場合では、両方のリスナーがメッセージを分割します。つまり、プロデューサが10個のメッセージを送信すると、listener_1はN個のメッセージを、listener_2はM個のメッセージを取得します。
M + N = 10

2つのコードスニペットで違いを説明してください。 spring-jmsバージョンに対応するjmsコードを提供できますか?

答えて

1

これは、ウサギのJMSクライアントがJMSをネイティブのAMQPにマッピングする方法によるものです。各リスナーにサブスクリプション名を与える必要があります。それ以外の場合は、同じキュー内のメッセージを競合します。

@JmsListener(destination = "my_topic_new", containerFactory = "myFactory", subscription = "foo") 
public void receiveTopic(String email) { 
    System.out.println("list_1:" + email); 
} 

@JmsListener(destination = "my_topic_new", containerFactory = "myFactory", subscription = "bar") 
public void receiveTopicDup(String email) { 
    System.out.println("list_2:" + email); 
} 

これは、恒久サブスクリプションにのみ必要です。

関連する問題