我是Java EE的新手,最近几天一直在努力理解一些基本的中间件概念,我认为我可能已经有了关于“如何工作”的重大突破。这个问题的一部分是请求确认我的发现,另一部分则是一个合法的问题。
请确认/澄清:我对服务总线/MOM(消息导向中间件)的理解是它们天生就是用于异步处理客户端请求。这与通常由某种服务实现的同步请求-响应周期不同。在Java中,这样的总线/MOM可以是像Apache Camel这样的东西,而同步服务可以是像EJB(3)这样的东西。因此,如果客户端需要立即处理请求,则
请确认/澄清:我对服务总线/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 ,分别代表后端“网关”和服务总线
- 在应用程序服务器的业务容器中拥有所有的EJBs
- 现在, WebService.war (网关)可以检测是否将请求转发到ESB或EJBs。
我的第二个问题是:我完全偏离了基本的中间件概念吗?还是这是一个半可行的方法?
编辑:从最初的回复中,我已经看到我在两个方面错了:(1)ESB和EJB实际上可以是同步或异步的;(2)使用MDB时,可以将EJB连接起来,就像ESB一样。
所以这些更正为我带来了一些新的思维障碍:
- 何时选择使用ESB,何时选择使用MDB/EJB解决方案;以及
- 我非常喜欢Apache Camel的Processors API(EIPs的实现);我能否在每个EJB内部使用Camel处理器(
Filter
,WireTap
等),但仍然使用MDB/EJB?