Ibm mq IBM MQ问题:JMSMQ1113目标未设置名称

Ibm mq IBM MQ问题:JMSMQ1113目标未设置名称,ibm-mq,spring-jms,Ibm Mq,Spring Jms,在SpringJMS项目中,我尝试连接到放置在远程服务器中的IBMMQ队列。代码可以到达IBM MQ服务器并识别MQ管理器,但当它尝试与.bindings文件中提到的队列通信时(此文件在IBM MQ服务器中生成,我将其复制到本地文件夹,并将此文件夹的名称作为JNDI资源),我遇到以下错误: INFO - Setup of JMS message listener invoker failed for destination 'TI.UNIT1.ENQ.IN' - trying to recove

在SpringJMS项目中,我尝试连接到放置在远程服务器中的IBMMQ队列。代码可以到达IBM MQ服务器并识别MQ管理器,但当它尝试与.bindings文件中提到的队列通信时(此文件在IBM MQ服务器中生成,我将其复制到本地文件夹,并将此文件夹的名称作为JNDI资源),我遇到以下错误:

INFO - Setup of JMS message listener invoker failed for destination 'TI.UNIT1.ENQ.IN' - trying to recover. Cause: JMSMQ1113: Aucun nom n'est défini pour la destination.
com.ibm.msg.client.jms.DetailedJMSException: JMSMQ1113: Aucun nom n'est défini pour la destination. Tentative d'utilisation d'une file d'attente ou d'une rubrique MQ créée à l'aide du constructeur par défaut. Un nom doit avoir été défini pour que la file d'attente puisse être utilisée. Après la création, définissez un nom dans la file d'attente ou la rubrique MQ.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.ibm.msg.client.commonservices.j2se.NLSServices.createException(NLSServices.java:411)
    at com.ibm.msg.client.commonservices.nls.NLSServices.createException(NLSServices.java:390)
    at com.ibm.mq.jms.MQDestination.validateDestination(MQDestination.java:1455)
    at com.ibm.mq.jms.MQQueueSession.createReceiver(MQQueueSession.java:118)
    at org.springframework.jms.listener.DefaultMessageListenerContainer102.createConsumer(DefaultMessageListenerContainer102.java:102)
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.createListenerConsumer(AbstractPollingMessageListenerContainer.java:221)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.initResourcesIfNecessary(DefaultMessageListenerContainer.java:1005)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:981)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:974)
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:876)
    at java.lang.Thread.run(Thread.java:744)
我在谷歌上做了深入的搜索,但没有有效的解决方案


@再次感谢你:) 这是我在键入“type.bindings | findstr TI.UNIT1.ENQ.IN”时得到的结果:

你是对的,它在TI.UNIT1.ENQ.IN/RefAddr/16/Content中遗漏了TI.UNIT1.ENQ.IN= 我添加了缺少的队列名称,如TI.UNIT1.ENQ.IN/RefAddr/16/Content=TI.UNIT1.ENQ.IN
但我仍然得到了与之前相同的错误。

英文描述的错误是:

MSMQ1113: The destination does not have a name set. An attempt was made to use a MQQueue or MQTopic that was created with the default constructor. A name should have then been set before the queue was used. After creation set a name on the MQQueue or MQTopic.
您是否验证了名为
TI.UNIT1.ENQ.IN
的JNDI资源包含在.binding文件中,并且它引用了有效的IBM MQ队列名称

binding文件是一个文本文件,查看它的一种方法是对它进行排序,每个JNDI条目将由许多行组成

您的文件中可能有类似于以下内容的内容:

TI.UNIT1.ENQ.IN/RefAddr/12/Content=TI.UNIT1.ENQ.IN
TI.UNIT1.ENQ.IN/RefAddr/12/Content/Encoding=String
TI.UNIT1.ENQ.IN/RefAddr/12/Type=QU
如果这样的条目丢失或
Content=
右侧丢失,则可能会导致您所描述的问题

我在IBM的developerWorks论坛“”上找到了这篇文章,其中有来自IBM的Matthew B White的答案,以获得有用的信息


更新1

您在以下条目中提到将Content=更改为队列名称,这是不正确的,因为此条目是基本队列管理器名称
Type=QMGR
,您可以并且应该将此项保留为空。在大多数情况下,MQ将始终尝试首先在您连接到的队列管理器上查找队列

TI.UNIT1.ENQ.IN/RefAddr/16/Content=
TI.UNIT1.ENQ.IN/RefAddr/16/Encoding=String
TI.UNIT1.ENQ.IN/RefAddr/16/Type=QMGR
您缺少一个条目,该条目类似于下面的
Type=QU
,它将引用IBM MQ队列名称

TI.UNIT1.ENQ.IN/RefAddr/12/Content=TI.UNIT1.ENQ.IN
TI.UNIT1.ENQ.IN/RefAddr/12/Content/Encoding=String
TI.UNIT1.ENQ.IN/RefAddr/12/Type=QU
您应该返回并查看如何生成.binding文件,以查看是否缺少某些内容

如果使用JMSAdmin生成.binding文件,则该命令至少看起来像这样:

DEF Q(TI.UNIT1.ENQ.IN) QUEUE(TI.UNIT1.ENQ.IN)

Q
是JNDI资源名称(它不必与队列名称匹配)
QUEUE
是与JNDI资源名称关联的IBM MQ队列的名称。

英文描述的错误为:

MSMQ1113: The destination does not have a name set. An attempt was made to use a MQQueue or MQTopic that was created with the default constructor. A name should have then been set before the queue was used. After creation set a name on the MQQueue or MQTopic.
您是否验证了名为
TI.UNIT1.ENQ.IN
的JNDI资源包含在.binding文件中,并且它引用了有效的IBM MQ队列名称

binding文件是一个文本文件,查看它的一种方法是对它进行排序,每个JNDI条目将由许多行组成

您的文件中可能有类似于以下内容的内容:

TI.UNIT1.ENQ.IN/RefAddr/12/Content=TI.UNIT1.ENQ.IN
TI.UNIT1.ENQ.IN/RefAddr/12/Content/Encoding=String
TI.UNIT1.ENQ.IN/RefAddr/12/Type=QU
如果这样的条目丢失或
Content=
右侧丢失,则可能会导致您所描述的问题

我在IBM的developerWorks论坛“”上找到了这篇文章,其中有来自IBM的Matthew B White的答案,以获得有用的信息


更新1

您在以下条目中提到将Content=更改为队列名称,这是不正确的,因为此条目是基本队列管理器名称
Type=QMGR
,您可以并且应该将此项保留为空。在大多数情况下,MQ将始终尝试首先在您连接到的队列管理器上查找队列

TI.UNIT1.ENQ.IN/RefAddr/16/Content=
TI.UNIT1.ENQ.IN/RefAddr/16/Encoding=String
TI.UNIT1.ENQ.IN/RefAddr/16/Type=QMGR
您缺少一个条目,该条目类似于下面的
Type=QU
,它将引用IBM MQ队列名称

TI.UNIT1.ENQ.IN/RefAddr/12/Content=TI.UNIT1.ENQ.IN
TI.UNIT1.ENQ.IN/RefAddr/12/Content/Encoding=String
TI.UNIT1.ENQ.IN/RefAddr/12/Type=QU
您应该返回并查看如何生成.binding文件,以查看是否缺少某些内容

如果使用JMSAdmin生成.binding文件,则该命令至少看起来像这样:

DEF Q(TI.UNIT1.ENQ.IN) QUEUE(TI.UNIT1.ENQ.IN)

Q
是JNDI资源名称(它不必与队列名称匹配)
QUEUE
是与JNDI资源名称关联的IBM MQ队列的名称。

非常感谢您的回复!谢谢你@JoshMc!你太棒了!:)非常感谢您的回复!谢谢你@JoshMc!你太棒了!:)