1

参考:官方 GlassFish 4.0 文档/javaee-tutorial Java EE 7

首先,让我们从目标类型开始:主题。根据 GlassFish 4.0 教程,“<strong> 46.4 编写高性能和可扩展的 JMS 应用程序”部分:

本节介绍如何使用 JMS API 编写能够稳健地处理大量消息的应用程序。

在“<strong> 46.4.2 使用共享持久订阅”小节中:

SharedDurableSubscriberExample.java 客户端展示了如何使用共享持久订阅。它展示了共享持久订阅如何将持久订阅的优点(当客户端不活动时订阅保持活动状态)与共享消费者的优点(消息负载可以在多个客户端之间分配)相结合。

当我们按照“<strong> 46.4.2.1 To Run the ShareDurableSubscriberExample and Producer Clients ”运行此示例时,它为我们提供了与前面关于目标类型队列示例相同的效果/功能:如果我们遵循“<strong> 46.2. 6.2 运行异步消费者和生产者客户端”,从第 5 点开始——并使用 2 个消费者终端窗口和 1 个生产者终端窗口稍微修改它。

是的,“<strong> 45.2.2.2 Publish/Subscribe Messaging Style ”部分确实提到:

JMS API 通过允许应用程序创建持久订阅,在一定程度上放宽了这一要求,这些订阅接收在消费者不活动时发送的消息。持久订阅提供了队列的灵活性和可靠性,但仍允许客户端向多个收件人发送消息。

.. 无论如何,“<strong> 46.4 编写高性能和可扩展的.. ”部分都是队列样式的示例——每个消费者一条消息:

添加到主题订阅的每条消息仅由一个消费者接收,类似于添加到队列的每条消息仅由一个消费者接收的方式。

什么是精确的技术答案:为什么在这个例子中,在主题上使用 Shared-Durable-Consumer 应该是,并在“<strong>高性能和可扩展 JMS 应用程序”与使用异步-队列中的消费者?

4

3 回答 3

2

我对同样的问题感到好奇,所以我发现了以下链接。我知道 John Ament 给了你正确的回应,也许它太短了,无法完全理解。

基本上,当您创建一个主题时,您假设只有订阅的消费者会收到它的消息。然而,处理这样的消息可能需要繁重的处理;在这种情况下,您可以根据需要使用尽可能多的线程来创建共享主题。

为什么不使用队列?答案很简单,如果你使用队列,只有一个消费者能够处理这样的消息。

为了澄清,我给你举个例子。假设联邦法院每天发布数千条句子,而您有三个不同的应用程序依赖于它。

应用程序 A 只是将句子复制到数据库中。应用程序 B 解析句子并尝试找出所有先前保存的句子周围的人之间的所有关系。应用程序 C 解析句子并尝试找出所有以前保存的句子周围的公司之间的所有关系。

您可以为句子使用主题,其中将订阅应用程序 A、B 和 C。但是很容易看出,应用程序 A 可以非常快速地处理消息,而应用程序 B 和 C 可能需要一些时间。一个可用的解决方案包括为应用程序 B 创建一个共享订阅,并为应用程序 C 创建另一个共享订阅,因此多个线程可以同时对它们中的每一个进行操作......

...当然还有其他解决方案,例如,您可以使用非共享主题(即常规主题)并将所有收到的消息发布到ArrayBlockingQueue稍后将由线程池处理的所有消息;然而,在这样的决定中,开发人员将是担心队列处理的人。

希望这能有所帮助。

于 2014-08-06T02:52:15.397 回答
0

JMS Queue :

  1. queued messages are persisted
  2. each message is guaranteed to be delivered once-and-only-once, even no consumer running when the messages are sent.

JMS Shared Subscription :

  1. subscription could have zero to many consumers
  2. if messages sent when there is no subscriber (durable or not), message will never be received.
于 2014-07-01T03:36:08.993 回答
0

这个想法是您可以在订阅中拥有多个读者。假设您有可用的线程,这使您可以更快地阅读更多消息。

于 2013-10-01T20:17:48.860 回答