客户端(Tomcat)调用无状态会话Bean(JBoss),如何处理客户端标识符



我们有以下设置:

  • Tomcat(Web App)调用JBoss 5.1.0 EAP(EJB 3.0)中的服务(无状态会话Bean)
  • JBoss有两个使用两个不同数据库定义的不同Persistence上下文
  • JBoss服务需要知道是哪个客户端调用了它的服务,比如标识符(多租户?)

我们可以更改Jboss端的所有服务方法,以接受客户端标识符作为参数。然后我们需要更改服务中的每一个可能的方法调用来传输这个标识符,这对我来说太麻烦了。

首先,我想到了类似于ThreadLocal变量的东西。。。我想这在Java EE的世界里是被禁止的。

你们知道"传输"客户端标识符的优雅解决方案吗?我认为JAAS做了类似的事情,通过过滤来自"外部"世界的每个呼叫,并将用户凭据应用于每个呼叫。一旦调用进入"Jboss服务世界",所有后续的方法调用都具有调用者标识。

我希望我的应用程序尽可能"与客户端无关"——它应该根据调用服务的客户端来"注入"正确的配置(如持久性上下文)。逻辑是一样的,只是它使用的资源不同(某种拦截器架构)。

我有点迷路了。我们非常感谢您的帮助。

欢呼marcel

从@AroundInvoke拦截器,您应该能够通过检查InvocationContext.getContextData()的内容来检测Web服务,该内容根据JAX-WS规范与Web服务上下文共享。您仍然需要在内部传播它。

Java EE中的ThreadLocal并不一定是坏的,只要你记得自己清理:

tl.set(something);
try {
  deepMethodCallHierarchy();
} finally {
  tl.remove();
}

(当然,显式传递上下文可能是最干净的。)

最新更新