【问题标题】:Whats the difference between message listeners and jmslistener annotation消息监听器和 jmslistener 注解有什么区别
【发布时间】:2020-08-01 19:21:42
【问题描述】:

所以我正在深入研究 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,从我收集的信息来看,默认使用拉模型,因此表明它是异步的,那么如果我们通过 messageListener 或注释来使用消息,为什么会有关系呢?我有点困惑和困惑,所以希望我的疑虑能够被清除。谢谢!

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

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.'.

【问题讨论】:

  • 所以本质上是一样的?
  • 您应该修改您的问题,以便清楚地表明您是在专门询问 Spring JMS 资源而不是普通 JMS 资源。 javax.jms.MessageListener(其行为在 JMS 规范中概述)与 Spring 围绕它的各种包装器不同。

标签: java spring-jms


【解决方案1】:

如下配置

@Configuration
@EnableJms
public class ReceiverConfig {

//your config code here..

}

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

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

【讨论】:

    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多