我正在寻找有关在MQ队列或主题上放置新消息时IBM MQ客户机或侦听器如何从MQ Server获取消息的详细说明。
我正在寻找这些细节,而不是关于如何设置或如何设置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课程或者参加名为:Integration Technical Conference的新IBM会议
好的,现在回答你的问题:
- 如何创建MQ Client和MQ Server之间的连接?
您只需发出QueueConnectionFactory类的createQueueConnection方法并指定凭据。
QueueConnection conn = cf.createQueueConnection("myUserId", "myPwd");
- MQ Client是否启动与Server的连接,或者服务器是否启动与其使用者的连接?
MQ客户端应用程序始终启动连接。
- 如果我们在MQ客户端上定义了连接池,那么客户端如何知道它必须与服务器建立更多连接,因为服务器上的消息正在增加?客户如何了解服务器上的消息?
由团队的架构师或首席开发人员来理解消息流和消息模式。因此,他们将知道如何设置池数。此外,还有很多很多测试。某些客户端应用程序只需要池数为10,而其他应用程序可能需要池数为50,因为它是一个大流量。
- 是否存在从服务器到客户端的通信,告知客户新消息已到达?
您使用QueueSession类的createReceiver方法来检索消息。为createReceiver方法设置超时值,而不是连续轮询队列管理器。
同样,强烈建议对JMS / IBM MQ的使用进行一些培训。