2012-11-14 44 views
2

我有一个简单的场景,其中发布者(我的Java应用程序)发布关于主题 消息。 50个客户端对同一JMS topic.As订阅一旦消息在主题发布的,所有的50用户将被告知 .Say只有一个用户(0UT 0F 50)处理消息并处理后发送确认 。(一旦客户端处理完成后,我可以看到该消息所消耗 apache的MQ控制台上。否则,如果没有客户端接收消息 我看到这条消息是未决的消息)之后发送确认。一旦客户确认它,JMS主题的消息可用性?

现在的问题是,一旦任何客户端发送确认和任何 新的客户端订阅的话题,他会收到该消息?或它的工作原理的方式,其中的消息一直 由任何客户端(其内部是指确认已经通过任何客户端的发送)消耗时,没有进一步的通知将是 发送到任何新的用户和消息将从被取下的主题(这是我遇到的behaviuor,但看起来像 它不应该以这种方式按按发布/ http://en.wikipedia.org/wiki/Java_Message_Service下订阅模式工作)?

回答

3

我还没有与Apache MQ工作。但总的来说:

在发布/订阅模式,当消息公布后,所有的用户都会收到刊物。

确认由用户只对短信提供商,而不是出版商。当订户确认收到消息时,消息提供商将删除该消息,以便消息不会再次传送。

如果一个新的用户进来的消息是在一个主题发布后,那么该用户将无法获得该出版物。有关该主题的任何新出版物都将由订户接收。某些提供程序(如IBM WebSphere MQ)具有名为“保留发布”的功能,其中缓存了发布的副本。发布后出现的任何新订阅者都将收到此缓存出版物。当主题的发布之间存在时间延迟时,保留发布功能非常有用,新订阅者将立即获取缓存发布,而不是等待发布者创建新发布。

+0

谢谢Shashi。正如您所说的当用户确认接收到消息时,该消息将被消息传递提供程序删除,以便消息不会再次传递。这意味着消息将在任何订户收到确认后立即删除。要删除该消息,所有订户都不需要确认。只有一个确认就足够了? –

+0

不。它通常取决于消息传递提供者的实现。供应商可能为每个订户创建临时队列,并将发布副本放到该队列中。一旦订阅者收到该消息,提供者就从队列中删除该消息。在这种情况下,每个用户都承认。某些提供商可能不会使用队列,并且只有在用户列表中的最后一位用户确认后才会删除该消息。 – Shashi

+0

Atleast至少在活动MQ的情况下,我的观察是活动MQ UI控制台显示消息收到第一个确认后即被使用。我希望当控制台将消息显示为已消耗时,这意味着消息已从主题中删除(因为如果新订阅者订阅,他不再获取已消耗的消息)。但是我没有在网上获得任何内容来确认它? –