В чем разница между слушателями сообщений и аннотацией jmslistener - PullRequest
0 голосов
/ 01 августа 2020

Итак, я углубляюсь в мир JMS. Я сейчас пишу несколько фиктивных проектов и понимаю, как потреблять сообщения. Я использую Active MQ artemis в качестве брокера сообщений.

Следуя руководству, я наткнулся на кое-что, касающееся потребления сообщений. В чем именно разница между прослушивателем сообщений для прослушивания сообщений и использованием аннотации @JmsListener?

Это то, что у меня есть:

public class Receiver {

  @JmsListener(containerFactory = "jmsListenerContainerFactory", destination = "helloworld .q")
  public void receive(String message) {
      System.out.println("received message='" + message + "'.");
  }
}
@Configuration
@EnableJms
public class ReceiverConfig {

    @Value("${artemis.broker-url}")
    private String brokerUrl;

    @Bean
    public ActiveMQConnectionFactory activeMQConnectionFactory(){
        return new ActiveMQConnectionFactory(brokerUrl);
    }

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(){
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(activeMQConnectionFactory());
        factory.setConcurrency("3-10");

        return factory;
    }

    @Bean
    public DefaultMessageListenerContainer orderMessageListenerContainer() {
        SimpleJmsListenerEndpoint endpoint =
                new SimpleJmsListenerEndpoint();
        endpoint.setMessageListener(new StatusMessageListener("DMLC"));
        endpoint.setDestination("helloworld.q"); //Try renaming this and see what happens.

        return jmsListenerContainerFactory()
                .createListenerContainer(endpoint);
    }

    @Bean
    public Receiver receiver() {
        return new Receiver();
    }
}
public class StatusMessageListener implements MessageListener {

    public StatusMessageListener(String dmlc) {
    }

    @Override
    public void onMessage(Message message) {
        System.out.println("In the onMessage().");
        System.out.println(message);
    }
}

Из того, что я читал, это то, что мы регистрируем слушателя сообщений в слушателе контейнера, который, в свою очередь, создается фабрикой слушателей. По сути, поток таков: DefaultJmsListenerContainerFactory -> создает -> DefaultMessageListenerContainer -> регистрирует прослушиватель сообщений, который используется для прослушивания сообщений от настроенной конечной точки. Из своего исследования я понял, что messageListeners используются для асинхронного потребления сообщений из очередей / topi c, в то время как аннотация @JmsListener используется для синхронного прослушивания сообщений?

Кроме того, есть несколько другие ListenerContainerFactory, такие как DefaultJmsListenerContainerFactory и SimpleJmsListenerContainerFactory, но не уверен, что я понимаю разницу. Я читал https://codenotfound.com/spring-jms-listener-example.html, и из того, что я понял из этого, по умолчанию используется модель извлечения, поэтому она предполагает asyn c, так что какое значение имеет, потребляем ли мы сообщение через messageListener или аннотация? Я немного запутался и запутался, поэтому хотел бы, чтобы мои сомнения развеялись. Спасибо!

Это фрагмент программы при отправке 100 фиктивных сообщений (только что заметил, что она не выводит четные сообщения ..):

received message='This the 95 message.'.
In the onMessage().
ActiveMQMessage[ID:006623ca-d42a-11ea-a68e-648099ad9459]:PERSISTENT/ClientMessageImpl[messageID=24068, durable=true, address=helloworld.q,userID=006623ca-d42a-11ea-a68e-648099ad9459,properties=TypedProperties[__AMQ_CID=00651257-d42a-11ea-a68e-648099ad9459,_AMQ_ROUTING_TYPE=1]]
received message='This the 97 message.'.
In the onMessage().
ActiveMQMessage[ID:006ba214-d42a-11ea-a68e-648099ad9459]:PERSISTENT/ClientMessageImpl[messageID=24088, durable=true, address=helloworld.q,userID=006ba214-d42a-11ea-a68e-648099ad9459,properties=TypedProperties[__AMQ_CID=0069cd51-d42a-11ea-a68e-648099ad9459,_AMQ_ROUTING_TYPE=1]]
received message='This the 99 message.'.

1 Ответ

0 голосов
/ 02 августа 2020

Следующая конфигурация

@Configuration
@EnableJms
public class ReceiverConfig {

//your config code here..

}

гарантирует, что каждый раз, когда сообщение получено на Назначение с именем "helloworld .q", Receiver.receive() вызывается с содержимым сообщения.

Вы можете прочитать здесь: https://docs.spring.io/spring/docs

...