我在理解IBM MQ时遇到了困难。
我想编写一个只向队列发送消息的客户端。根据我的理解,我认为我不需要为该场景使用频道。我的来源是这本书:http://www.redbooks.ibm.com/abstracts/redp0021.html
但是当我尝试连接到队列时,我收到错误代码
2540 (09EC) (RC2540): MQRC_UNKNOWN_CHANNEL_NAME
这是我的示例代码,它将使用上面提到的错误代码捕获异常:
@Test
public void init() throws InitializationException {
MqConfigurationData mqConfigurationData = confManager.getUserConfig().getMqConfigurationData();
MQEnvironment.hostname = mqConfigurationData.getHostname();
MQEnvironment.port = new Integer(mqConfigurationData.getPort());
try {
MQQueueManager mqQueueManager = new MQQueueManager(mqConfigurationData.getQueueManager());
} catch (MQException e) {
throw new InitializationException(ApiExceptionId.INIT_MQ_CONFIGURATION, e.getMessage());
}
}
所以我的问题是:即使在仅限客户端的情况下,我是否还需要一个频道?
答案 0 :(得分:2)
如果您的应用程序在与您想要连接的队列管理器相同的服务器上执行,则不需要连接的通道,在这种情况下,应用程序将使用Bindings模式连接IPC。
如果您想通过网络连接到队列管理器(在不同的服务器上,甚至是同一台服务器上),那么您执行需要一个要连接的通道,在这种情况下应用程序将连接在使用TCP / IP的客户端模式下。
有关两种连接模式的详细信息,请参阅知识中心页面“Using IBM MQ classes for Java”。
在您的示例中,您通过指定MQEnvironment.hostname
和MQEnvironment.port
表示您要使用客户端连接模式。如果队列管理器上不存在MQRC_UNKNOWN_CHANNEL_NAME
通道,则会出现错误SVRCONN
。由于您未指定MQEnvironment.channel
,因此Java MQ应用程序类可能尝试使用不存在的NULL通道名称进行连接。
请注意,根据v9.0知识中心页面“Using IBM MQ classes for Java”,IBM MQ Classes for Java已在功能上稳定在IBM MQ V8.0中提供的级别。
IBM将不再对Java MQ Java类进行进一步的增强 它们在功能上稳定在IBM MQ中提供的级别 版本8.0。
建议将IBM MQ Classes for JMS用于新开发的应用程序。