2016-08-03 37 views
3

我们正在开发一个企业应用程序。所有服务将作为Restful Web服务公开。业务逻辑是用ejbs编写的。我们必须从ejbs调用许多后端系统。后端又是来自我们组织中各种应用程序/团队的Web服务。是否可以在ejbs中添加拦截器?

下面是一个简单的流程

WS1 < - > BL_EJB1 < - > BE_EJB1

当WS是web服务,BL是业务逻辑和BE是后端。

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

由于此日志记录对于每个服务都很常见,因此我们引入了拦截器来记录事务表中的细节。拦截器和ejbs通过EjbContext交换数据。下面是修改后的流动

WS1 < - >拦截器(BL_EJB1)< - >拦截器(BE_EJB1)

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

有什么办法在运行时引入拦截器,而不是在开发过程中注释该方法吗?

+1

你的应用程序中的附加层怎么样(而不是使用拦截器)? WS1在日志记录等完成时调用较高的外观层,高层外观层从实际业务逻辑完成的较低层调用方法。来自下层的其他服务可以互相呼叫而不通过较高的外观层。 – stg

回答

0

有一种方法可以在运行时添加拦截器,在ProcessAnnotatedType -Phase(请参阅例如this SO-问题)。但据我了解你的问题,你想切换每个ejb调用拦截器。

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

所以我更喜欢一个额外的层,因为建议。它会澄清你的代码和你的业务界限。

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

相关问题