Sun Java System Application Server 9.1 高可用性管理指南

第 10 章 Java 消息服务的负载平衡和故障转移

本章介绍了如何配置 Java 消息服务 (Java Message Service, JMS) 的负载平衡和故障转移以与 Application Server 一起使用。本章包含以下主题:

Java 消息服务概述

Java 消息服务 (Java Message Service, JMS) API 是一种通讯标准,使 Java EE 应用程序和组件可以创建、发送、接收和读取消息,并启用了松散耦合的可靠异步分布式通信。Sun Java System Message Queue (MQ)(实现了 JMS)与 Application Server 紧密集成,使您可以创建诸如消息驱动 bean (message-driven bean, MDB) 之类的组件。

MQ 使用连接器模块(也称为资源适配器,由 Java EE 连接器体系结构规范 1.5 定义)与 Application Server 集成。部署到 Application Server 的 Java EE 组件使用通过连接器模块集成的 JMS 提供者交换 JMS 消息。在 Application Server 中创建 JMS 资源将会在后台创建连接器资源。因此,每个 JMS 操作将调用连接器运行时并在后台使用 MQ 资源适配器。

您可以通过管理控制台或 asadmin 命令行实用程序管理 Java 消息服务。

更多信息

有关配置 JMS 资源的更多信息,请参见《Sun Java System Application Server 9.1 管理指南》中的第 4  章 “配置 Java 消息服务资源”有关 JMS 的更多信息,请参见《Sun Java System Application Server 9.1 Developer’s Guide》中的第 18  章 “Using the Java Message Service”。有关连接器(资源适配器)的更多信息,请参见《Sun Java System Application Server 9.1 Developer’s Guide》中的第 12  章 “Developing Connectors”

有关 Sun Java System Message Queue 的更多信息,请参见 Message Queue 文档。有关 JMS API 的常规信息,请参见 JMS Web 页

配置 Java 消息服务

Java 消息服务配置可用于到 Sun Java System Application Server 群集或实例的所有入站和出站连接。您可以使用以下方法配置 Java 消息服务:

您可以使用 JMS 连接工厂设置覆盖 Java 消息服务配置。有关详细信息,请参见《Sun Java System Application Server 9.1 管理指南》中的“JMS 连接工厂”


注 –

更改 Java 消息服务的配置之后,您必须重新启动 Application Server 实例。


有关 JMS 管理的更多信息,请参见《Sun Java System Application Server 9.1 管理指南》中的第 4  章 “配置 Java 消息服务资源”

Java 消息服务集成

MQ 可以通过三种方法与 Application Server 集成:LOCAL、REMOTE 和 EMBEDDED。这些模式在管理控制台中由 Java 消息服务的“类型”属性表示。

LOCAL Java 消息服务

“类型”属性为 LOCAL(群集实例的默认值)时,Application Server 将启动和停止指定为默认 JMS 主机的 MQ 代理。MQ 进程从 Application Server 进程在单独的 VM 中于进程外启动。Application Server 为代理提供一个额外的端口。此端口将由代理用来启动 RMI 注册表。此端口号将等于该实例的已配置 JMS 端口号加上 100。例如,如果 JMS 端口号是 37676,则此附加端口号将是 37776。

要在 Application Server 实例和 Message Queue 代理之间创建一对一关系,请将类型设置为 LOCAL 并为每个 Application Server 实例提供一个不同的默认 JMS 主机。无论是否已在 Application Server 或 MQ 中定义了群集,都可以进行此操作。

在类型为 LOCAL 的情况下,请使用“启动参数”属性指定 MQ 代理的启动参数。

REMOTE Java 消息服务

“类型”属性为 REMOTE 时,必须单独启动 MQ 代理。有关启动代理的信息,请参见 Sun Java System Message Queue Administration Guide

在此情况下,Application Server 将使用从外部配置的代理或代理群集。另外,您必须从 Application Server 单独启动和停止 MQ 代理,并使用 MQ 工具配置和调整代理或代理群集。REMOTE 类型是适用于 Application Server 群集的最佳类型。

在类型为 REMOTE 的情况下,您必须使用 MQ 工具指定 MQ 代理启动参数。忽略“启动参数”属性。

EMBEDDED Java 消息服务

JMS“类型”属性为 EMBEDDED 时,表示应用服务器和 JMS 代理位于同一 VM 中,且 JMS 服务在进程中启动并由 Application Server 管理。在此模式下,JMS 操作绕过网络栈,从而优化了性能。

JMS 主机列表

JMS 主机用于表示 MQ 代理。Java 消息服务包含 JMS 主机列表(也称为 AddressList),该主机列表包含 Application Server 使用的所有 JMS 主机。

JMS 主机列表包含指定的 MQ 代理的主机和端口,并且在 JMS 主机配置更改后随时更新。当您创建 JMS 资源或部署 MDB 时,它们将继承 JMS 主机列表。


注 –

在 Sun Java System Message Queue 软件中,AddressList 属性被称为 imqAddressList


缺省 JMS 主机

JMS 主机列表中的一个主机被指定为默认 JMS 主机,命名为 Default_JMS_host。当 Java 消息服务类型配置为 LOCAL 时,Application Server 实例将启动默认 JMS 主机。

如果您已在 Sun Java System Message Queue 软件中创建了多代理群集,则删除默认 JMS 主机,然后将 Message Queue 群集的代理添加为 JMS 主机。在此情况下,默认 JMS 主机将成为 JMS 主机列表中的第一个主机。

Application Server 使用 Message Queue 群集时,将在默认 JMS 主机上执行 Message Queue 特定命令。例如,为三个代理的 Message Queue 群集创建物理目的地时,将在默认 JMS 主机上执行创建物理目的地的命令,但是该物理目的地将被群集中的全部三个代理使用。

创建 JMS 主机

您可以使用以下方法创建其他 JMS 主机:

连接池和故障转移

Application Server 支持 JMS 连接池和故障转移。Sun Java System Application Server 将自动实现 JMS 连接池。“地址列表行为”属性为 random(默认值)时,Application Server 将从 JMS 主机列表中随机选择其主代理。发生故障转移时,MQ 会将负载透明地转移到另一个代理,并维持 JMS 语义。如果 JMS 类型为 LOCAL,“地址列表行为”属性的默认值将为 priority

要指定连接丢失时 Application Server 是否尝试重新连接到主代理,请选中“重新连接”复选框。如果已启用,则当主代理出现故障时,Application Server 将尝试重新连接到 JMS 主机列表中的另一个代理。

启用“重新连接”时,也同时指定以下属性:

您可以使用 JMS 连接工厂设置覆盖这些设置。有关详细信息,请参见《Sun Java System Application Server 9.1 管理指南》中的“JMS 连接工厂”

负载平衡的消息流入

您可以在 sun-ejb-jar.xml 文件中使用 activation-config-property 元素为消息驱动 Bean 配置 jmsra 资源适配器的 ActivationSpec 属性。每当部署消息驱动 Bean (EndPointFactory) 后,连接器运行时引擎都会在资源适配器中查找这些属性并相应地对其进行配置。请参见《Sun Java System Application Server 9.1 Application Deployment Guide》中的“activation-config-property”

Application Server 透明地允许将消息随机传送到具有相同 ClientID 的消息驱动 Bean。持久订阅者需要 ClientID

对于没有配置 ClientID 的非持久订阅者,特定的消息驱动 Bean 中订阅同一主题的所有实例均认为是等效的。将消息驱动 Bean 部署到 Application Server 的多个实例时,只有其中的一个消息驱动 Bean 接收消息。如果多个不同的消息驱动 Bean 订阅同一主题,每个消息驱动 Bean 的一个实例将接收消息副本。

要使用同一队列支持多个使用者,请将物理目的地的 maxNumActiveConsumers 属性设置为较大值。如果设置了此属性,Sun Java System Message Queue 软件将允许最多该数目的消息驱动 Bean 使用同一队列中的消息。消息将随机传送到各个消息驱动 Bean。如果将 maxNumActiveConsumers 设置为 -1,将不限制使用者的数目。

要确保首选本地传送,请将 addresslist-behavior 设置为 priority。此设置指定首先选择 AddressList 中的第一个代理。此第一个代理是本地共存的 Message Queue 实例。如果此代理不可用,将按代理在 AddressList 中的列出顺序进行连接尝试。此设置是属于群集的 Application Server 实例的默认设置。


注 –

群集功能在开发者配置文件中不可用。有关配置文件的信息,请参见《Sun Java System Application Server 9.1 管理指南》中的“用法配置文件”


JMS 服务高可用性

JMS 组件有两种级别的可用性:

可以在包含 Java 消息服务 (Java Message Service, JMS) 的 Sun Java System Message Queue 群集中启用数据可用性。消息将持久保存到公共持久性存储, 而且从群集中的所有其他代理实例可用,或者从高可用性数据库 (high-availability database, HADB) 可用(如果安装了该数据库并选择了企业配置文件)。有关配置文件的信息,请参见《Sun Java System Application Server 9.1 管理指南》中的“用法配置文件”。必须先对 Application Server 实例启用可用性,才能对相应的代理启用数据可用性。


注 –

单个应用程序和模块无法控制或覆盖 JMS 可用性。


要启用数据可用性,请在 管理控制台 中的相关配置下选择“可用性服务”组件。选中“可用性服务”框。要对 JMS 服务启用可用性,请选择“JMS 可用性”选项卡,然后选中“可用性服务”框。Application Server 群集中的所有实例都应该具有相同的实例可用性和 JMS 可用性设置,以确保一致的行为。有关详细信息,请参见《Sun Java System Application Server 9.1 高可用性管理指南》


注 –

群集功能在开发者配置文件中不可用。有关配置文件的信息,请参见《Sun Java System Application Server 9.1 管理指南》中的“用法配置文件”


结合使用 Application Server 与 MQ 群集

MQ 企业版支持多个互连代理实例(称为代理群集)。使用代理群集的情况下,客户机连接将分布在群集的所有代理中。群集可以提供水平可伸缩性并提高可用性。

本节介绍了如何配置 Application Server 以使用高可用性 Sun Java System Message Queue 群集。还介绍了如何启动和配置 Message Queue 群集。

有关 Application Server 和 MQ 部署拓扑的更多信息,请参见《Sun Java System Application Server 9.1 部署规划指南》中的“Planning Message Queue Broker Deployment”

高可用性 MQ 群集

Sun Java System Message Queue 4.1 通过新的“高可用性”群集类型提供了高可用性消息传送服务。在此类型的 MQ 群集中,所有的代理实例都将共享对等关系并共享公共的持久性数据存储,从而提供“数据可用性”。实例将自动地能够检测某个实例是否出现故障,并通过接管选举动态执行故障代理的持久性消息的接管。这样,在 Application Server 中部署的应用程序组件可以利用这些可用性功能。

使用此群集类型,队列或持久主题订阅不会丢失任何已处理的持久性消息。客户机运行时环境所连接到的代理不可用时,很可能会丢失非持久性消息或非持久订阅者的持久性消息。

在本地模式下配置高可用性代理群集

  1. 启动 HADB。

  2. 创建一个 Application Server 域并启动它。要创建一个域并启动它,请分别使用 asadmin 命令 create-domainstart-domain。有关这些命令的更多信息,请参见 create-domain(1)start-domain(1)

  3. 创建一个节点代理并启动它。要创建一个节点代理并启动它,请分别使用 asadmin 命令 create-node-agentstart-node-agent。有关这些命令的更多信息,请参见 create-node-agent(1)start-node-agent(1)

  4. 创建群集。可以使用 asadmin 命令 create-cluster 或使用管理控制台创建群集。有关 create-cluster 命令的更多信息,请参见 create-cluster(1)。有关如何使用管理控制台创建群集的信息,请参见管理控制台联机帮助。

  5. 在群集中创建实例。在创建实例时,请指定远程代理所用的 JMS 提供者端口号。如果您不指定一个端口号,将使用默认的 JMS 提供者端口号。可以使用管理控制台或 asadmin 命令 create-instance 创建实例。有关如何使用管理控制台创建实例的信息,请参见管理控制台联机帮助。有关 create-instance 命令的信息,请参见 create-instance(1)

  6. 启动群集。可以通过管理控制台或使用 asadmin 命令 start-cluster 启动群集。有关如何使用管理控制台启动群集的信息,请参阅管理控制台联机帮助。有关 start-cluster 命令的信息,请参见 start-cluster(1)

  7. 使用 asadmin 命令 configure-ha-cluster 配置 HA 群集。有关该命令的更多信息,请参见 configure-ha-cluster(1)

在远程模式下配置高可用性代理群集

  1. 启动 HADB。

  2. 创建数据库表。

  3. 如果要创建高可用性代理群集,请复制 HA 驱动程序。

    cp $AS_HOME/hadb/4.4.3-6/lib/hadbjdbc4.jar $S1AS_HOME/imq/lib/ext
  4. 创建一个域并启动它。为此,请使用 asadmin 命令 create-domainstart-domain。有关这些命令的更多信息,请参见 create-domain(1)start-domain(1)

  5. 创建一个节点代理并启动它。为此,请使用 asadmin 命令 create-node-agentstart-node-agent。有关这些命令的更多信息,请参见 create-node-agent(1)start-node-agent(1)

  6. 创建群集。可以使用 asadmin 命令 create-cluster 或使用管理控制台创建群集。有关更多信息,请参见 create-cluster(1)。有关如何使用管理控制台创建群集的信息,请参见管理控制台联机帮助。

  7. 在群集中创建实例。在创建实例时,请指定远程代理所用的 JMS 提供者端口号。如果您不指定一个端口号,将使用默认的 JMS 提供者端口号。

  8. 删除默认的 JMS 主机,并创建实例可以连接到的 JMS 主机。务必将每个代理作为单独的 JMS 主机进行添加。有关 JMS 主机的更多信息,请参见JMS 主机列表

  9. 将 JMS 类型设置为 Remote。为此,可以使用 asadmin 命令 set 或管理控制台中的“JMS 服务”页面。

  10. 如果要配置高可用性代理,请将 JMS 可用性设置为 true。为此,可以使用 asadmin 命令 set 或管理控制台中的“JMS 可用性”页面。

  11. 启动代理实例。

  12. 启动群集。有关更多信息,请参见 start-cluster(1)

为非 HA 群集自动建立群集

直到现在,管理员必须单独建立“非高可用性”MQ 群集(具有主代理的 MQ 群集),如本节后面的过程中所述。在此发行版中,除了设置 MQ 群集的手动过程(类型为 REMOTE)外,Application Server 还提供了“自动建立群集功能”,这意味着在用户创建 Application Server 群集时将自动创建共存的非 HA 群集(类型为 LOCAL)。这将是创建 MQ 群集的默认模式。例如,在管理员创建具有三个 Application Server 实例的 Application Server 群集时,会将每个 Application Server 实例配置为与共存代理一起工作,因此将使三个 MQ 代理实例透明地形成一个 MQ 群集。第一个 Application Server 实例的 MQ 代理将被设置为主代理。但是,自动建立群集也有缺点。如果管理员将一个实例添加到群集,自动创建的 MQ 代理实例将无法参与群集。如果将一个实例从群集中删除,也会出现此行为。

Procedure使用 Application Server 群集启用 MQ 群集

开始之前

如果群集类型为 REMOTE,请执行以下步骤。如果群集类型为 LOCAL,则步骤 1 到 4 不适用。

  1. 如果尚不存在 Application Server 群集,请先创建一个。

    有关创建群集的信息,请参见创建群集

  2. 创建 MQ 代理群集。

    首先,删除涉及由域管理服务器启动的代理的默认 JMS 主机,然后创建三个将位于 MQ 代理群集中的外部代理(JMS 主机)。

    使用管理控制台或 asadmin 命令行实用程序创建 JMS 主机。

    要使用 asadmin,请参见以下命令示例:


    asadmin delete-jms-host --target cluster1 default_JMS_host
    asadmin create-jms-host --target cluster1
         --mqhost myhost1 --mqport 6769
         --mquser admin --mqpassword admin broker1
    asadmin create-jms-host --target cluster1
         --mqhost myhost2 --mqport 6770
         --mquser admin --mqpassword admin broker2
    asadmin create-jms-host --target cluster1
         --mqhost myhost3 --mqport 6771
         --mquser admin --mqpassword admin broker3

    要使用管理控制台创建主机,请执行以下操作:

    1. 导航到“JMS 主机”节点(“配置”> "config-name" >“Java 消息服务”>“JMS 主机”)。

    2. 删除默认代理 (default_JMS_host)。

      选择其旁边的复选框,然后单击“删除”。

    3. 单击“新建”以创建每一台 JMS 主机并输入其属性值。

      填写主机名称、DNS 名称或 IP 地址、端口号、管理用户名和密码。

  3. 启动 MQ 主代理和其他 MQ 代理。

    除了 JMS 主机上启动的三个外部代理外,请在任一计算机上启动一个主代理。此主代理不需要是代理群集的一部分。例如:


    /usr/bin/imqbrokerd -tty -name brokerm -port 6772
     -cluster myhost1:6769,myhost2:6770,myhost2:6772,myhost3:6771
     -D"imq.cluster.masterbroker=myhost2:6772"
  4. 启动群集中的 Application Server 实例。

  5. 在群集上创建 JMS 资源:

    1. 创建 JMS 物理目的地。

      例如,使用 asadmin


      asadmin create-jmsdest --desttype queue --target cluster1 MyQueue
      asadmin create-jmsdest --desttype queue --target cluster1 MyQueue1

      要使用管理控制台,请执行以下操作:

      1. 导航到“JMS 主机”页面(“配置”> "config-name" >“Java 消息服务”>“物理目的地”)。

      2. 单击“新建”以创建每个 JMS 物理目的地。

      3. 对于每个目标,输入其名称和类型(队列)。

    2. 创建 JMS 连接工厂。

      例如,使用 asadmin


      asadmin create-jms-resource --target cluster1
      --restype javax.jms.QueueConnectionFactory jms/MyQcf
      asadmin create-jms-resource --target cluster1
      --restype javax.jms.QueueConnectionFactory jms/MyQcf1

      要使用管理控制台,请执行以下操作:

      1. 导航到“JMS 连接工厂”页面(“资源”>“JMS 资源”>“连接工厂”)。

      2. 要创建每个连接工厂,请单击“新建”。

        将打开“创建 JMS 连接工厂”页面。

      3. 对于每个连接工厂,请输入 JNDI 名称(例如 jms/MyQcf)和类型 (javax.jms.QueueConnectionFactory)。

      4. 从页面底部的可用目标列表中选择群集,然后单击“添加”。

      5. 单击“确定”以创建连接工厂。

    3. 创建 JMS 目标资源。

      例如,使用 asadmin


      asadmin create-jms-resource --target cluster1
           --restype javax.jms.Queue
           --property imqDestinationName=MyQueue jms/MyQueue
      asadmin create-jms-resource --target cluster1
           --restype javax.jms.Queue
           --property imqDestinationName=MyQueue1 jms/MyQueue1

      要使用管理控制台,请执行以下操作:

      1. 导航到“JMS 目标资源”页面(“资源”>“JMS 资源”>“连接工厂”)。

      2. 要创建每个目标资源,请单击“新建”。

        将打开“创建 JMS 目标资源”页面。

      3. 对于每个目标资源,请输入 JNDI 名称(例如 jms/MyQueue)和类型 (javax.jms.Queue)。

      4. 从页面底部的可用目标列表中选择群集,然后单击“添加”。

      5. 单击“确定”创建目标资源。

  6. 使用 –retrieve 选项为应用程序客户机部署应用程序。例如:


    asadmin deploy --target cluster1 
    --retrieve /opt/work/MQapp/mdb-simple3.ear
  7. 访问应用程序并进行测试以确保其按预期运行。

  8. 如果要将 Application Server 返回到其默认 JMS 配置,请删除您创建的 JMS 主机并重新创建默认值。例如:


    asadmin delete-jms-host --target cluster1 broker1
    asadmin delete-jms-host --target cluster1 broker2
    asadmin delete-jms-host --target cluster1 broker3
    asadmin create-jms-host --target cluster1
     --mqhost myhost1 --mqport 7676
     --mquser admin --mqpassword admin
     default_JMS_host

    您还可以使用管理控制台执行等效操作。

故障排除

如果出现问题,请考虑以下操作: