【发布时间】: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