【发布时间】:2012-06-24 19:15:17
【问题描述】:
我是 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等)吗?
【问题讨论】:
-
异步并不意味着“一劳永逸”,因为生产者可以设置一个回复通道并等待该通道上的响应。
-
谢谢@opyate - 你能告诉我异步 是什么 意味着什么吗?而且我假设相反的情况是不正确的:原始状态的 EJB 不能以类似总线的方式连接在一起,对吗?我的理解是,EJB 是独立的服务,而不是中间件的“链上链接”......
-
您可以使用 ejb 轻松构建复合服务,调用其他 ejb 链,然后返回。然而,这对于异步请求来说有点棘手。 ESB 软件 - 至少 - 专为这些任务而设计
-
关于你的最后一个问题。你为什么不把你的 EJB 和骆驼粘在一起呢?最好尽可能多地使用 MDB。然后,您将拥有 EJB 中的所有业务逻辑和 Camel 中的整个集成层。保持您的业务逻辑没有过多的集成逻辑总是好的。
标签: java ejb-3.0 soa apache-camel middleware