首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >消息监听器和jmslistener注释有什么不同?

消息监听器和jmslistener注释有什么不同?
EN

Stack Overflow用户
提问于 2020-08-02 03:21:42
回答 1查看 815关注 0票数 0

所以我更深入地研究了JMS的世界。我现在正在写一些虚拟项目,并了解如何使用消息。我使用Active MQ artemis作为消息代理。

在学习教程的过程中,我偶然发现了一些关于消费消息的东西。消息侦听器监听消息和使用@JmsListener注释到底有什么区别?

这就是我到目前为止所知道的:

代码语言:javascript
复制
public class Receiver {

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

代码语言:javascript
复制
@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();
    }
}

代码语言:javascript
复制
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用于异步消费来自队列/主题的消息,而使用@JmsListener注释用于同步侦听消息?

此外,还有一些其他的ListenerContainerFactory,比如DefaultJmsListenerContainerFactorySimpleJmsListenerContainerFactory,但我不确定我是否了解其中的区别。我正在阅读https://codenotfound.com/spring-jms-listener-example.html,从我收集的信息来看,默认使用拉模型,这表明它是异步的,那么为什么我们通过messageListener或注释使用消息又有什么关系呢?我有点困惑和困惑,所以我希望我的疑惑能被澄清。谢谢!

这是发送100条虚拟消息时的程序片段(只是注意到它没有输出偶数消息..):

代码语言:javascript
复制
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.'.
EN

回答 1

Stack Overflow用户

发布于 2020-08-02 13:28:03

以下配置

代码语言:javascript
复制
@Configuration
@EnableJms
public class ReceiverConfig {

//your config code here..

}

将确保每次在名为"helloworld .q"的目的地上接收到消息时,都会使用消息的内容调用Receiver.receive()

你可以在这里阅读更多内容:https://docs.spring.io/spring/docs

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63209191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档