كيف يمكنني تصفح Websphere MQ الرسالة دون إزالة ذلك ؟

StackOverflow https://stackoverflow.com/questions/1039240

  •  22-07-2019
  •  | 
  •  

سؤال

أنا أكتب .صافي تطبيق نماذج Windows أنه سيتم نشر رسالة إلى Websphere MQ الانتظار ومن ثم استطلاع مختلف انتظار الرد.إذا كان يتم إرجاع استجابة التطبيق سوف جزئيا عملية الاستجابة في الوقت الحقيقي.ولكن الرد يحتاج إلى البقاء في طابور بحيث اليومية المهمة الدفعي الذي يقرأ أيضا من الاستجابة الانتظار ، يمكن أن تفعل بقية المعالجة.

لقد حصلت على قدر ما تقرأ الرسالة.ما لم أكن قادرا على معرفة كيفية قراءتها دون إزالته.

هذا ما لدي حتى الآن.أنا MQ مبتدئ ، لذلك أي اقتراحات سوف يكون موضع تقدير.و لا تتردد في الرد في C#.

Public Function GetMessage(ByVal msgID As String) As MQMessage
    Dim q = ConnectToResponseQueue()
    Dim msg As New MQMessage()
    Dim getOpts As New MQGetMessageOptions()
    Dim runThru = Now.AddMilliseconds(CInt(ConfigurationManager.AppSettings("responseTimeoutMS")))
    System.Threading.Thread.Sleep(1000) 'Wait for one second before checking for the first response'
    While True
        Try
            q.Get(msg, getOpts)
            Return msg
        Catch ex As MQException When ex.Reason = MQC.MQRC_NO_MSG_AVAILABLE
            If Now > runThru Then Throw ex
            System.Threading.Thread.Sleep(3000)
        Finally
            q.Close()
        End Try
    End While
    Return Nothing 'Should never reach here'
End Function

ملاحظة: لم يتم التحقق من أن قانون بلدي في الواقع إزالة الرسالة.ولكن هكذا أنا أفهم MQ إلى العمل ، و الذي يظهر أن يكون ما يحدث.يرجى تصحيح لي إذا كان هذا ليس هو السلوك الافتراضي.

هل كانت مفيدة؟

المحلول

تحتاج إلى فتح قائمة الانتظار مع MQOO_BROWSE الخيار.ثم في أول قراءة لك القيام باستخدام MQGMO_BROWSE_FIRST الخيار.وأخيرا ، اللاحقة الخاصة بك الحصول على استخدام MQGMO_BROWSE_NEXT الخيار.

ملاحظة:MQOO هو MQ الخيارات مفتوحة و MQGMO هو MQ الحصول على خيارات الرسالة.

نصائح أخرى

كنت حقا ينبغي أن تفعل هذا مع طوابير منفصلة.نهاية اليوم تجهيز ينبغي الانتظار.بعد عملية الخاص بك جزء من رسالة أرسلها إلى التخلص من الذخائر المتفجرة الانتظار.

مع خيار استعراض كنت تنوي لتتبع ما الرسائل التي سبق معالجتها في مكان ما.

كما يمكنك تحديد مهلة الانتظار على الحصول على.لذلك أنت لا تحتاج إلى "انتظر 1 ثواني قبل التحقق من الانتظار".كما هو مكتوب الآن لا يمكنك ضرب أي msg المتاحة الشرط لأنه لم يكن تعيين NOWAIT في الحصول على خيارات الرسالة.

للأجيال القادمة السماء ، وهنا (على ما أظن) بكثير نسخة محسنة من طريقة تقوم على mamboking و jmucchiello إجابات.

Public Function GetMessage(ByVal correlID As Byte()) As MQMessage
    Dim waitInterval = CInt(ConfigurationManager.AppSettings("responseTimeoutMS"))
    Dim q As MQQueue = Nothing
    Try
        Dim msg As New MQMessage()
        Dim getOpts As New MQGetMessageOptions()
        q = ConnectToResponseQueue()
        msg.MessageId = MQC.MQMI_NONE
        msg.CorrelationId = correlID
        getOpts.MatchOptions = MQC.MQMO_MATCH_CORREL_ID
        getOpts.WaitInterval = waitInterval
        getOpts.Options = MQC.MQGMO_BROWSE_FIRST Or MQC.MQGMO_WAIT
        q.Get(msg, getOpts)
        Return msg
    Finally
        If q IsNot Nothing AndAlso q.IsOpen() Then q.Close()
    End Try
End Function

وأنا أدرك أنا قادم إلى هذا النقاش في وقت متأخر قليلا و ربما كنت قد مشفرة هذا التطبيق تصل.في حال كنت من أي وقت مضى بحاجة إلى تعديل أو أي شخص آخر قد تحتاج إلى أن تفعل شيئا من هذا القبيل ، لدي بعض الملاحظات.

أولا, إذا كنت تستطيع أن تفعل هذا مع v7 QMgr و v7 WMQ العميل سيكون هذا الحل المفضل.في v7،.صافي الدعم قد تم نقله من SupportPac إلى جزء من المنتج الأساسي.هناك قدرا كبيرا من الوظائف الجديدة ، بعض إصلاحات الشوائب وتحسين الأداء.أيضا ، على v7 يمكنك استخدام pub-sub...الذي يقودني إلى الملاحظة الثانية.

بناء على الوصف في الموقع الأصلي ، كنت قد فعلت هذا في حانة-Sub.التطبيق الذي يضع رسالة يحتاج وضع واحد فقط و لا تحتاج حتى إلى معرفة انه وضع الموضوع.يمكنك فعلا طرح اسم مستعار على الموضوع الذي يجعلها تبدو وكأنها طابور رسالة المنتج.الخاص بك من التطبيقات المستهلكة يمكن بعد ذلك إما الاشتراك أو يمكنك جعل اثنين الإدارية الاشتراكات بحيث نشرت رسائل الذهاب إلى اثنين من قوائم الانتظار التي تقوم بتعيينها.تطبيقات الخاصة بك ثم كل مخصص طابور و لا الترميز التغييرات المعنية من أجل منتج دفعة التطبيق, انها مجرد التكوين.بالطبع التطبيق القيادة المعاملات تحتاج إلى تستهلك فعلا الرسائل بدلا من تصفحها.

مزايا هنا عدة:

  • كما طابور يملأ مع الرسائل الفهرسة يحصل مسح القرص فوق عتبة سترى الأداء ضرب والتي قد تكون كبيرة.ولذلك فإن الطريقة الحالية لا مقياس كل ذلك بشكل جيد.
  • مع pub-sub الأسلوب يمكن أن يكون لديك مثيلات متعددة إما في الوقت الحقيقي أو تطبيقات دفعة أو كل من هذه يمكن أن تكون على نفس أو مختلفة QMgr.رفع مستوى السهل.
  • يمكنك القضاء على التبعية بين الوقت الحقيقي دفعة التطبيقات التي تحتاج إلى أن تكون على نفس QMgr.
  • أكثر شفافية الإدارة.إذا كنت ترى الرسائل في الوقت الحقيقي طابور تعرف أن لديك مشكلة.

بضع مختلفة تماما هنا كذلك.واحد من هذه هو استخدام تفشل إذا Quiescing الخيار.والغرض من هذا هو أنه عندما QMgr هو اغلاق نظيفة هذا الخيار الخاص بك يسبب استدعاء API مع عودة رمز يدل على QMgr هو اغلاق.إذا كنت لا تشمل هذا الخيار ثم فمن الممكن مع اثنين أو أكثر من تطبيقات متصلة أن QMgr سوف أبدا اغلاق نظيفة وتحتاج إلى أن اضطر إلى أسفل أو عمليات قتل مع القوة الغاشمة.وكقاعدة عامة ، استخدم دائما تفشل إذا Quiescing على جميع المكالمات API التي تدعم ذلك.والسبب أنه موجود في كل الناس الذين يحتاجون XA transactionality ولكن لسبب ما لا يمكن استخدامه.في هذا السيناريو ، الاتصال و الحصول على أول أو وضع المكالمة يستخدم تفشل إذا Quiescing مجموعة اللاحقة أو الحصول على وضع العمليات لا.وهذا يسبب QMgr إلى الانتظار للحصول على مجموعة كاملة من الحصول على/وضع المكالمات كاملة لكن بعد الاتصال أو الحصول على/وضع يستخدم تفشل إذا Quiescing حتى QMgr لديه فرصة لاغلاق إذا لزم الأمر.

غيرها من الملاحظة هنا هو أنه لا يوجد قبض في المدونة هنا.أنا أعتقد أن هناك واحدة في نطاق مواصلة المكالمة كومة ؟ فمن المستحسن دائما أن طباعة WMQ رمز الإرجاع من استثناء بحيث يمكنك تعقب الجذري.على الاستشارات التعاقدات أنصح دائما العملاء أن عدم طباعة رمز الإرجاع (أو المرتبطة استثناء الدائرة/XMS القانون) هي رقصة تمنع الترويج من التطبيق إلى الإنتاج.انها حقا بهذه المهمة.حتى إذا كان لديك مشكلة في الكود الذي يستدعي getMessage () ، شخص إعادة استخدام المثال التعليمات البرمجية المتكررة هنا قد لا يدركون هذا الجزء المهم هو في عداد المفقودين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top