Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Duplex or request-reply with Apache ActiveMQ WCF Binding configuration question

I am trying to use the Apache.NMS.WCF bindings for a WCF application and get the following error -

Contract requires TwoWay (either request-reply or duplex), but Binding 'NmsBinding' doesn't support it or isn't configured properly to support it.

My system.service model looks like this -

    <bindings>
        <nmsBinding>
            <binding 
                name="myNMSBinding" 
                destination="test.queue" 
                destinationType="TemporaryQueue"
                >
            </binding>
        </nmsBinding>
    </bindings>

    <extensions>
        <!--<bindingElementExtensions>
            <add name="nmsTransPort" 
                 type="Apache.NMS.WCF.NmsTransportElement, Apache.NMS.WCF, Version=1.1.0.1642, Culture=neutral, PublicKeyToken=82756feee3957618" />
        </bindingElementExtensions>-->
        <bindingExtensions>
            <add name="nmsBinding" 
                 type="Apache.NMS.WCF.NmsBindingCollection, Apache.NMS.WCF, Version=1.1.0.1642, Culture=neutral, PublicKeyToken=82756feee3957618" 

                 />
        </bindingExtensions>
    </extensions>

    <services>
        <service name="WcfService1.Service1" behaviorConfiguration="WcfService1.Service1Behavior">
            <!-- Service Endpoints -->
            <endpoint 
                address="tcp://localhost:61616" 
                binding="nmsBinding" 
                bindingConfiguration="myNMSBinding" 
                contract="WcfService1.IService1"
                />
        </service>
    </services>

Is there a way to configure the Apache NMS to be duplex or does it just not support it?

like image 227
Barry Hurt Avatar asked Jan 13 '10 00:01

Barry Hurt


1 Answers

A message queue like ActiveMQ is by normally by design only a one-way thing - you can drop messages into it and that's about it.

The real solution if you do need responses back is to reverse the roles: the service you sent a message to on your main contract (one-way) will become the client that sends you back a response on a second queue, on which your app is listening in as the server.

See some MSDN docs and other resources on the topics:

  • MSDN: Queueing in WCF
  • MSDN: Two-way communication over MSMQ in WCF
  • MSDN Magazine: Build a queued WCF response service
  • CodeProject: WCF Queued Messaging
  • Mike Taulty: WCF, MSMQ and CompositeDuplex

The samples typically use MSMQ since that's natively supported by WCF, but the basic principles of breaking up your tasks into two separate one-way contracts and how to setup and use two separate request and response queues should apply to ActiveMQ just as well.

like image 165
marc_s Avatar answered Sep 27 '22 18:09

marc_s