与IBM MQ集群连接使用CCDT和Spring引导JmsTemplate的时候MQRC_UNKNOWN_ALIAS_BASE_Q

问题描述 投票:1回答:1

我一直在使用JMSListener + IBMConnectionFactory + CCDT用于连接IBM MQ集群Spring的引导程序。

一组以下连接属性: - URL指向生成CCDT文件 - 用户名(不需要密码,因为测试环境) - 的QueueManager名未被定义 - 因为它是集群的任务来决定,和一些谷歌搜索结果,包括一些计算器那些表明,在我的情况QMGR必须设置为空字符串。

当我的春天启动JMSListener尝试连接到队列中,会出现以下错误MQRC_UNKNOWN_ALIAS_BASE_Q:

2019-01-29 11:05:00.329 WARN  [thread:DefaultMessageListenerContainer-44][class:org.springframework.jms.listener.DefaultMessageListenerContainer:892] - Setup of JMS message listener invoker failed for destination 'MY.Q.ALIAS' - trying to recover. Cause: JMSWMQ2008: Failed to open MQ queue 'MY.Q.ALIAS'.; nested exception is com.ibm.mq.MQException: JMSCMQ0001: IBM MQ call failed with compcode '2' ('MQCC_FAILED') reason '2082' ('MQRC_UNKNOWN_ALIAS_BASE_Q').
com.ibm.msg.client.jms.DetailedInvalidDestinationException: JMSWMQ2008: Failed to open MQ queue 'MY.Q.ALIAS'.
        at com.ibm.msg.client.wmq.common.internal.Reason.reasonToException(Reason.java:513)
        at com.ibm.msg.client.wmq.common.internal.Reason.createException(Reason.java:215)

在MQ错误日志中我看到以下内容:

01/29/2019 03:08:05 PM - Process(27185.478) User(mqm) Program(amqrmppa)
                    Host(myhost) Installation(Installation1)
                    VRMF(9.0.0.5) QMgr(MyQMGR)

AMQ9999: Channel 'MyCHL' to host 'MyIP' ended abnormally.

EXPLANATION:
The channel program running under process ID 27185 for channel 'MyCHL'
ended abnormally. The host name is 'MyIP'; in some cases the host name
cannot be determined and so is shown as '????'.
ACTION:
Look at previous error messages for the channel program in the error logs to
determine the cause of the failure. Note that this message can be excluded
completely or suppressed by tuning the "ExcludeMessage" or "SuppressMessage"
attributes under the "QMErrorLog" stanza in qm.ini. Further information can be
found in the System Administration Guide.
----- amqrmrsa.c : 938 --------------------------------------------------------
01/29/2019 03:15:14 PM - Process(27185.498) User(mqm) Program(amqrmppa)
                    Host(myhost) Installation(Installation1)
                    VRMF(9.0.0.5) QMgr(MyQMGR)

AMQ9209: Connection to host 'MyIP' for channel 'MyCHL' closed.

EXPLANATION:
An error occurred receiving data from 'MyIP' over TCP/IP.  The connection
to the remote host has unexpectedly terminated.

The channel name is 'MyCHL'; in some cases it cannot be determined and so
is shown as '????'.
ACTION:
Tell the systems administrator.

由于MQ错误日志包含QMGR(MyQMGR),其中MyQMGR值没在连接属性设置,我假设路由似乎是罚款:在MQ集群想出了一个QMGR使用。

别名存在并指向现有的Q值。机器人目标q和别名被添加到经由CLUSTER(clustname)命令的群集。

什么可能是错误的?

spring-boot ibm-mq spring-jms jmstemplate
1个回答
3
投票

简答

  • MQ群集不用于消费者应用程序查找一个队列从中获取信息。
  • MQ群集时使用生产者应用程序将信息引导他们到目的地。

延伸阅读

当被发送的消息,以帮助提供负载平衡和集群队列的多个实例聚类被使用。在某些情况下,人们用这个热/冷由具有队列的两个实例,并只保留一个PUT(ENABLED)故障转移。

如果应用程序是将消息放入集群队列中的生产者,只需要连接到一个队列管理器集群中,并有权向他提出的集群队列。基于许多不同的事情将处理向何处发送该消息MQ。


到V7.1之前,只有两种方式来提供访问远程集群队列:

  1. 使用QALIAS: 定义一个具有目标设定为集群队列名的本地QALIAS 请注意,这QALIAS本身并不需要被集成。 准许投入到当地QALIAS
  2. 提供权限付诸SYSTEM.CLUSTER.TRANSMIT.QUEUE

第一种选择允许授予对于集群中的特定集群队列的应用细粒度的访问。第二个选项允许应用程序放置到集群中的任何clusteted队列。

在7.1 IBM增加了一个新的可选行为,这与在ClusterQueueAccessControl=RQMNameSecurity节设置qm.ini提供。如果启用该选项(它不是缺省值),那么你实际上可以提供应用程序把远程集群队列直接,无需本地QALIAS许可。


什么集群是不是被消费应用,如您一个JMSListener的例子。

将从任何QLOCAL(群集或不)消耗的应用程序必须连接到其中QLOCAL被定义的队列管理器。

如果你有一处聚集QLOCALPUT(ENABLED)的多个实例的情况下,你需要确保你有消费者直接连接到每个队列管理器实例托管在。


基于您的评论你有一个条目,如CCDT:

CHANNEL('MyCHL') CHLTYPE(CLNTCONN) QMNAME('MyQMGR') CONNAME('node1url(port1),node2url(port2)')

如果有两个不同的队列管理器具有不同的队列管理器名称侦听node1url(port1)node2url(port2),那么你有不同的方式,从应用程序方面做到这一点。

当您指定QMNAME连接到应用程序将预期的名字,以匹配连接,除非它符合下列之一的队列管理器:

  1. 如果指定*MyQMGR它会找到一个或多个通道与QMNAME('MyQMGR')并挑选一个并连接,并不会强制执行远程队列管理器名称必须一致。
  2. 如果在你的CCDT你QNAME(''),它被设置为NULL,然后在您的应用程序,你可以指定一个空队列管理器名称或只有一个空格,它会发现在CCDT该条目并不会强制执行远程队列管理器名称必须匹配。
  3. 在您的应用程序指定的队列管理器名称为*,MQ将使用在任何CCDT渠道,不会执行远程队列管理器名称必须一致。

CCDT的一个限制是,频道名称必须在CCDT独特。即使的QMNAME是不同的,你不能有相同的通道名称的第二个条目。

当您连接你打两个CONNAME的条目并得到连接到第一IP(port),你只会得到第二IP(port)如果将第一不可用MQ将尝试第二次,或者如果您已连接并启用了重新连接然后第一下降MQ将尝试连接到第一,然后第二。

如果你想同时拥有集群队列PUT(ENABLED)接收业务,那么你希望能够专门连接到两个队列管理器来读取这些队列。

我建议你有那也是从现有的名字,像这样不同的不同的QM具体名字每个队列管理器添加一个新的渠道:

CHANNEL('MyCHL1') CHLTYPE(CLNTCONN) QMNAME('MyQMGR1') CONNAME('node1url(port1)')
CHANNEL('MyCHL2') CHLTYPE(CLNTCONN) QMNAME('MyQMGR2') CONNAME('node2url(port2)')

这将是除了现有的条目。

为了您把组件,您可以继续使用可以连接到队列管理器的通道。

对于你得到的组件可以配置至少两个人,一个使用新的队列管理器的具体CCDT项,这样这两个队列被消耗连接到每个队列管理器。

© www.soinside.com 2019 - 2024. All rights reserved.