Hi Dan, As per your and Ulhas's reply, I am able to create a Service which can publish to the Loal address. I am also able to capture the Message published from the client, in the observer of the LocalDestination. Thank you very much for that.
Here is what I am trying to do, I work on a platform which does IPC in a way. For this it provides Java API to transfer data(bytes) from one process to another. Instead of writing a custom transport I want to use the LocalTransport facility of CXF. Thanks to you two I can do the following: 1.) I can post SOAP messages to a JAX-WS service from the LocalConduit (LocalConduit.prepare() and LocalConduit.close() and catch the response of JAX-WS service Implementation in the LocalConduit's Message Observer. (I wait for IPC messages in the LocalConduit's Message Observer). 2.) I can receive the JAX-WS Client's messages in the LocalDestination's MessageObserver. 3.) What I can do now is, intercept the Client's messages in Step 2.) do an IPC to the Service in Step 1.), receive the response in Step 2.)'s Message Observer. 4.) Now I am stuck, how do I send the response from LocalDestination's MessageObserver to the JAX-WS Client ? Where should I look for, I think I should do some Interceptors and Phases. Kindly let me know, how to send the response back to the JAX-WS Client. Regards Bharath. dkulp wrote: > > > Bharath, > > It's relatively simple..... > > Service service = new Service(seviceName); > service.addPort(portName, > "http://schemas.xmlsoap.org/soap/", > "local://localhost:9090/hello"); > HelloInterface proxy = service.getPort(portName, HelloInterface.class); > > Basically, use the same URL as you did for the server side publish. > > > Dan > > > > On Fri April 24 2009 6:29:07 am Bharath Gargesh wrote: >> Hi Dan, >> I wanted to write my own transport, but then I saw your reply to this >> thread and found out a way to do this. >> But only that I was able to go half way through. >> On the Server side I did the following: >> 1.) Develop a JAX-WS and publish it to a local address. >> 2.) Got a handle to the LocalConduit through the Default Bus >> 3.) Registered a Listener to the Conduit. >> 4.) Prepare a SOAP Message for calling the JAX-WS, publish it >> to the Conduit.close() and the reply SOAP Message from the JAX-WS >> was got in the Listener. >> >> This is absolutely fine, the only thing that I need to do is, construct a >> SOAP Message to invoke the JAX-WS. >> But I want to use the JAX-WS Client generated to be able to publish the >> message to the Local transport. >> How can I force/use the JAX-WS client to put the message into the Local >> transport ? >> >> Can you please give me an Idea on how to do this for the JAX-WS client >> too. >> >> Regards >> Bharath >> >> dkulp wrote: >> > Marcel, >> > >> > You can actually use the Local transport for this as well. We have >> > several tests that do this exact thing. >> > >> > We have a TestUtilities class: >> > >> http://svn.apache.org/repos/asf/cxf/trunk/rt/core/src/main/java/org/apach >> >e/cxf/test/TestUtilities.java Look in the "invokeBytes" message which >> > could show you how to invoke a "local" service using raw data. The >> > invokeBytes takes a string message in and returns a byte[], but it >> would >> > be very easy to replace that with streams or a DOM or something >> similar. >> > >> > Dan >> > >> > On May 26, 2008, at 8:09 AM, Heemskerk, Marcel (M.) wrote: >> >> Hello Dan and CXF, >> >> >> >> I've been looking in the documentation and still it's quite fuzy for >> >> me. >> >> >> >> What i need is the following: >> >> >> >> We work WSDL first, so i have to stick to a certain XML format. From >> >> this i generate an HTTP service implementation. It contains (for >> >> example) the following pojo: >> >> >> >> >> ------------------------------------------------------------------------ >> >> -------- >> >> package com.sample; >> >> import javax.jws.WebService; >> >> >> >> @WebService(endpointInterface = "com.sample.WSInterface", >> >> targetNamespace = "http://com.sample/Calculator") >> >> public class Calculator { >> >> public CalculatorResult calculate(CalculatorQuestion q) { >> >> return new CalculatorResult(q); >> >> } >> >> } >> >> >> ------------------------------------------------------------------------ >> >> -------- >> >> >> >> This is deployed as web service: >> >> >> >> >> ------------------------------------------------------------------------ >> >> -------- >> >> <bean id="calculatorBean" class="com.sample.Calculator"/> >> >> >> >> <jaxws:endpoint >> >> id="calculatorService" >> >> implementor="#calculatorBean" >> >> address="/" >> >> wsdlLocation="/WEB-INF/wsdl/calculator.wsdl" >> >> serviceName="tns:calc" >> >> xmlns:tns="http://com.sample/Calculator"/> >> >> >> ------------------------------------------------------------------------ >> >> -------- >> >> >> >> >> >> What i want to do, is call the service through the JVM (thus NOT >> >> through >> >> HTTP), with plain SOAP XML as input and plain XML as output, including >> >> custom SOAP Headers, WS-Security headers, and what not. >> >> >> >> If i use local transport i am stuck with the "Java interface" with >> >> CalculatorQuestion and CalculatorResult. >> >> >> >> Which are the absolute minimum classes i need to implement? >> >> >> >> >> >> Thanks a lot for your info! >> >> >> >> - Marcel >> >> >> >> >> >> >> >> >> >> >> >> >> >> -----Oorspronkelijk bericht----- >> >> Van: Daniel Kulp [mailto:dk...@apache.org] >> >> Verzonden: woensdag 7 mei 2008 6:09 >> >> Aan: dev@cxf.apache.org >> >> Onderwerp: Re: Writing my own transport >> >> >> >> >> >> >> >> Depending on what you need to do, you may not need all of the below >> >> classes. >> >> >> >> For example, the CachedXXXputStream stuff may not be necessary >> >> depending on your protocol and current stream implementations. >> >> Actually, in most cases, you DON'T want to use that. Instead, use a >> >> subclass of the AbstractWrappedOutputStream or your own stuff. >> >> >> >> The TransportFactory is technically not required either. It depends >> >> on what you need to do. >> >> >> >> If you only need to write a client to talk to an existing service, you >> >> need a Conduit and a ConduitInitiator. >> >> >> >> Likewise, if you need to write a server only, you just need a >> >> Destination and DestinationFactory. The TransportFactory is >> >> basically a convienience if you need both as it can be the >> >> ConduitInitiator and the DestinationFactory in on. >> >> >> >> >> >> Most of the "Logic" occurs in the Conduit/Destination objects. >> >> Generally, the Conduit.prepare adds an OutputStream to the method that >> >> does a couple things: >> >> >> >> 1) On the first write, it will do whatever header processing stuff is >> >> needed. For HTTP, it sets the HTTP headers. >> >> >> >> 2) On the close, it can do one of: >> >> a) wait for the response and call the listener directly. The >> >> http conduit does this. It's generally the faster way to do it in >> >> most cases. >> >> b) Just send the message if there is some other asyncronous way >> >> that the response will come in and have the message listener called. >> >> The local transport does this. >> >> >> >> The AbstractWrappedOutputStream makes some of the above easier by >> >> providing callbacks for those events, but it can be any stream. >> >> >> >> >> >> >> >> Dan >> >> >> >> On May 6, 2008, at 9:24 PM, Freeman Fang wrote: >> >>> Hi Marcel, >> >>> Assume the transport you want to implement is AAA, basically you >> >>> need several class as below >> >>> >> >>> AAAConduit extends AbstractConduit, kinda like your transport >> >>> client >> >>> >> >>> AAADestination extends AbstractDestination, your transport >> >>> destination >> >>> AAAConduitOutputStream extends CachedOutputStream, send out client >> >>> request, you should use your transport api to send out request in >> >>> this class >> >>> AAADestinationOutputStream extends CachedOutputStream, send out >> >>> server response, you should use your transport api to send out >> >>> response in this class >> >>> AAATransportFactory, factory to get Conduit and Destination, also >> >>> you need a transport_id to distinguash your transport >> >>> >> >>> You can take a look at org.apache.cxf.transport.jbi which should be >> >>> like your scenario >> >>> >> >>> Freeman >> >>> >> >>> Marcel Heemskerk wrote: >> >>>> I have a service 'service1' listening to HTTP. I would like be >> >>>> able to make >> >>>> a new transport for this service, so i can use a propietary >> >>>> transport >> >>>> protocol to receive the InputStream and send the OutputStream to. >> >>>> The >> >>>> received message is SOAP, so i just want to send it into the CXF >> >>>> marshalling >> >>>> layer to have deserialized to a SOAP header with >> >>>> javax.xml.ws.Holder and >> >>>> SOAP response, etc... >> >>>> >> >>>> It should be simple, because i want to re-use the existing >> >>>> 'service1' >> >>>> >> >>>> binding, JAXB, etc. However, it does not seem obvious. I've been >> >>>> trying to >> >>>> reverse engineer the JMS transport or HTTP transport but no luck so >> >>>> far. >> >>>> Could someone point out to me the relevant files or a tutorial on >> >>>> this >> >>>> matter? >> >>>> >> >>>> Thanks, >> >>>> Marcel >> >> >> >> Daniel Kulp >> >> dk...@apache.org >> >> http://www.dankulp.com/blog >> > >> > --- >> > Daniel Kulp >> > dk...@apache.org >> > http://www.dankulp.com/blog > > -- > Daniel Kulp > dk...@apache.org > http://www.dankulp.com/blog > > -- View this message in context: http://www.nabble.com/Writing-my-own-transport-tp17088528p23228798.html Sent from the cxf-dev mailing list archive at Nabble.com.