cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Willem Jiang <ning.ji...@iona.com>
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

  https://svn.apache.org/repos/asf/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/versioning/Server.java
 

   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()) {
                @Override
                protected Message createMessage(Message message) {
                    return new SoapMessage(message);
                }
            };

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

            // This will not work if we one of the endpoints disables 
message
            // processing. But, if you've disabled message processing, you
            // probably aren't going to use this feature.
            newMO.getBindingInterceptors().add(new 
ReadHeadersInterceptor(getBus()));

            // Add in a default selection interceptor
            newMO.getRoutingInterceptors().add(new 
EndpointSelectionInterceptor());

 2. add the first two jms endpoint to the MultipleEndpointObserver's 
endpoint set.
       
        newMO.getEndpoints().add(endpoint1.getServer().getEndpoint());
        newMO.getEndpoints().add(endpoint2.getServer().getEndpoint());

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

Hope this can help you :)

Willem.
 

xma@bec.dk 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 Server.java , you can set the information to the endpoints for the 
>> MediatorInInterceptor to look up)
>>
>> https://svn.apache.org/repos/asf/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/versioning/Server.java
>> https://svn.apache.org/repos/asf/incubator/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/versioning/MediatorInInterceptor.java
>>
>>
>> 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 - 
>>> http://cwiki.apache.org/CXF20DOC/service-routing.html 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 =
>>> "{http://cxf.apache.org/jms_endpt}OnePort.jms-destination";
>>> Endpoint.publish(address1, implementor1);
>>>
>>> Object implementor2 = new AnotherImpl();
>>> String address2 =
>>> "{http://cxf.apache.org/jms_endpt}AnotherPort.jms-destination";
>>> Endpoint.publish(address2, implementor2);
>>>   
>>>       
>>     
> Quoted from: 
> http://www.nabble.com/Multiple-JMS-services-tf4228402.html#a12031068
>
>   

Mime
View raw message