cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Willem Jiang <>
Subject Re: Multiple JMS services
Date Wed, 08 Aug 2007 06:55:57 GMT
Hi ,

  I just went through the code, and so did some experiments. JMS's 
EndpointInfo is not just came from the Endpoint.publish(address, 
implementor);'s address, the jms transportation related info are all 
come from wsdl extensions.
 So when you use the
    EndpointImpl  endpoint1 = Endpoint.publish(address, implementor1);
    EndpointImpl  endpoint2 = Endpoint.publish(address, implementor2);

   just like the

   will take no effector , and you just get the ChainInitiationObserver 
from the endpoint2 server's destination.

  My suggestion is you need to do some hack work here.

 1. create MultipleEndpointObserver yourself , you can find the sample 
code from the SoapBindFactory's addListener(Destination d, Endpoint e).
       MultipleEndpointObserver newMO;
       MultipleEndpointObserver newMO = new 
MultipleEndpointObserver(getBus()) {
                protected Message createMessage(Message message) {
                    return new SoapMessage(message);

            newMO.getBindingInterceptors().add(new StaxInInterceptor());

            // This will not work if we one of the endpoints disables 
            // processing. But, if you've disabled message processing, you
            // probably aren't going to use this feature.

            // Add in a default selection interceptor

 2. add the first two jms endpoint to the MultipleEndpointObserver's 
endpoint set.

 3. Choice one of the jms endpoint's destination ( which you want 
request and response queue), replace the destination's observer with 
your MultipleEndpointObserver.
 4.  You also need to setup the MediatorInInterceptor for routing work    
        newMO.getRoutingInterceptors().add(new MediatorInInterceptor());

Hope this can help you :)

Willem. wrote:
> Hi
> I have tried to follow the example your are pointing at, but without any luck.
> I have downloaded the latest snapshot.
> When I am starting the server I got:
> org.apache.cxf.transport.ChainInitiationObserver incompatible with org.apache.cxf.transport.MultipleEndpointObserver
> I have tried to "force" a MultipleEnpointObserver on the destination, but the result
of that was the the server just took a random enpoint to handle the request.
> And the logging I have made in the MediatorInInterceptor never showed up :o(
> Willem Jiang-2 wrote:
>> Hi Andersen,
>> As you know the Endpoint.publish(address1, implementor1) 's address1 can 
>> be any string, and it will take no effect if you just use the jms 
>> transport.
>> Because the JMS endpoint address information is got from the wsdl.
>> So back to your question. I just checked the codes, and found the 
>> server-routing.html is out of date :(
>> You can find the latest codes here.
>> (in , you can set the information to the endpoints for the 
>> MediatorInInterceptor to look up)
>> If you like you can try the trunk version or latest snapshot with these 
>> code.
>> Willem.
>> mr.andersen wrote:
>>> Hi
>>> I'm trying to setup a simple server running in a main method.
>>> My goal is to have atleast 2 services, having their own wsdl definition,
>>> but
>>> both using the same request and reply JMS queue.
>>> I have tested that both services can be executed and response with
>>> correct
>>> information seperatly, but I have some problems when I publishing 2
>>> services.
>>> First I tried to follow the example in the Users Guide - 
>>> Service Routing ,
>>> but
>>> each time the MediatorInInterceptor have found the correct targetServer,
>>> no
>>> MessageObserver was available to handle the message (MessageObserver mo =
>>> targetServer.getMessageObserver(); returned a null mo).
>>> My second implementation is like the below, but the server is picking out
>>> a
>>> random service to handle the incoming message.
>>> Is there something I have missed? Or does CXF not support multi services
>>> over JMS yet?
>>> Object implementor1 = new OneImpl();
>>> String address1 =
>>> "{}OnePort.jms-destination";
>>> Endpoint.publish(address1, implementor1);
>>> Object implementor2 = new AnotherImpl();
>>> String address2 =
>>> "{}AnotherPort.jms-destination";
>>> Endpoint.publish(address2, implementor2);
> Quoted from: 

View raw message