2017-02-15 66 views
1

在春季JMS項目中,我嘗試連接到放置在遠程服務器中的IBM MQ QUEUE。代碼可以到達IBM MQ服務器並識別MQ管理器,但是當它嘗試與在.bindings文件中提及其名稱的QUEUE進行通信時(該文件在IBM MQ服務器中生成,並且我將其複製到本地文件夾中和我提到的這個文件夾的名稱作爲JNDI資源),我得到了以下錯誤:IBM MQ問題:JMSMQ1113目標未設置名稱

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) 

我已經做了深刻的谷歌搜索,但沒有有效的解決方案。


@JoshMc再次謝謝:) 這是當我輸入什麼我有 「型.bindings | FINDSTR TI.UNIT1.ENQ.IN」:

TI.UNIT1.ENQ.IN/RefAddr/7/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/17/Content=0 
TI.UNIT1.ENQ.IN/RefAddr/13/Content=2`enter code here` 
TI.UNIT1.ENQ.IN/RefAddr/3/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/11/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/8/Content=0 
TI.UNIT1.ENQ.IN/RefAddr/6/Type=ENC 
TI.UNIT1.ENQ.IN/RefAddr/11/Type=MDW 
TI.UNIT1.ENQ.IN/RefAddr/18/Type=RCCS 
TI.UNIT1.ENQ.IN/RefAddr/9/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/11/Content=false 
TI.UNIT1.ENQ.IN/RefAddr/13/Encoding=String 
TI.UNIT1.ENQ.IN/FactoryName=com.ibm.mq.jms.MQQueueFactory 
TI.UNIT1.ENQ.IN/RefAddr/5/Type=TC 
TI.UNIT1.ENQ.IN/RefAddr/6/Content=273 
TI.UNIT1.ENQ.IN/RefAddr/10/Type=MDR 
TI.UNIT1.ENQ.IN/RefAddr/2/Content=-2 
TI.UNIT1.ENQ.IN/RefAddr/17/Type=RTOST 
TI.UNIT1.ENQ.IN/RefAddr/19/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/15/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/0/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/4/Type=CCS 
TI.UNIT1.ENQ.IN/RefAddr/16/Type=QMGR 
TI.UNIT1.ENQ.IN/RefAddr/4/Content=1208 
TI.UNIT1.ENQ.IN/RefAddr/0/Content=7 
TI.UNIT1.ENQ.IN/RefAddr/18/Content=1208 
TI.UNIT1.ENQ.IN/RefAddr/6/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/14/Content=-1 
TI.UNIT1.ENQ.IN/RefAddr/17/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/2/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/10/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/9/Content=2 
TI.UNIT1.ENQ.IN/RefAddr/3/Type=PER 
TI.UNIT1.ENQ.IN/RefAddr/15/Type=PAALD 
TI.UNIT1.ENQ.IN/RefAddr/8/Encoding=String 
TI.UNIT1.ENQ.IN/ClassName=com.ibm.mq.jms.MQQueue 
TI.UNIT1.ENQ.IN/RefAddr/16/Content= 
TI.UNIT1.ENQ.IN/RefAddr/12/Content=0 
TI.UNIT1.ENQ.IN/RefAddr/4/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/12/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/2/Type=PRI 
TI.UNIT1.ENQ.IN/RefAddr/7/Content=1 
TI.UNIT1.ENQ.IN/RefAddr/9/Type=MBODY 
TI.UNIT1.ENQ.IN/RefAddr/3/Content=-2 
TI.UNIT1.ENQ.IN/RefAddr/14/Type=RAALD 
TI.UNIT1.ENQ.IN/RefAddr/18/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/14/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/10/Content=false 
TI.UNIT1.ENQ.IN/RefAddr/1/Type=EXP 
TI.UNIT1.ENQ.IN/RefAddr/8/Type=WCFMT 
TI.UNIT1.ENQ.IN/RefAddr/5/Content=0 
TI.UNIT1.ENQ.IN/RefAddr/13/Type=RACP 
TI.UNIT1.ENQ.IN/RefAddr/1/Content=-2 
TI.UNIT1.ENQ.IN/RefAddr/19/Content=1 
TI.UNIT1.ENQ.IN/RefAddr/15/Content=-1 
TI.UNIT1.ENQ.IN/RefAddr/5/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/16/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/1/Encoding=String 
TI.UNIT1.ENQ.IN/RefAddr/0/Type=VER 
TI.UNIT1.ENQ.IN/RefAddr/7/Type=FIQ 
TI.UNIT1.ENQ.IN/RefAddr/12/Type=MDCTX 
TI.UNIT1.ENQ.IN/RefAddr/19/Type=RCNV 

你是對的,它錯過了TI.UNIT1.ENQ.IN/RefAddr/16/Content= 中的TI.UNIT1.ENQ.IN。我添加了缺少的QUEUE名稱,如TI.UNIT1.ENQ.IN/RefAddr/16/Content=TI。 UNIT1.ENQ.IN 但我仍然得到相同的以前的錯誤。

回答

0

用英文描述的錯誤是:

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的論壇「More information on JMSMQ1113 please」上找到了這篇文章,IBM的Matthew B White的回答是有幫助的信息。


更新1

你提到變化的內容=在下面進入隊列名稱,這是不正確的,因爲此內容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來生成。結合文件,命令會是這個樣子至少包括:

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

Q是JNDI資源名稱(它不具有匹配的隊列名稱)。 QUEUE是與JNDI資源名稱關聯的IBM MQ隊列的名稱。

+0

非常感謝JoshMc的回覆! – Mac

+0

謝謝@JoshMc!你真了不起! :) – Mac

+0

@Mac您的歡迎。 – JoshMc