我有一个系统,其中几个(20个左右)Web应用服务器(托管网站)与相同的2到4个EJB服务器(通过VIP)进行通信。我想知道是否有可能确定哪个应用服务器生成了特定请求。
例如:网站example.com通过向20个应用服务器中的任何一个发送HTTP请求来处理请求。这些服务器名称(内部)app01
到app20
。确保具有相同会话ID的所有请求将路由到同一个应用服务器,从而使我们能够逻辑跟踪来自单个用户的所有请求。一些请求将需要一些不可直接获得的额外数据,在另一个由3个服务器组成的集群上有一个EJB(2.1)应用程序,名为ejb01
到ejb03
。与EJB服务器的连接是通过VIP(ejb00
)建立的,它将请求循环方式路由到三个EJB服务。
在EJB服务器的日志记录(我们使用Apache Log4J)中,如果我能够识别请求源自20个应用服务器中的哪一个,那将是非常好的。另一种方法是单独检查每台服务器上的日志 - 但我没有办法通过20个不同的框上的日志grep
。
我的问题是:这在标准EJB中是否可行?我愿意做一些非标准的事情,如果没有别的,但它必须是可靠的并且在我的系统上工作。我们将Weblogic 11g用于Web应用程序和EJB服务器。
我已经看到了将调用者的身份作为参数传递的建议,但这对于20多个EJB方法中的每一个都是一个额外的参数,而且相当笨拙。
任何解决方案,任何人?
答案 0 :(得分:2)
没有标准的解决方案。 JSR 149中有一项提案,但已被撤回。向远程方法添加额外参数可能是您的最佳选择。如果你正在使用RMI远程,你可能能够编写一个ORB拦截器来在客户端添加自定义上下文,在服务器端接收它,并在服务器上的方法调用周围设置一个本地线程。
WebSphere Application Server有一个名为work areas的非标准解决方案,它适用于远程EJB。
我不熟悉WebLogic,所以我不知道他们是否有类似的解决方案。搜索类似的术语会发现WorkContextMap看起来很相似,但我不知道它是否适用于远程EJB,因为我能找到的所有示例都是针对webservices的。