2015-01-16 57 views
1

我正在從Mq 7.0版遷移到7.5。我能夠通過使用ejb - 消息驅動Bean(MDB)的入站隊列接收消息,但在處理消息之後發佈消息。我正在獲取IBM MQRC 2082 MQRC_UNKOWN_ALIAS_BASE_Q異常。從mq 7.0版遷移到7.5

這是我收到的例外:

產生的原因:javax.jms.InvalidDestinationException:MQJMS2008:未能 開放MQ隊列 'OFS.TIG​​_IND2NSE_MSG'。 at com.ibm.msg.client.wmq.v6.jms.internal.MQQueueServices.getQueueOpenException(MQQueueServices.java:901) at com.ibm.msg.client.wmq.v6.jms.internal.MQQueueServices.getOutputQueue( MQQueueServices.java:727) at com.ibm.msg.client.wmq.v6.jms.internal.JMSServicesMgr.getOutputQueue(JMSServicesMgr.java:210) at com.ibm.msg.client.wmq.v6.jms。 internal.MQSession.createQProducer(MQSession.java:3138) at com.ibm.msg.client.wmq.v6.jms.internal.MQSession.createProducer(MQSession.java:2863) at com.ibm.msg.client。 wmq.v6.jms.internal.MQSession.createProducer(MQSession.java:2920) at com.ibm.msg.client.jms.internal.JmsSessionImpl.createProducer(JmsSessionImpl.java:1191) at com.ibm.msg。 client.jms.internal.JmsXAQueueSessionImpl $ 1.createSende R(JmsXAQueueSessionImpl.java:415) 在com.ibm.mq.jms.MQQueueSession.createSender(MQQueueSession.java:148) 在weblogic.deployment.jms.WrappedSession.createSender(WrappedSession.java:344) 在融爲一體。 tiger.gmfs.framework.jms.QUtil.getSender(QUtil.java:216) 在com.tiger.gmfs.framework.jms.QUtil.sendMessage(QUtil.java:110)

的一段代碼我寫的是: 這是我getSender方法: 保護QueueSender getSender()拋出JavaMessagingException, {的JMSException

QueueSender sender = null; 
    queue = qsess.createQueue(qVO.getName()); 
    sender = qsess.createSender(queue); 
    if (sender == null) 
     throw new JavaMessagingException("The queue sender is null."); 


    sender.setPriority(qVO.getPriority()); 
    return sender; 
} 

,這是我的sendMessage方法:

public void sendMessage(Message jmsMessage) throws JavaMessagingException, 
      JMSException { 
     QueueSender sender = null; 
     try { 
      sender = getSender(); 
      sender.send(jmsMessage); 
     } catch (JMSException j) { 
      Exception l = j.getLinkedException(); 
      if (l != null) { 
       JavaMessagingException be = new JavaMessagingException(
         "JMSErrCode:" + l + " Code:" + j.getErrorCode() 
           + " Message: " + jmsMessage, j); 
       throw be; 
      } else 
       throw new JavaMessagingException(j); 
     }catch(Exception e1){ 
      System.out.println(e1); 
     }finally { 

      if (sender != null) { 
       sender.close(); 
       TracingHelper.infoLog(QUtil.class, "sendMessage", 
         "Closed sender"); 
      } 
     } 
    } 

什麼樣的變化,我應該在這裏,我的代碼工作嗎?

我已經實現了相同的代碼在JRE 1.7 + weblogic的12C完美的作品,但是當我改成了JRE 1.6 + weblogic的11g中,我得到這個錯誤。

+0

您正在使用的MQ隊列管理器的版本是什麼?您在weblogic中使用的MQ客戶端版本是什麼?您是否使用MQ JCA RA? –

+0

MQ客戶端版本是7.0 + Weblogic 11g +不,我們沒有使用MQ JCA RA –

回答

0

問題是在基本隊列管理器存在於羣集或某個其他遠程隊列管理器時出現別名。明確設置Queuemanger名稱會導致此錯誤。 如果(jmsConfigQueue.getOpenOptions()!= NULL){ 如果(jmsConfigQueue.getOpenOptions()equalsIgnoreCase( 「入站」)。) { mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); (jmsConfigQueue.getOpenOptions()。equalsIgnoreCase(「Outbound」)) { } } else mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); } else { mqqueue.setBaseQueueManagerName(qcf.getQueueManager()); }

因此,爲了使應用程序搜索的基本隊列管理器(遠程),將其設置爲空白。如上面的代碼。

1

MQRC 2082 MQRC_UNKOWN_ALIAS_BASE_Q是告訴你,有問題的隊列: -

MQJMS2008: failed to open MQ queue 'OFS.TIG_IND2NSE_MSG'. 

是不正確的定義,因爲它正指向基本隊列不存在的別名隊列。

建議您使用以下MQSC命令來顯示它: -

DISPLAY QALIAS(OFS.TIG_IND2NSE_MSG) ALL 

,並尋找現場TARGET,然後發出另一個MQSC命令來顯示它是別名隊列: -

DISPLAY QUEUE(target-queue-name) ALL 
我期望的

會告訴你隊列不存在。在這種情況下,您應該定義它,或更正QALIAS定義以指向正確的目標隊列名稱。

+0

這裏的情況是 - 用戶試圖打開一個別名隊列(MQC.MQOO_INPUT *),它指向一個羣集本地隊列不同的隊列管理器應用程序只能打開PUT(MQOO_OUTPUT)而不打開GET,這可以解決問題。 如果我在同一個別名隊列上運行amqsputc,它會正常工作並解析羣集隊列。如果我運行amqsgetc,我得到2082,因爲基本隊列不存在於存在別名的本地隊列管理器中。 –

+0

From IBM PMR ----------------------------------- 打開選項:0x00000022 MQOO_INPUT_SHARED 0x00000002 MQOO_INQUIRE 0x00000020 08:59:07.728611 - }! kqiSetupQPath rc = krcE_OPTION_NOT_VALID_FOR_TYPE 08:59:07.728615 - }! kqiOpenQueue rc = krcE_OPTION_NOT_VALID_FOR_TYPE 以下選項不適用於該主題。 MQOO_INPUT_AS_Q_DEF MQOO_INPUT_SHARED MQOO_INPUT_EXCLUSIVE MQOO_BROWSE 也請注意MQOO_INPUT *選項也不允許對象 解析爲不在本地定義的羣集隊列上。 ---------- end ---------- –

+0

@VinaySathyanarayana您的評論會給出一個很好的回答文字,爲什麼不給他們寫答案,那麼它可以被接受作爲正確的答案,如果適當的話。聽起來好像還有其他信息可以添加到問題中呢?您隨時可以編輯問題並將其添加到該問題中。 –

1

從發展的角度看,當一個應用程序打開的隊列 - 開發人員必須確保正確的打開選項來打開WebSphere MQ隊列。

如果應用程序要放在一個消息,與MQOO_OUTPUT打開隊列打開選項,而不是的MQOO_INPUT *任何選項。

如果應用程序想要得到一個消息,打開隊列的下方打開任何一個選項,但不是所有在同一時間 MQOO_INPUT_SHARED MQOO_INPUT_EXCLUSIVE MQOO_INPUT_AS_Q_DEF

其原因是,如果隊列爲打開的是別名隊列,指向同一隊列管理器中的基本隊列,其中存在別名隊列,基本隊列是本地隊列 - OUTPUT和INPUT打開選項均有效。

但是,如果打開的別名隊列指向遠程隊列或存在別名隊列的同一隊列管理器中的主題,或者別名隊列指向存在於不同隊列中的羣集本地隊列管理器中,所有MQOO_INPUT *打開選項在這種情況下都是無效的。

因此,它始終是最好只並只與正在執行該操作所需要的適當打開選項打開WebSphere MQ隊列。

對於您的情況,如果您嘗試使用任何MQOO_INPUT *打開選項打開別名隊列,並且它指向不同隊列管理器中的羣集本地隊列,則這是不正確的。您必須從代碼中刪除MQOO_INPUT *打開選項才能解決問題,因爲MQOO_INPUT *選項在此方案中無效。

+0

sir:@Vinay sir:對此鏈接的任何評論: [link] https://www.mail-archive.com/[email protected]/msg14002.html ... 我覺得我的應用程序在啓動時初始化QueueConnectionFactory時會設置QueueManager名稱......它適用於MDB入站,但在發佈消息時它又使用與明確設置相同的QueueManager名稱。但根據此鏈接,隊列管理器名稱應該空白,因爲基本隊列位於遠程隊列管理器中。每當它嘗試檢查隊列管理器時,它都會失敗....請做評論... –

+0

是的,如果您的應用程序使用JMS,忽略或保留消息生成器上的隊列管理器名稱爲空將有助於解決問題。祝你好運。 –