users@jersey.java.net

[Jersey] Re: Thread safe question for Jersey client - aka Java threading 101

From: Jakub Podlesak <jakub.podlesak_at_oracle.com>
Date: Fri, 12 Dec 2014 15:51:40 +0100

Hi Moises,

There should be no problem in re-using your Jersey web target in multiple threads.
Should you want to e.g. “change” a property of given target (target.property(…)),
the new “state" would be propagated to the returned instance only.
You should be on the safe side then in this regard.

HTH,

~Jakub

On 12 Dec 2014, at 01:09, Moises Lejter <moilejter_at_gmail.com> wrote:

> But the question is not just whether Jersey itself is thread-safe, but whether this code that calls it would be. And I think the answer to that latter is "no" ... If the instance that has the
> jerseyTarget variable can be used by multiple threads, it is possible that from any one thread's perspective, the value of the variable could change in between two uses of that variable in that thread - which probably is not what the thread expected would happen?
>
> I would think either that instance that has the jerseyTarget is already itself MT-safe, or you could do things like making jerseyTarget use ThreadLocal storage, so that different threads would each get their own instance...
>
> Moises
>
>
> On Thu, Dec 11, 2014 at 11:38 AM, cowwoc <cowwoc_at_bbs.darktech.org> wrote:
> Hi Damian,
>
> I don't see why either case is a threading problem.
>
> If Client and WebTarget are thread-safe (JAX-RS doesn't indicate either way, but unofficially they are supposed to be) then either approach would work fine.
>
> Gili
>
>
> On 11/12/2014 11:32 AM, Sobieralski, Damian Michael wrote:
> I have a question about thread safety here. This is a much lower level discussion than what have been reading here and touches on Java threading 101.
>
> In a backend service object (we have something like this - this object sits in a servlet container):
>
> protected Client jerseyClient = null;
> protected WebTarget jerseyTarget = null;
>
> These are class variables. This is normally a warning flag for threading issues
>
> Then we have code like this:
>
> protected void readyConnection() throws Exception {
> jerseyClient = ClientBuilder.newBuilder().register(JacksonFeature.class).build();
>
> jerseyTarget = jerseyClient.target(baseUrl).path("api").path("v1");
> }
>
> and methods that use jerseyTarget. Is this a bad idea thread wise? It seems like jersey client is fine being a class variable. But that jerseyTarget in this ready method instead of setting the class variable jerseyTarget should return its own jerseyTarget.
>
> So, is it better to do this?
>
> protected WebTarget readyConnection() throws Exception {
> jerseyClient = ClientBuilder.newBuilder().register(JacksonFeature.class).build();
>
> return jerseyClient.target(baseUrl).path("api").path("v1");
> }
>
> - Damian
>
>
>