Java 客户端是否一直连接到消息队列中的消息调度程序?

Java 客户端是否一直连接到消息队列中的消息调度程序?,java,jakarta-ee,tcp,jms,message-queue,Java,Jakarta Ee,Tcp,Jms,Message Queue,我想我理解MOM或消息队列背后的想法,但我不确定以下实现细节。 由于有一个元素充当调度器,因此它必须具有到所有客户机的持久TCP连接(因为可靠性是一项要求)。 因此,对于N客户端,我们始终会打开N(N为任意高)连接,即使当前没有通信。 这是正确的吗? 流行框架的健壮实现是如何处理这一问题的?假设客户机希望实时接收消息,那么是的,需要与JMS服务器建立一个活动且持续的连接 独立JMS客户端使用专用连接,因此1个客户端=1个连接。另一方面,在应用服务器内部运行的消息驱动bean重用来自池的连接和会话

我想我理解
MOM
消息队列
背后的想法,但我不确定以下实现细节。
由于有一个元素充当调度器,因此它必须具有到所有客户机的持久TCP连接(因为可靠性是一项要求)。 因此,对于
N
客户端,我们始终会打开
N
(N为任意高)连接,即使当前没有通信。
这是正确的吗?

流行框架的健壮实现是如何处理这一问题的?

假设客户机希望实时接收消息,那么是的,需要与JMS服务器建立一个活动且持续的连接

独立JMS客户端使用专用连接,因此1个客户端=1个连接。另一方面,在应用服务器内部运行的消息驱动bean重用来自池的连接和会话对象,该池通常可在应用服务器中配置以限制这些对象的数量,然而,连接“持续”连接到JMS服务器;在应用程序服务器中实现的方式因产品而异。因此,在应用服务器中,如果您有20个MDB的消费消息,但将池配置为最多使用10个连接,则可以确保只打开10个连接

非活动连接
队列客户端不必连接到服务器,但消息将在队列上累积,当客户端连接时,所有消息将按顺序传递

连接已断开
如果连接已断开,则客户端(或容器;而不是JMS服务器)必须在再次使用消息之前重新连接

您是否关心到JMS服务器的连接数? 您指的是独立JMS客户端还是MDB?

如果您有n个客户端,那么您有n个连接

还有其他可能:如果您使用JNDI查找了队列/连接工厂等,那么还有另一个到JNDI端口和RMI注册表的连接(使用JBoss 6观察)

另一方面,如果消息服务器在TCP套接字上使用
select()
,那么只使用一个线程处理大量连接是非常有效的。关于连接/套接字的数量,请看以下问题:

我不知道使用UDP(包括可靠性)的JMS实现。所以 您无法真正解决这个问题,因为JMS使用TCP特性进行可靠和“有序”的数据包传递

  • 例如,如果延迟不是问题,客户机可以随时“连接、读取、断开连接”

  • 至于ActiveMQ,它提供UDP传输,请参阅。在这种情况下,由您来处理可靠性问题

  • >P>如果您对连接/客户端的数量有顾虑,您可以考虑“原始UDP”作为自己的协议。

相关:

可能是我缺少一些背景知识,我无法理解您的答案。
应用程序服务器通常使用JMS连接池来提高效率并最小化连接
您的意思是通常客户端连接到应用程序服务器,应用程序服务器连接到消息队列调度程序?否则我无法理解如何重用连接?此外,这种设计在所有实现中都是相同的吗?例如ActiveMQ、RabbitMQ等?我主要询问的是独立JMS客户机。所以
X
客户机意味着
X
连接,当客户机上升时,连接也上升。这通常是如何解决的。我假设越来越多的客户端(即连接数)必须以某种方式寻址,对吗?+1有趣。
如果消息服务器在TCP套接字上使用select(),这是非常有效的
。我不明白这一点。这(选择<代码>与服务器的资源有关,而不是与连接数有关)。那么你为什么要提到这一点呢?我添加了它,以防你担心服务器的性能,如果它必须处理大量连接(CPU时间、线程数)。如果你只是担心打开的插座的数量,我已经更新了答案。因此:在考虑替代方案之前,您可以测试JMS是否足够快,即使有大量连接。