ThreadLocal usage in enterprise application

2020-02-25 07:49发布

If my web application and ejb application are on the same machine (on same JVM) and all the ejb calls are local calls , will the use of ThreadLocal create any issue while passing information from web to ejb?

Any workaround if the ejb calls are remote? Will ThreadLocal information be available from web application to ejb application? Is use of ThreadLocal advisable in such scenario?

7条回答
我欲成王,谁敢阻挡
2楼-- · 2020-02-25 08:26

For the first question, there is no problem as long as you remove the ThreadLocal variables at the end of every call. This is important because containers (servlet or ejb) typically use threadpools and therefore reuse threads, this has two effects: one "call" may see threadlocal info coming from a previous call, and if you remove an app from the container without stopping the JVM some classes may not be garbage collected because they are still referenced by a container thread. So put data in a threadlocal in a try / finally block and remove in the finally part.

Here is a post showing one way to handle the problem: ThreadLocal in web applications

For the second question as data is threadlocal it will not come with a remote call, you have to add a parameter to your interfaces, extract threadlocal data on one side and recreate it on the other side...

查看更多
Bombasti
3楼-- · 2020-02-25 08:30

When using EJB 3.1 you can pass around contextual information in the EJBContext using its context data. This is just a Map<String,Object>.

查看更多
别忘想泡老子
4楼-- · 2020-02-25 08:33

For local calls, the ThreadLocal should work fine, as long as everything is done in the same thread.

For remote calls, which can potentially run on a different server, you will need to come up with something else. Either pass all values as parameters (which will work, but introduces complexity in the code) or use something like a distributed cache, e.g. Hazelcast, which will function like a global HashMap, which all cluster nodes have access to.

查看更多
地球回转人心会变
5楼-- · 2020-02-25 08:39

ThreadLocal shouldn't be used in EJB contexts. One cannot guarantee that the EJB method invocations are all on the same thread (of course the should be).

In EJB there is a different approach call TransactionSyncrhonizationRegistry. See Explanation/Usage for further details.

查看更多
Viruses.
6楼-- · 2020-02-25 08:39

ThreadLocal cannot be used with 100% certainty in web applications. You simply do not have the guarantee that one thread will be used for one session. In my point of view this can get a very hard to find security hole!

ctx.getContextData() does not work for me, it always returns null!

I also tried TransactionSynchronizationRegistry, but I get null as well.

The only thing that worked is using JAAS as a workaround.But it is not a nice solution.

查看更多
爷的心禁止访问
7楼-- · 2020-02-25 08:40

It depends what information you are passing! The first question it too generic. I suggest to read the JavaDoc related to ThreadLocal here.

ThreadLocal lives from the server side of the application and are used to let Thread-safe the calls of your Thread objects.

查看更多
登录 后发表回答