像Java Client这样的MQ Client如何侦听来自运行ServerConn Channel的MQ Server的消息

时间:2019-03-03 16:25:27

标签: jms ibm-mq

我正在寻找有关将新消息放在MQ队列或主题上时IBM MQ Client或侦听器如何从MQ Server获取消息的详细描述。

  1. 如何在MQ Client和MQ Server之间建立连接?
  2. MQ Client是启动与服务器的连接还是服务器启动与其使用方的连接?
  3. 如果我们在MQ客户端上定义了连接池,那么当服务器上的消息不断增加时,客户端如何知道它必须与服务器创建更多的连接?客户端如何了解服务器上的消息?
  4. 服务器与客户端之间是否存在通信,通知客户端新消息已到达?

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

如果有人可以向我指出正确的方向或说明文件,那就太好了。

2 个答案:

答案 0 :(得分:1)

由于IBM WebSphereMQ客户端和服务器是封闭源代码,因此很难确切地说出它们是如何工作的,但是根据我在其他消息传递实现中的经验,我可以提供一个一般性的解释。

客户端启动JMS连接到服务器。 JMS客户端使用javax.jms.ConnectionFactory创建javax.jms.Connection,这是客户端和服务器之间的连接。

通常,当客户端使用池时,池要么“急切地”填充(这意味着在初始化池以将其填充到特定级别时会创建一定数量的连接),要么“懒惰地”填充(这意味着池当客户端从池中请求连接时,连接被一对一填充)。如果客户端请求池中的连接,并且正在使用池中的所有连接,并且尚未达到池所允许的最大连接大小,则将创建另一个连接。如果池已达到其最大允许大小(即无法创建更多连接),则请求连接的客户端将必须等待另一个客户端将其连接返回至池,此时该池将把它交给等待中的客户端客户。

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

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

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

答案 1 :(得分:0)

您应该做的第一件事是参加有关JMS / IBM MQ的课程,或者参加名为Integration Technical Conference

的新IBM会议。

好,现在您的问题:

  
      
  1. 如何在MQ Client和MQ Server之间建立连接?
  2.   

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

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

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

  
      
  1. 如果我们在MQ客户端上定义了连接池,那么当服务器上的消息不断增加时,客户端如何知道它必须与服务器创建更多的连接?客户端如何了解服务器上的消息?
  2.   

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

  
      
  1. 服务器与客户端之间是否存在通信,通知客户端新消息已到达?
  2.   

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

再次,强烈建议对JMS / IBM MQ的使用进行一些培训。