【问题标题】:Spring JMS Subscriber not able to receive message?Spring JMS 订阅者无法接收消息?
【发布时间】:2014-01-09 10:15:47
【问题描述】:

我正在使用 Spring JMS 和 Web Sphere Default Messaging Provider 来满足我的消息传递需求。 我在 WAS 上创建了一个主题和连接工厂。

我可以使用来自我的发布者的JMSTemplate 向主题发送消息。

但是每当我在我的订阅者中调用 JmsTemplate.receive() 时,它都会进入等待状态,我无法在订阅者中接收消息。

但是,如果将侦听器用作订阅者,或者在我使用发布者发布消息时启动新线程,我可以使用 JmsTemplate 在订阅者中接收消息。

寻求帮助!

【问题讨论】:

    标签: java spring jms


    【解决方案1】:

    消息不存储在主题中。如果您创建发布者,发送消息然后启动订阅者,则不会订阅任何消息。在发布时,如果有任何订阅者订阅了该主题,那么只有那些订阅者会收到消息。如果不存在订阅者,则消息将被丢弃。

    它进入等待状态,这意味着它正在等待来自 JMS 服务器的消息,并且当前没有可用的消息。

    无论您使用何种订阅模式 - 异步(MessageListener)或同步(接收)您都需要先创建订阅者。

    你可以使用

    subscriber.receive(long timeout);
    

    如果您不想无限期地等待。

    【讨论】:

    • 所以如果我们在同步模式下使用Spring JMS,那么在发布者发布到Topic之前,我们需要在订阅者中调用JmsTemplate.receive()。是这样吗?所以这里我们的订阅者将在一个单独的线程中等待,然后我们的订阅者在另一个线程中而不是发布者。是这样吗 ?如果我错了,请纠正。
    • 是的!订阅者将只订阅在它生效后发布的消息。除非它是一个持久的订阅者。在持久订阅者的情况下,即使它处于离线状态,它也会在重新在线时收到所有错过的消息。
    • 非常感谢 Aniket !因此,如果我们将 Spring JMS (Synch.) 与非持久订阅者一起使用,那么我们可能无法在 SINGLE THREAD 中实现发布者和订阅者。我的意思是我无法做到这一点。是吗?期待您的指导!
    • 不,您不能在与发布者和异步非持久订阅者的单线程中。因为您运行订阅者的方式可能是在无限while循环中调用receive(),并且必须在您发布消息之前。
    • 感谢 Aniket,您的信息真的很有帮助!!如果我只是在没有任何第三方代理(如 Actice MQ)的情况下使用 SpringJMS,并且想要为同步和异步两种情况创建持久订阅者,那么我必须进行哪些配置。有链接吗?
    猜你喜欢
    • 2017-11-08
    • 2018-08-14
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多