【问题标题】:Is it possible to add interceptors programmatically in ejbs?是否可以在 ejbs 中以编程方式添加拦截器?
【发布时间】:2016-08-03 05:53:19
【问题描述】:

我们正在开发一个企业应用程序。所有服务都将作为 Restful Web 服务公开。业务逻辑是用 ejbs 编写的。我们必须从 ejb 调用许多后端系统。后端同样是从我们组织中的各种应用程序/团队公开的 Web 服务。

下面是一个简单的流程

WS1 BL_EJB1 BE_EJB1

其中WS是Web服务,BL是业务逻辑,BE是后端。

我们将整个事务保存在名为 reporting_stats 和 failure_stats 的表中。它们基本上包含用户详细信息,例如用户 id、请求进入的时间、发送响应的时间、已调用的 Web 服务的路径、已从业务逻辑调用的后端名称、状态后端调用的时间,例如从后端获得响应所花费的时间,后端的响应是否成功等。

由于这种日志记录对于每个服务都是通用的,因此我们引入了拦截器来记录表中的事务详细信息。拦截器和 ejbs 通过 EjbContext 交换数据。下面是修改后的流程

WS1 拦截器(BL_EJB1) 拦截器(BE_EJB1)

在某些情况下,我们必须从 BL_EJB3 调用 BL_EJB1 和 BL_EJB2。在这种情况下,我们不希望触发 BL_EJB1 和 BL_EJB2 上的拦截器。

有没有办法在运行时引入拦截器而不是在开发过程中对方法进行注解?

【问题讨论】:

  • 在你的应用程序中增加一层怎么样(代替或除了使用拦截器)? WS1 调用完成日志等的较高外观层,较高外观层从完成实际业务逻辑的较低层调用方法。来自较低层的其他服务可以在没有通过较高的外观层的情况下相互调用。

标签: jakarta-ee ejb-3.0 java-ee-6


【解决方案1】:

有一种方法可以在运行时在ProcessAnnotatedType-Phase 中添加拦截器(参见例如this SO-question)。但据我了解您的问题,您希望为每个 ejb 调用切换一个拦截器。

在绕过拦截器之前,我会重新考虑它给我的代码带来的好处。它不仅增加了一些功能,还记录了它。每当一个方法被 @LogTransactionDetails 注释时,那么你的交易细节应该是绝对清楚的被记录了。每当你用一些运行时魔法来解决这个问题时,几个月、几周、几天后都会让人感到困惑。

所以我更喜欢 stg 建议的附加层。它将阐明您的代码和业务边界。

但如果在您的用例中这不是选项:您已经在拦截器中使用EJBContext。您可以在调用 BL_EJB3 时在 EJBContext#getContextData() 中添加一个附加标志 NoNeedForLogging,并使用 InvocationContext#getContextData() 在您的拦截器中引用它。

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多