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

时间:2011-06-20 16:28:53

标签: jpa jboss ejb-3.0 ejb jaas

我们有以下设置:

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

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

首先我想到类似于ThreadLocal变量的东西......我猜在Java EE世界中是禁止的。

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

我希望我的应用程序尽可能“与客户端无关”,它应该只是“注入”正确的配置(如持久化上下文),具体取决于哪个客户端称为服务。逻辑将是相同的,只是它使用的资源是不同的(某种拦截器架构)。

我有点迷茫。任何帮助都非常感谢。

欢呼声 烫发

1 个答案:

答案 0 :(得分:0)

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

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

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

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