Hi Dan

On Mon, 9 Feb 2009 16:43:35 -0500
Daniel Kulp <[email protected]> wrote:

> 
> Basically, if you set all the conduit properties ONCE up front and also don't 
> use http sessions and all use either http or https, but not both, then you 
> can 
> do this.   Do:
> 
> ((BindingProvider)proxy).getRequestContext().put("thread.local.request.context",
>  
> "true");
> 
> as part of the setup.   That will make the RequestContext thread local.  
> Then, 
> each thread can do:
> 
> 
> ((BindingProvider)proxy).getRequestContext().put(
>     BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
>     "http://my.url.to.somplace";);
> 
> and that will be fine.
> 
> If you need to setup unique valued per request other than just the URL, then 
> I 
> suggest using a pool of client proxies.   Create a few and pool them.
> 
> Dan

Performance is a secondary goal. First everything has to work absolutely 
correctly
with an unknown number of endpoints and its configuration.

The following test-code seems to do what I want (debugger verified). Also it 
seems to be possible to
use http AND https with it:

public class TestHttpConduit {

    private static final QName serviceName = new QName(
            
"http://www.swissdec.ch/schema/sd/20051002/SalaryDeclarationService";, 
"SalaryDeclarationService");
    private static final QName portName = new QName(
            
"http://www.swissdec.ch/schema/sd/20051002/SalaryDeclarationService";, 
"SalaryDeclaration");

    private URL wsdl = 
getClass().getResource("/wsdl/wsdl/SalaryDeclarationService.wsdl");
    private SalaryDeclarationService salaryDeclarationService = new 
SalaryDeclarationService(wsdl);

    public TestHttpConduit() {

        SalaryDeclarationPort salaryDeclarationPort = 
salaryDeclarationService.getSalaryDeclaration();
        System.out.println("Port: " + salaryDeclarationPort.hashCode());
        Client client = ClientProxy.getClient(salaryDeclarationPort);
        System.out.println("Client: " + client.hashCode());
        //((ClientImpl)client).setSynchronousTimeout(1000);
        HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
        System.out.println("Conduit: " + httpConduit.hashCode());

        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        //httpClientPolicy.setConnectionTimeout(1);
        //httpClientPolicy.setReceiveTimeout(1);

        httpConduit.setClient(httpClientPolicy);

        try {
            Map context = new HashMap();
            Map requestContext = new HashMap();
            context.put(Client.REQUEST_CONTEXT, requestContext);
            requestContext.put(Message.ENDPOINT_ADDRESS, 
"http://localhost:9001/refapps-receiver/SalaryDeclarationService";);
            PingType pingType = new PingType();
            pingType.setEcho("HAAAAAAALLLLLLLLLLLOOOOOOOOOOO");

            QName qName = new 
QName(SalaryDeclarationService.SERVICE.getNamespaceURI(), 
Constants20051002.Operation.Ping.name());
            BindingOperationInfo op = 
client.getEndpoint().getEndpointInfo().getBinding().getOperation(qName);

            PingType pingresponseType = (PingType) client.invoke(op, new 
Object[]{pingType}, context)[0];
            System.out.println(pingresponseType.getEcho());

            salaryDeclarationPort.ping(pingType);
        } catch (SoapFault soapFault) {
            System.out.println(soapFault);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++){
            new TestHttpConduit();
        }
    }
}

For every iteration I get a new client, httpConduit and port. Any objections?

Unfortunately I came to the conclusion that a very important feature is missing:
Expect: 100-continue

How do others handle e.g. the case with two-way-ssl (mutual-authentication) on 
a Apache <Location> ?

So thats the killer criteria. It seems I have to stick with XFire and 
commons-http.

Dan, any ideas?

Thanks a lot!

Marc


> 
> 
> 
> 
> On Fri February 6 2009 1:17:55 pm Marc Giger wrote:
> > Hi,
> >
> > Is the following code (copied from the user-docs) thread safe?
> >
> > import org.apache.cxf.endpoint.Client;
> >   import org.apache.cxf.frontend.ClientProxy;
> >   import org.apache.cxf.transport.http.HTTPConduit;
> >   import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
> >   ...
> >
> >   URL wsdl = getClass().getResource("wsdl/greeting.wsdl");
> >   SOAPService service = new SOAPService(wsdl, serviceName);
> >   Greeter greeter = service.getPort(portName, Greeter.class);
> >
> >   // Okay, are you sick of configuration files ?
> >   // This will show you how to configure the http conduit dynamically
> >   Client client = ClientProxy.getClient(greeter);
> >   HTTPConduit http = (HTTPConduit) client.getConduit();
> >
> >   HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
> >
> >   httpClientPolicy.setConnectionTimeout(36000);
> >   httpClientPolicy.setAllowChunking(false);
> >   httpClientPolicy.setReceiveTimeout(32000);
> >
> >   http.setClient(httpClientPolicy);
> >
> >   ...
> >   greeter.sayHi("Hello");
> >
> >
> > Not that I have found any issue with it, but I want to
> > be sure that it's intended to be.
> >
> > The requirement is to invoke multiple Endpoints in parallel where
> > every EP has its own configuration (SSL-Client-Authentication,
> > timeouts, url, expect-100-continue, etc). The whole configuration
> > must be made at runtime, because the EP aren't known at startup time.
> >
> > Thank you!
> >
> > Marc
> 
> -- 
> Daniel Kulp
> [email protected]
> http://www.dankulp.com/blog


-- 

itServe AG
Marc Giger
Länggassstrasse 26
3000 Bern 9
Tel.: +41 31 305 16 16
Fax:  +41 31 305 16 17

Direkt +41 31 305 43 27
Email [email protected]

http://www.itserve.ch

Reply via email to