2012-08-06 3 views
0

.NET WMQ API를 사용하여 .NET 응용 프로그램에서 WebSphere MQ (WebSphere MQ Server v7)를 통해 JMS 메시지를 보내려고합니다. WebSphere MQ Client v7.5 및 amqmdnet.dll 버전 7.5.0.0을 사용하고 있습니다..NET WMQ API에서 JMSDeliveryMode 속성을 읽을 수 있습니까?

JMSDeliveryMode 속성 (Dlv 속성, jms RFH2 폴더)을 읽을 때 매우 이상한 동작이 있습니다. JMS 응용 프로그램 (WebSphere Application Server v7에서 호스트되는 서블릿)이 전송하는 등록 정보 값은 Persistent (2)로 설정되지만 .NET 클라이언트는 항상 1 (즉 Non_persistent)을 읽습니다. 내 .NET 응용 프로그램이 라우터/전달자로 작동하고 올바른 구성으로 메시지를 전달해야하므로 올바른 값을 읽어야합니다.

RFHUtils을 사용하여 JMS 메시지를 시뮬레이션하려고했습니다. 배달 모드를 1로 설정하고 .NET 클라이언트에 보내면 다시 읽습니다.하지만 MQMD에서 MQ 메시지의 지속성을 변경하면 0을 읽습니다. JMSDeliveryMode의 값이 전혀 사용되지 않고 .NET 클라이언트 항상 Persistence 속성에서 값을 읽지 만 잘못된 동작입니다! DeliveryMode.NON_PERSISTENT

  • - 2 - DeliveryMode.PERSISTENT
  • Persistence 정확한 값 (발

    • 1 (jms.jar)에서

      JMSDeliveryMode 정확한 값이 두 성질은 올바른 다른 범위의 값을 가지고 amqmdnet.dll) :

      • 0-MQC.MQPER_NOT_PERSISTENT
      • 1-MQC.MQPER_PERSISTENT
      • 2-MQC.MQPER_PERSISTENCE_AS_Q_DEF/MQC.MQPER_PERSISTENCE_AS_TOPIC_DEF

    답변

    0

    그것은 다시 IBM의 amqmdnet.dll에서 버그입니다. JMS 등록 정보를 읽어 책임이있는 코드 (MQMessage 클래스의 GetJmsProperty 개인 방법) .NET Reflector와 라이브러리를 분해 및 점검 후 나는 발견이 :

    if (name.Equals("JMSDeliveryMode")) 
    { 
        // Properties never contain the property with such name! 
        if (this.properties.ContainsKey("JMSDeliveryMode")) 
        { 
         ... 
        } 
        return this.Persistence; // Executes always 
    } 
    

    문제는 properties 컬렉션 키로 JMSDeliveryMode 어떤 속성을 포함하지 않을 것입니다. properties 컬렉션에는 RFH2Folder.RFH2PropertyName 형식의 RFH2 헤더가 포함되어 있습니다. JMSDeliveryMode의 올바른 속성 이름은 jms.Dlv입니다! 흥미롭게도 GetJmsHeader 메서드는 모든 JMS 속성을 읽고 다른 모든 속성은 속성 컬렉션에서 검색 할 때 올바른 RFH2 이름을 사용합니다!

    역 작업 - 개인 방법 SetJmsPropertyMQMessage 클래스를 확인하면 상황이 더욱 악화되었습니다.

    else if (name.Equals("JMSDeliveryMode")) 
    { 
        if (value is int) 
        { 
         int num2 = Convert.ToInt32(value); 
         switch (num2) 
         { 
          // Non persistent JMS message creates persistent MQ message 
          case 1: 
           this.Persistence = 1; 
           break; 
          // Invalid value for JMS delivery mode    
          case 0: 
           this.Persistence = 0; 
           break; 
          // Great if I try to create persistent JMS message I will 
          // get MQRC_PERSISTENCE_ERROR exception!    
          default: 
           base.throwNewMQException(2, 0x7ff); 
           break; 
         } 
    
         queue.Enqueue(num2); 
         // Correct RFH2 identifier is used 
         this.properties.Add("jms.Dlv", queue); 
        } 
        else 
        { 
         base.throwNewMQException(2, 0x9a9); 
        } 
    } 
    

    그래서 JMSDelivery 모드를 설정하면 화재 또는 예외 중 하나가 설정됩니다 무효 지속성 : JMSDeliveryMode을 설정하면이 코드를 포함하고 있습니다! 다음은 문제를 재현하기위한 작은 테스트입니다.

    [Test] 
    public void PutAndGetMessageWithDeliveryMode() { 
        using (MQQueue queue = _queueManager.AccessQueue(TestQueue, MQC.MQOO_OUTPUT | MQC.MQOO_INPUT_AS_Q_DEF)) { 
    
         MQMessage message = new MQMessage(); 
         message.SetInt4Property("JMSDeliveryMode", 2); 
         message.WriteString("some string"); 
         message.Format = MQC.MQFMT_STRING; 
    
         queue.Put(message); 
    
         MQMessage readMessage = new MQMessage(); 
         queue.Get(readMessage); 
    
         Assert.AreEqual(2, readMessage.GetInt4Property("JMSDeliveryMode")); 
    
         queue.Close(); 
        } 
    } 
    
    0

    MQ의 지속성 값.NET은 정확하고 cmqc.h 헤더 파일과 비교할 수 있습니다. amqmdnet과 C MQI는 둘 다 MQ 고유 API입니다.

    0 - MQC.MQPER_NOT_PERSISTENT 
    1 - MQC.MQPER_PERSISTENT 
    2 - MQC.MQPER_PERSISTENCE_AS_Q_DEF/MQC.MQPER_PERSISTENCE_AS_TOPIC_DEF 
    

    jms.jar DeliveryMode 열거 형이 다른 값을 정의했습니다. MQ JMS 구현은 내부적으로이를 적절히 처리하고 MQMD 및 RFH2 특성에서 올바른 MQ 특정 값을 설정한다고 생각합니다.

    RFH2Util을 사용한 테스트에 관해서. MQMD 탭 및 JMS에 설정된 값은 다를 수 있습니다. MQMD 탭에서 DeliveryMode를 JMS 탭에서 1로 설정하고 Persistent Msg를 No으로 설정할 수 있습니다. 메시지를 입력하면 MQMD.Persistence는 0으로 표시되고 JMSDeliveryMode는 1로 표시됩니다. MQ Explorer에서 메시지를보고이 값을 확인했습니다. MQ .NET API는 메시지에서 얻은 정보를 제공합니다. 내가 아는 한 RFHUtil은 RFH 속성을 설정하는 도구입니다. 단순히 RFH 속성을 설정/가져옵니다. MQ JMS 구현의 인텔리전스가 없습니다.

    "JMSxxxx"등록 정보는 MQ 구현과 MQ 구현과 같은 네이티브 구현이 가장 잘 처리합니다.

    +0

    MQ .NET API는 메시지에 포함 된 내용을 제공하지 않습니다. 그것은 심지어 올바른 값을 보내는 것을 허용하지 않습니다. MQ.NET API가 "기본"구현 인 경우 완전한 제어를 제공해야합니다. 상위 계층 (JMS)이 전송 계층 (MQ)에서 직접 하드 코딩 된 동작을하는 이유를 이해할 수 없습니다. 일부 브리지에서는 별도로 정의해야합니다. –

    관련 문제