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.


[EMAIL PROTECTED] 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

Reply via email to