Thanks a lot Daniel,
with your reply, I was able do what I needed.
Here it is in case someone else needs it:
-----
List<String> cookies = null;
while(true) {
// Send cookies if available
if (cookies != null) {
Map<String, List<String>>
requestHeaders = new HashMap<String,
List<String>>();
requestHeaders.put("Cookie", cookies);
((BindingProvider)client).getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS,
requestHeaders);
}
String result = client.sayHi("Hello");
// Fetch cookies set by server
Map<String, List<String>> responseHeaders =
(Map<String, List<String>>)
((BindingProvider)client).getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS);
cookies = responseHeaders.get("Set-Cookie");
}
-----
For this to work, the thread local request context must be activated:
((BindingProvider)client).getRequestContext().put("thread.local.request.context",
Boolean.TRUE);
Here are the results of my tests:
thread.local.request.context without SESSION_MAINTAIN_PROPERTY -> every
request of each thread uses a new session
SESSION_MAINTAIN_PROPERTY without thread.local.request.context -> only one
session shared across all the requests of all the thread
SESSION_MAINTAIN_PROPERTY with thread.local.request.context -> idem, only
one session shared across all the requests of all the thread
I think the behavior I achieved (session shared across requests of same
thread) should be the one we get when setting both parameters
SESSION_MAINTAIN_PROPERTY and thread.local.request.context
The shared session across all threads behaviour should be applied for
SESSION_MAINTAIN_PROPERTY without thread.local.request.context
Does it make sense?
Thanks again
--
Arnaud
dkulp wrote:
>
>
> The BindingProvider has a getResponseContext() call that returns a Map.
> In
> the map should be a MessageContext.RESPONSE_HEADERS (or something like
> that)
> that would be the HTTP headers for the response. You would need to walk
> through them and find the cookie and such. To send it is just the
> reverse.
> Create a map, set the headers in there, the set it in the
> getRequestContext()
> of the BindingProvider.
>
> You MAY need to tell the conduit to not maintain the session. Otherwise,
> it
> may overwrite your cookie. Since you are going to handle it, no point in
> having it do it anyway.
>
> Dan
>
>
> On Friday 25 June 2010 6:47:29 pm Arnaud DSA wrote:
>> Hi,
>>
>> I used the cxf+spring sample :
>> http://cxf.apache.org/docs/writing-a-service-with-spring.html
>>
>> And I need to:
>> - share a the proxy amongst different threads
>> - maintain sessions for each thread as I need to call three functions in
>> sequence: login/execute/logout
>>
>> But I see in the doc
>> (http://cxf.apache.org/faq.html#FAQ-AreJAXWSclientproxiesthreadsafe?)
>> that
>> the proxy is not thread safe in this case:
>> -----
>> * Session support - if you turn on sessions support (see jaxws spec),
>> the
>> session cookie is stored in the conduit. Thus, it would fall into the
>> above
>> rules on conduit settings and thus be shared across threads.
>> For the conduit issues, you COULD install a new ConduitSelector that uses
>> a
>> thread local or similar. That's a bit complex though.
>> -----
>> The doc mentions a "complex" solution but I could not fin more
>> information
>> on this.
>>
>>
>> I tried to manually handle the cookie by fetching it into a thread local
>> and putting it back on each request instead of using maintainSession, but
>> I could not get the session cookie from the client.
>>
>> My client is loaded from spring like this:
>> -----
>> <?xml version="1.0" encoding="UTF-8"?>
>> <beans xmlns="http://www.springframework.org/schema/beans"
>> xmlns:jaxws="http://cxf.apache.org/jaxws"
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>> xsi:schemaLocation="
>> http://www.springframework.org/schema/beans
>> http://www.springframework.org/schema/beans/spring-beans.xsd
>> http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
>>
>> <jaxws:client id="helloClient"
>> serviceClass="demo.spring.HelloWorld"
>> address="http://localhost:9002/HelloWorld" />
>> </beans>
>> -----
>> ApplicationContext context = new
>> ClassPathXmlApplicationContext("client.xml");
>> HelloWorld client = (HelloWorld) context.getBean("helloClient");
>> -----
>>
>> I can cast the client to a BindingProvider, but I did not find a way to
>> fetch the session cookie from here:
>> BindingProvider bp = (BindingProvider) client;
>>
>> Could someone tell me how to fetch and set the session cookie from the
>> client, or point me to another solution?
>>
>> Thanks in advance.
>> --
>> Arnaud
>
> --
> Daniel Kulp
> [email protected]
> http://dankulp.com/blog
>
>
--
View this message in context:
http://old.nabble.com/Maintaining-session-in-multi-threaded-application-for-Spring-jaxws-client-tp28997255p29012789.html
Sent from the cxf-user mailing list archive at Nabble.com.