如何在集群中连接消息驱动的 Bean
企业 Bean (EJB) 应用程序部署至应用程序服务器集群时,应用程序可在集群中的任一服务器上运行,以提供应用程序的高可用性和可伸缩性。EJB 应用程序是消息驱动的 Bean (MDB) 时,它可在集群中的任一服务器上运行(以获取高可用性),并且可在集群的多个应用程序服务器中被并行调用(以获取可伸缩性)。此行为取决于 MDB 的位置(相对于任一服务集成总线成员)和 MDB 本身的配置。
缺省情况下,当 MDB 应用程序部署至同时充当服务集成总线集群总线成员的应用程序服务器集群时,MDB 应用程序会连接至集群内服务器上的一个或多个消息传递引擎。JMS 应用程序如何连接至总线上的消息传递引擎中描述了缺省连接行为以及可应用于任一 JMS 应用程序(包括消息驱动的 Bean)的额外连接控件。但是,如果使用该主题中描述的配置选项,那么消息驱动的 Bean 仅在集群中主管已启动消息传递引擎的服务器上驱动。
- 集群中的所有服务器可从 MDB 应用程序接收消息以充分利用集群中的处理能力。
- 一次只有一个服务器能从 MDB 应用程序接收消息以确保顺序处理消息。
- MDB 连接行为:在单个集群总线成员中
- MDB 连接行为:在集群与单独总线成员之间

MDB 连接行为:在单个集群总线成员中
- 消息驱动的 Bean 仅在集群总线成员中主管已启动消息传递引擎的服务器上驱动
这是缺省选项。如果消息驱动的 Bean 部署至集群总线成员,那么只有已在本地启动消息传递引擎的服务器中的 MDB 端点才可供可用消息驱动。
在图 2 中,一个集群总线成员包含三个服务器。server1 和 server2 都包含一个活动消息传递引擎和一个故障转移消息传递引擎。在这两个服务器中运行的 MDB 端点连接至它们各自的本地消息传递引擎。server3 未主管已启动消息传递引擎,但它正在主管两个故障转移消息传递引擎。它没有活动 MDB 端点并且无法使用消息。
图 2. MDB 仅由主管已启动消息传递引擎的集群总线成员中的服务器驱动(设置 1)此配置还使 MDB 应用程序和总线目标上的消息(如果消息传递引擎可在集群中的服务器间进行故障转移)具有高可用性。
在图 3 中,与上图一样显示了集群总线成员。server1 中的消息传递引擎已故障转移至 server2。所以,server2 现在包含两个活动消息传递引擎,并且在 server2 中运行的 MDB 端点现在已连接至两个本地消息传递引擎。第三个服务器未主管已启动消息传递引擎,没有活动 MDB 端点并且不可使用消息。
图 3. MDB 仅由主管已启动消息传递引擎的集群总线成员中的服务器驱动(设置 2)除非在激活规范中选择了始终激活所有服务器中的 MDB选项,否则将启用此配置。
- 集群总线成员中的所有服务器都可从消息驱动的 Bean 接收消息
可将所有集群服务器中的 MDB 端点设置为可由消息驱动,而不管是否存在本地已启动消息传递引擎。没有已启动消息传递引擎的服务器中的任何 MDB 端点将直接连接至集群中其他某个服务器中的某个消息传递引擎。此方法确保集群的所有可用资源可用于处理发送至目标的消息。
在图 4 中,一个集群总线成员包含三个服务器。两个服务器包含活动消息传递引擎。在这两个服务器中各自的 MDB 端点连接至它们各自的本地消息传递引擎。第三个服务器未主管已启动消息传递引擎,并且其工作负载在集群中的可用消息传递引擎之间分摊。第三个服务器中的 MDB 端点连接至在其他两个服务器之一中运行的消息传递引擎。
图 4. 集群总线成员中的服务器从消息驱动的 Bean 接收消息要选择此配置,请在激活规范中选择始终激活所有服务器中的 MDB选项。
注: 就驱动哪些 MDB 端点而言,此配置实现的效果与以下配置(本主题中也做了描述)相同:集群中的所有服务器都可从集群总线成员中的消息传递引擎接收消息。
MDB 连接行为:在集群与单独总线成员之间
- 集群中的所有服务器都可从集群总线成员中的消息传递引擎接收消息
如果将 MDB 应用程序部署至并非总线成员的集群,那么 MDB 会遵循JMS 应用程序如何连接至总线上的消息传递引擎中描述的连接规则,尝试从集群中的每个应用程序服务器连接至总线。这通常会导致集群中的所有 MDB 端点由来自总线成员中活动消息传递引擎的消息并行驱动。此方法确保集群的所有可用资源都可用于处理发送至集群总线成员中的目标的消息。
在图 5 中,一个集群包含三个服务器,各有一个 MDB 端点。一个集群总线成员包含两个服务器,并且其中一个服务器主管活动消息传递引擎。集群的三个 MDB 端点都连接至集群总线成员中的活动消息传递引擎。
注: 在此配置中,由于可能并没有与所有消息传递引擎都建立连接,所以可能存在没有连接的消息传递引擎,而这可能会导致孤立的消息。如果 MDB 使用的激活规范已设置为服务器范围,那么出现这种情况的可能性较小。图 5. 集群中的所有服务器都从集群总线成员中的消息传递引擎接收消息注: 就驱动哪些 MDB 端点而言,此配置实现的效果与以下配置(本主题中也做了描述)相同:集群总线成员中的所有服务器都可从消息驱动的 Bean 接收消息。- 集群中只有一个服务器可从集群总线成员中的消息传递引擎接收消息
要一次由一个服务器顺序处理目标上的消息,请配置系统以便消息一次仅驱动一个 MDB 端点。在此模式下,其他 MDB 端点和消息传递引擎处于备用方式,以准备好在 server1 停止时接管消息处理任务。
在图 6 中,一个集群包含三个服务器,各有一个 MDB 端点。一个集群总线成员还包含两个服务器,其中一个服务器具有活动消息传递引擎。集群中的三个 MDB 端点中,只有一个连接至在集群总线成员中运行的活动消息传递引擎。
图 6. 一个服务器从集群总线成员中的消息传递引擎接收消息要选择此配置,请配置激活规范,以便所有非总线集群服务器中的 MDB 端点都可以由来自集群总线成员中消息传递引擎的消息驱动,并请对集群总线成员中的目标设置独占接收选项。其中一个 MDB 端点连接至消息传递引擎时,该引擎会阻止所有其他可用 MDB 端点进行连接并继续通过同一 MDB 端点处理消息。
要使 MDB 顺序处理消息,可能需要进一步配置。有关确保顺序处理目标上的消息的更多信息,请参阅消息排序。