كيف يمكنني تعيين الأولوية على جانب العميل من رسالة MSMQ المرسلة إلى خدمة WF تنشيط عبر MQ

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

سؤال

لدي إعداد خدمة سير العمل المنشط WCF (xamlx) (مستضافة باستخدام Workflowservicehost).

يحتوي WebService على "Netmsmqbinding" ملزمة ونقطة نهاية Net.msmq القائمة المستخدمة من قبل العملاء لجدولة العمليات.

على جانب العميل، لقد استخدمت Visual Studio لإنشاء كعب الوكيل للتواصل مع خدمة WCF هذه.كل شيء يعمل بشكل جيد ويمكنني أن أرى الرسائل التي تظهر في MQ (Doublyed) MQ على الخادم و WCF التقاط الرسائل من قائمة الانتظار لتنشيط سير العمل الذي تم تكوينه بناء على الرسالة.

أحتاج إلى التحكم في أولوية الرسائل التي يتم إرسالها إلى MQ بحيث يمكن أن يحصل بعض عملاء WCF على معالجة أولوية لأعمال سير عملهم.

يبدو netmsmqbinding لا يدعم حقا تحديد أولويات رسالة MQ.هل هذا صحيح؟إذا كان الأمر كذلك، كيف يمكنني تحقيق / محاكاة هذا؟هل يمكنني استخدام مشغلات MQ لتغيير أولوية الرسائل بناء على بعض الأعلام؟

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

المحلول

Posting my solution, in case someone needs to figure this out

NetMSMQBinding does not support setting message priority from the client side so I was using the wrong binding. The more powerful MsMqIntegrationBinding is the right way to go.

Client side: From the client side, one needs to simply create a System.Messaging.Message object, set the priority and drop it in the MessageQueue.MessageQueue object which points to the destination MQ.

Server side: The WorkflowService hosting WCF project needs the following endpointBinding in the web.config:


<endpoint address="msmq.formatname:DIRECT=OS:.\private$\MyWebService/MyProcessingService.xamlx" binding="msmqIntegrationBinding" bindingConfiguration="MyMsMqIntegrationBinding" contract="IMyProcessingService" name="MqIntegrationBindingEndPoint" />

(the address is assuming MQ service is local to the WCF hosted)

<bindings> <!--We use msmqIntegrationBinding instead of netMsmqBinding since we want to control priority of MQ messages being dropped in the queue and that is not supported in netMsmq --> <msmqIntegrationBinding> <binding name="MyMsMqIntegrationBinding" exactlyOnce="false"> <security mode="None" /> </binding> </msmqIntegrationBinding>


The way to receive the MsmqMessage from the MQ and process it is by dropping a "Receive" activity in the XAMLX and choosing Message as the Content definition MessageType as System.ServiceModel.MsmqIntegrationMessage<YourTypeGoesHere> Now you'll have access to this MsmqMessage<yourType> from your ActivityContext where you can retrieve the value sent in the message.

This is a very useful and powerful way to build a scalable, throttled with priority control MQ+WCF+WF based web service

نصائح أخرى

Are these transactional messages? If so, you cannot change the priority at all.

Messages are immutable so you can't change the priority of a non-transactional message that has already been sent.

Cheers
John Breakwell

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