You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by "mr.andersen" <xm...@bec.dk> on 2007/08/07 08:31:22 UTC

Multiple JMS services

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);
-- 
View this message in context: http://www.nabble.com/Multiple-JMS-services-tf4228402.html#a12029152
Sent from the cxf-user mailing list archive at Nabble.com.


Re: Multiple JMS services

Posted by Willem Jiang <ni...@iona.com>.
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);
>   

Re: Multiple JMS services

Posted by "mr.andersen" <xm...@bec.dk>.
Thanks Willem

Now it is possible for me to choose the correct endpoint.



Willem Jiang-2 wrote:
> 
> 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
>>
>>   
> 
> 

-- 
View this message in context: http://www.nabble.com/Multiple-JMS-services-tf4228402.html#a12066792
Sent from the cxf-user mailing list archive at Nabble.com.