Ibm mq 如何从一个Java客户端访问多个MQ服务器端点

Ibm mq 如何从一个Java客户端访问多个MQ服务器端点,ibm-mq,Ibm Mq,我希望我的Java MQ客户端能够访问(执行puts)多个MQ服务器端点(所谓端点,我指的是“主机/端口/Qmanager/队列/通道”)。基本上,这个Java应用程序将收到一个请求,请求将消息和端点细节与请求一起放置。它应该能够找到端点对应的连接池,并使用它来执行put。 根据我目前有限的理解,MQEnvironment是一种全局配置(一个JVM中只能有一个),一次可以配置到一个端点。因此,如果想法是多个线程并行访问多个MQserver端点,那么按照目前的理解,这似乎是不可实现的 在创建到队列

我希望我的Java MQ客户端能够访问(执行puts)多个MQ服务器端点(所谓端点,我指的是“主机/端口/Qmanager/队列/通道”)。基本上,这个Java应用程序将收到一个请求,请求将消息和端点细节与请求一起放置。它应该能够找到端点对应的连接池,并使用它来执行put。
根据我目前有限的理解,MQEnvironment是一种全局配置(一个JVM中只能有一个),一次可以配置到一个端点。因此,如果想法是多个线程并行访问多个MQserver端点,那么按照目前的理解,这似乎是不可实现的

在创建到队列管理器的连接时,还可以使用哈希表传递连接参数。例如:

  Hashtable<String, Object> properties;
  properties = new Hashtable<String, Object>();
  properties.put("hostname", "remotehost");
  properties.put("port", new Integer(1414));
  properties.put("channel", "REMOTEQM.SVRCONN");
  MQQueueManager queueManager = new MQQueueManager(queueManagerName, properties);
哈希表属性;
属性=新哈希表();
properties.put(“主机名”、“远程主机”);
put(“端口”,新整数(1414));
properties.put(“channel”、“REMOTEQM.SVRCONN”);
MQQueueManager queueManager=新的MQQueueManager(queueManager名称,属性);

在创建到队列管理器的连接时,还可以使用哈希表传递连接参数。例如:

  Hashtable<String, Object> properties;
  properties = new Hashtable<String, Object>();
  properties.put("hostname", "remotehost");
  properties.put("port", new Integer(1414));
  properties.put("channel", "REMOTEQM.SVRCONN");
  MQQueueManager queueManager = new MQQueueManager(queueManagerName, properties);
哈希表属性;
属性=新哈希表();
properties.put(“主机名”、“远程主机”);
put(“端口”,新整数(1414));
properties.put(“channel”、“REMOTEQM.SVRCONN”);
MQQueueManager queueManager=新的MQQueueManager(queueManager名称,属性);

您可能不太了解MQ,或者您的MQ环境设置不正确


您的MQ应用程序应该连接(并保持连接)到单个队列管理器。MQ环境中的队列管理器应相互连接,以便当MQ应用程序将一条消息发送给另一个队列管理器时,本地队列管理器(应用程序所连接到的队列管理器)将消息路由到正确的队列管理器。

您可能不太了解MQ,或者您的MQ环境设置不正确


您的MQ应用程序应该连接(并保持连接)到单个队列管理器。MQ环境中的队列管理器应相互连接,以便当MQ应用程序将消息发送到另一个队列管理器时,本地队列管理器(应用程序连接到)将消息路由到正确的队列管理器。

非常感谢,您关于存储哈希表键值对并将其传递给QMqnager构造函数的建议——奏效了!一个后续问题:如果多个线程为QManager创建自己的哈希表并使用它,那么连接池是如何工作的?是否存在一个特定于端点的ConnectionManager,它被传递给QManager构造函数()。MQ Java客户端不提供连接池。您需要实现连接池。连接池功能通常由J2EE容器实现。如果队列管理器互连对您来说是可能的,那么值得考虑下面@Roger建议的解决方案。我在这里看到com.ibm.mq.MQSimpleConnectionManager的实现和示例:。我计划使用它,但不确定这在多端点场景中如何工作(因为连接池现在需要特定于端点),如上所述。我错过什么了吗?线程池可以由J2EE容器或自定义来处理。连接池肯定由版本7.5中的MQ Classes for Java支持。我相信它早就被添加了。它在6.xFound版本中不存在,并且验证了@Shashi的解决方案不仅适用于自定义属性,而且也适用于自定义连接池。从某种意义上说,不同的连接池可以传递给不同的“new MQManager(…)”调用,并且它们都可以并发工作。感谢Shashi完美地理解了这个问题并提出了正确的解决方案:)。非常感谢Shashi,您关于存储哈希表键值对并将其传递给QMqnager构造函数的建议-成功了!一个后续问题:如果多个线程为QManager创建自己的哈希表并使用它,那么连接池是如何工作的?是否存在一个特定于端点的ConnectionManager,它被传递给QManager构造函数()。MQ Java客户端不提供连接池。您需要实现连接池。连接池功能通常由J2EE容器实现。如果队列管理器互连对您来说是可能的,那么值得考虑下面@Roger建议的解决方案。我在这里看到com.ibm.mq.MQSimpleConnectionManager的实现和示例:。我计划使用它,但不确定这在多端点场景中如何工作(因为连接池现在需要特定于端点),如上所述。我错过什么了吗?线程池可以由J2EE容器或自定义来处理。连接池肯定由版本7.5中的MQ Classes for Java支持。我相信它早就被添加了。它在6.xFound版本中不存在,并且验证了@Shashi的解决方案不仅适用于自定义属性,而且也适用于自定义连接池。从某种意义上说,不同的连接池可以传递给不同的“new MQManager(…)”调用,并且它们都可以并发工作。感谢Shashi完美理解问题并提出正确的解决方案:)。感谢您的回复,我想我需要进一步澄清我的要求。消息并不意味着要广播到多个队列。但是每条消息都有一个唯一的队列端点作为目的地,Java应用程序必须将消息路由到正确的队列端点。我的评论是关于点对点的消息传递。您似乎正在创建一个小型MessageBroker应用程序,即