MQ 客户端如何像 Java 客户端一样侦听来自运行 ServerConn 通道的 MQ 服务器的消息



我正在寻找有关当新消息放置在 MQ 队列或主题上时 IBM MQ 客户机或侦听器如何从 MQ 服务器获取消息的详细描述。

  1. MQ 客户端和 MQ 服务器之间的连接是如何创建的?
  2. MQ 客户机是启动与服务器的连接,还是服务器启动与其使用者的连接?
  3. 如果我们在 MQ 客户端上定义了连接池,客户端如何知道随着服务器上消息的增加,它必须与服务器创建更多连接?客户端如何知道服务器上的消息?
  4. 是否有从服务器到客户端的通信,告诉客户端新消息已到达?

我正在寻找这些详细信息,而不是有关如何设置或如何设置 MQ 通道或侦听器的详细信息。我正在寻找它在幕后的工作方式。

如果有人能为我指出正确的方向或文档,那就太好了。

很难明确地谈论IBM WebSphereMQ客户端和服务器是如何工作的,因为它们是闭源的,但根据我使用其他消息传递实现的经验,我可以提供一个一般的解释。

JMS 连接由客户机与服务器启动。JMS 客户机使用javax.jms.ConnectionFactory来创建客户机和服务器之间的连接javax.jms.Connection

通常,当客户端使用池时,池要么">

急切"填满(这意味着在初始化池以将其填充到某个级别时会创建一定数量的连接),要么是"懒惰"(这意味着当客户端从池中请求连接时,池中逐个填充连接)。如果客户端从池请求连接,并且正在使用池中的所有连接,并且尚未达到池允许的最大连接大小,则将创建另一个连接。如果池已达到其允许的最大大小(即无法创建更多连接),则请求连接的客户端将不得不等待另一个客户端将其连接返回到池,此时池将把它提供给等待的客户端。

JMS 客户端可以通过几种不同的方式查找服务器上的消息。

如果 JMS 客户端希望偶尔向服务器询问它在特定队列上的消息,它可以创建一个javax.jms.Consumer并使用receive()方法。此方法可以永远等待消息到达队列,也可以采用超时参数,以便在消息未在指定的超时内到达时,将返回对receive()的调用。

如果 JMS 客户端希望在消息到达队列后立即从特定队列接收消息,那么它可以创建一个javax.jms.MessageListener实现并将其注册到队列中。当这样的侦听器在队列上注册时,当消息到达队列时,服务器会将消息发送到侦听器。这有时称为"回调",因为服务器正在"回调"客户端。

你应该做的第一件事是参加JMS/IBM MQ课程,或者参加新的IBM会议,称为:集成技术会议

好的,现在回答您的问题:

  1. MQ 客户端和 MQ 服务器之间的连接是如何创建的?

您只需发出 QueueConnectionFactory 类的 createQueueConnection 方法并指定凭据。

QueueConnection conn = cf.createQueueConnection("myUserId", "myPwd");
  1. MQ 客户端是启动与服务器的连接,还是服务器启动与其使用者的连接?

MQ 客户机应用程序始终启动连接。

  1. 如果我们在 MQ 客户端上定义了连接池,客户端如何知道随着服务器上消息的增加,它必须与服务器创建更多连接?客户端如何知道服务器上的消息?

由团队的架构师或首席开发人员来了解消息流和消息模式。 因此,他们将知道将池计数设置在什么位置。 此外,也有很多很多测试。 某些客户端应用程序只需要池计数 10,而其他应用程序可能需要池计数 50,因为它是繁重的流。

  1. 服务器到客户端是否有通信告诉客户端新消息已到达?

使用 QueueSession 类的 createReceiver 方法来检索消息。 为 createReceiver 方法设置超时值,而不是连续轮询队列管理器。

同样,强烈建议进行一些关于使用 JMS/IBM MQ 的培训。

最新更新