我是 Java EE 的新手,几天来一直在为一些基本的中间件概念苦苦挣扎,我相信我可能刚刚对“tings 如何工作”的理解有了突破;这个问题的一部分是要求确认我的发现,另一部分是一个合法的问题;-)。
请确认/澄清:我对服务总线/MOM(面向消息的中间件)的理解是,它们本质上旨在异步处理客户端请求。这与正常的请求-响应周期相反,后者是同步的,通常由某种服务实现。在 Java 中,这样的总线/MOM 可能类似于 Apache Camel,而同步服务可能类似于 EJB(3)。因此,如果客户端需要立即处理请求,HttpRequest
可以转到 Web 服务,然后将请求转发到正确的 EJB;EJB 处理消息并将结果返回给服务,然后服务返回HttpResponse
给客户端。因此,如果客户端有一个不会阻止它们并且只需要处理的请求,则 Web 服务会转发它们的HttpRequest
到服务总线上的某个端点,请求被视为消息,并由各种处理器(过滤器、转换器等)处理。
所以首先,如果我错误地指出 ESB/MOM 解决方案最适合处理异步请求,并且 EJB(同样,3.x)最适合实时响应同步请求,请纠正我;或确认我是正确的。
在这种情况下,在我看来,大型应用程序需要两种类型的后端来处理同步(阻塞)和异步(非阻塞)客户端请求。所以我的理论是让我的后端实现如下:
- 使用成熟的应用服务器,如 JBoss 或 GlassFish
- 在应用服务器的 Web 容器中有两个 WAR:
WebServices.war
和ESB.war
; 分别代表后端“网关”和服务总线 - 在应用服务器的业务容器中有我所有的 EJB
- 现在,
WebService.war
(网关)可以检测是否将请求中继到 ESB 或 EJB
我的第二个问题是:我是否在这里偏离了基础,我是否错过了中间件 101 的基本概念,或者这是一个半途而废的方法?
编辑:从最初的回复中,我已经看到我在两个方面错了:(1)ESB 和 EJB 实际上可以是同步的或异步的,(2)当使用 MDB 时,EJB 可以像连接ESB。
所以这些更正给我带来了一些新的心理障碍:
- 何时使用 ESB,何时使用 MDB/EJB 解决方案;和
- 我真的很喜欢 Apache Camel 的处理器 API(EIP 的实现);我可以使用 MDB/EJB,但在每个 EJB 中只使用 Camel 处理器(
Filter
、WireTap
等)吗?