簡體   English   中英

消息監聽器和 jmslistener 注解有什么區別

[英]Whats the difference between message listeners and jmslistener annotation

因此,我正在深入研究 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 -> 注冊一個消息偵聽器,用於偵聽來自配置的端點的消息。 根據我的研究,我收集到 messageListener 用於異步使用來自隊列/主題的消息,而使用@JmsListener注釋用於同步收聽消息?

此外,還有一些其他的ListenerContainerFactory ,例如DefaultJmsListenerContainerFactorySimpleJmsListenerContainerFactory但不確定我是否明白其中的區別。 我正在閱讀https://codenotfound.com/spring-jms-listener-example.html並且從我收集的內容來看,默認使用拉 Z20F35E630DAF44DBFA4C3F68F5399D8 那么我們建議使用消息時為什么會這么說?通過 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.'.

以下配置

@Configuration
@EnableJms
public class ReceiverConfig {

//your config code here..

}

將確保每次在名為"helloworld.q"的目標上收到消息時,都會使用消息的內容調用Receiver.receive()

您可以在此處閱讀更多信息: https://docs.spring.io/spring/docs

暫無
暫無

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

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