【问题标题】:How can I identify the client or caller of an EJB within the request?如何在请求中识别 EJB 的客户端或调用者?
【发布时间】:2014-10-20 23:01:16
【问题描述】:

我有一个系统,其中几个(20 个左右)Web 应用程序服务器(托管一个网站)与相同的 2 到 4 个 EJB 服务器(通过 VIP)通信。我想知道是否可以确定其中哪一个应用服务器生成了特定请求。

例如:网站 example.com 通过向 20 个应用服务器中的任何一个发送 HTTP 请求来处理请求。这些服务器被命名为(内部)app01app20。确保所有具有相同会话 ID 的请求都将被路由到同一个应用服务器,从而使我们能够在逻辑上跟踪来自单个用户的所有请求。一些请求将需要一些无法直接获得的额外数据,为此在另一个由 3 个服务器组成的集群上有一个 EJB (2.1) 应用程序,名为 ejb01ejb03。与 EJB 服务器的连接是通过 VIP (ejb00) 建立的,它将请求以循环方式路由到三个 EJB 服务。

在 EJB 服务器的日志记录(我们使用 Apache Log4J)中,如果我能识别出请求来自 20 个应用服务器中的哪一个,那就太好了。另一种方法是分别检查每台服务器上的日志 - 但我没有通过 20 个不同盒子上的日志来grep 的好方法。

我的问题是:这在标准 EJB 中是否可行?如果没有别的东西,我愿意做一些非标准的事情,但它必须是可靠的并且可以在我的系统上运行。我们将 Weblogic 11g 用于 Web 应用程序和 EJB 服务器。

我看到了将调用者的身份作为参数传递的建议,但这意味着 20 多个 EJB 方法中的每一个都需要一个额外的参数,这相当笨拙。

任何解决方案,任何人?

【问题讨论】:

  • 我建议您查看LogStash。您可以将它安装在与您的 Weblogic 服务器相同的盒子上。希望 Weblogic 有一个像 Tomcat 的 AccessLogValve 这样的记录器。然后,您可以通过这种方式注销每个请求。要确定是谁发出请求,您可以为 20 个应用服务器中的每一个设置“用户代理”。
  • @hooknc:我们最近开始使用 Splunk,它确实使查看日志变得更加容易(并且每个 EJB 调用 都被记录),但日志的时间可能是几秒钟后,在客户端/服务器端配对日志非常乏味,但这就是我在此期间要做的事情。不过,谢谢。

标签: java jakarta-ee ejb weblogic


【解决方案1】:

没有标准解决方案。 JSR 149有提案,但被撤回。向远程方法添加一个额外的参数可能是您最好的选择。如果您使用 RMI 远程,您可以编写一个 ORB 拦截器来在客户端添加自定义上下文,在服务器端接收它,并在服务器上围绕方法调用设置一个本地线程。

WebSphere Application Server 有一个名为 work areas 的非标准解决方案,它适用于远程 EJB。

我对WebLogic不熟悉,所以不知道他们有没有类似的解决方案。搜索类似术语会找到一个看起来类似的WorkContextMap,但我不知道它是否适用于远程 EJB,因为我能找到的所有示例都是针对 web 服务的。

【讨论】:

  • 我很害怕 ;-( 所以我必须弄清楚如何连接不相交的日志。哦,好吧。我想这意味着我也可以为这些时间计费 ;-)
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2016-05-06
  • 2019-08-28
  • 2013-07-03
相关资源
最近更新 更多