我们正在开发一个企业应用程序。所有服务都将作为Restful Web服务公开。业务逻辑用ejbs编写。我们必须从ejbs调用许多后端系统。后端再次是我们组织中各种应用程序/团队公开的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上的拦截器。
有没有办法在运行时引入拦截器而不是在开发过程中注释方法?
答案 0 :(得分:0)
有一种方法可以在ProcessAnnotatedType
- 阶段在运行时添加拦截器(参见例如this SO-question)。但据我了解你的问题,你想在每次ejb调用时切换一个拦截器。
在绕过拦截器之前,我会重新考虑它给我的代码带来的好处。它不仅增加了一些功能,还记录了它。每当一个方法被注释时,例如@LogTransactionDetails
,那么应该绝对清楚你的交易细节被记录。每当你使用一些运行时魔法解决这个问题时,它会在几个月,几周,几天之后混淆。
所以我更喜欢stg建议的附加图层。它将阐明您的代码和业务边界。
但是如果你的用例中没有这个选项:你已经在你的拦截器中使用EJBContext
了。您可以在调用BL_EJB3时在NoNeedForLogging
中添加其他标记EJBContext#getContextData()
,并使用InvocationContext#getContextData()
在拦截器中引用它。