目前Open Message Queue 已经集成到了 GlassFish 中,实现了 Java 消息服务 (Java Message Service, JMS) API。GlassFish也可以与除Open Message Queue之外的JMS提供者(例如 IBM Websphere MQ、Tibco EMS 和 Sonic MQ 等)进行集成。如果对此感兴趣可以查看关于配置GlassFish JMS通用适配器的文章。
下面介绍一下GlassFish中JMS服务集成,摘自(Sun Java System Application Server 9.1 高可用性管理指南)
Java 消息服务集成
MQ 可以通过三种方法与GlassFish集成:LOCAL、REMOTE 和 EMBEDDED
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 操作绕过网络栈,从而优化了性能。
通过上面的介绍想必大家对OpenMQ与GlassFish的集成方式大概有了些了解,其中REMOTE方式可以让我们的GlassFish使用外部提供的JMS服务,这样就意味着我们可以单独配置具有高可用性和高负载能力的集群来为GlassFish提供JMS服务。
下面开始介绍Open Message Queue的安装与集群配置
Open Message Queue 集群环境
IP | HostName | |
192.168.1.105 | mq1.localdomain | |
192.168.1.106 | mq2.localdomain |
下载Open Message Queue
http://download.java.net/mq/open-mq/4.4u2/final/openmq4_4-binary-Linux_X86.zip
安装Open Message Queue
解压文件
[root@mq1 local]# unzip openmq4_4-binary-Linux_X86.zip
进入mq安装目录
[root@mq1 local]# cd MessageQueue4_4
[root@mq1 MessageQueue4_4]#
设置IMQ_DEFAULT_JAVAHOME变量
[root@mq1 MessageQueue4_4]#vim etc/mq/imqenv.conf
增加如下内容:
IMQ_DEFAULT_JAVAHOME=/usr/local/jdk1.6.0_21
启动Open Message Queue
[root@mq1 MessageQueue4_4]# mq/bin/imqbrokerd
[11/二月/2011:13:05:55 CST]
==================================================================
Open Message Queue 4.4
Oracle
版本: 4.4 Update 2 (Build 5-a)
编译: Fri May 14 23:24:45 PDT 2010
Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
==================================================================
Java 运行时: 1.6.0_21 Sun Microsystems Inc. /usr/local/jdk1.6.0_21/jre
[11/二月/2011:13:05:55 CST] IMQ_HOME=/usr/local/MessageQueue4_4/mq
[11/二月/2011:13:05:55 CST] IMQ_VARHOME=/usr/local/MessageQueue4_4/var/mq
[11/二月/2011:13:05:55 CST] Linux 2.6.23.1-42.fc8 i386 mq1.localdomain (1 cpu) root
[11/二月/2011:13:05:55 CST] Java 堆大小:最大为 190080k,当前为 190080k
[11/二月/2011:13:05:55 CST] 参数:
[11/二月/2011:13:05:55 CST] [B1060]: 正在加载持久数据...
[11/二月/2011:13:05:55 CST] 使用内置的基于文件的持久存储库:/usr/local/MessageQueue4_4/var/mq/instances/imqbroker/
[11/二月/2011:13:05:55 CST] [B1039]: 代理 "[email protected]:7676" 就绪。
输出以上信息说明启动成功,Open Message Queue自动创建了一个名为imqbroker 的实例,服务地址为mq1.localdomain:7676,实例的目录为 /usr/local/MessageQueue4_4/var/mq/instances/imqbroker/, 如果想修改默认的实例存放目录可以在 imqenv.conf文件中增加或修改IMQ_DEFAULT_VARHOME变量的值。当然你也可以通过在运行imqbrokerd启动脚本时增加对应的参数来设置你想要的值。
例如:
[root@mq1 MessageQueue4_4]# mq/bin/imqbrokerd -name mybroker -port 7600 -javahome /usr/java -varhome /var/imq
关于imqbrokerd脚本用法请通过imqbrokerd --help查看
Open Message Queue集群启动
首先分别在mq1.localdomain、mq2.localdomain两台主机上安装Open Message Queue,然后通过下面命令启动实例
[root@mq1 MessageQueue4_4]# mq/bin/imqbrokerd -tty -cluster mq1.localdomain:7676,mq2.localdomain:7676 -Dimq.cluster.masterbroker=mq1.localdomain:7676
-cluster参数表示集群中的主机列表,主机之间用","号隔开。
-Dimq.cluster.masterbroker设置系统属性imq.cluster.masterbroker的值,集群中需要设置一个主代理主机,它可以是集群中的一个主机也可以是集群以外的主机。这里我们设置 mq1.localdomain:7676为主代理主机。
mq1.localdomain运行结果
[11/二月/2011:13:48:23 CST]
==================================================================
Open Message Queue 4.4
Oracle
版本: 4.4 Update 2 (Build 5-a)
编译: Fri May 14 23:24:45 PDT 2010
Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
==================================================================
Java 运行时: 1.6.0_21 Sun Microsystems Inc. /usr/local/jdk1.6.0_21/jre
[11/二月/2011:13:48:24 CST] IMQ_HOME=/usr/local/MessageQueue4_4/mq
[11/二月/2011:13:48:24 CST] IMQ_VARHOME=/usr/local/MessageQueue4_4/var/mq
[11/二月/2011:13:48:24 CST] Linux 2.6.23.1-42.fc8 i386 node3.localdomain (1 cpu) root
[11/二月/2011:13:48:24 CST] Java 堆大小:最大为 190080k,当前为 190080k
[11/二月/2011:13:48:24 CST] 参数:-tty -cluster mq1.localdomain:7676,mq2.localdomain:7676 -Dimq.cluster.masterbroker=mq1.localdomain:7676
[11/二月/2011:13:48:24 CST] [B1004]: 使用 tcp [ 7676, 50, * ] 启动 portmapper 服务,最小线程数是 1,最大线程数是 1
[11/二月/2011:13:48:24 CST] [B1060]: 正在加载持久数据...
[11/二月/2011:13:48:24 CST] 使用内置的基于文件的持久存储库:/usr/local/MessageQueue4_4/var/mq/instances/imqbroker/
[11/二月/2011:13:48:24 CST] [B1041]: 群集初始化成功。
[11/二月/2011:13:48:24 CST] [B1136]: 正在处理存储的事务
[11/二月/2011:13:48:24 CST] [B1284]: 0 个群集事务保持 PREPARED 状态,0 个保持 COMMITTED 状态,等待远程代理完成
[11/二月/2011:13:48:24 CST] 在 0 个远程事务中,有 0 个处于 PREPARED 状态,有 0 个处于 COMMITTED 状态
[11/二月/2011:13:48:24 CST] [B1013]: 已启用队列的自动创建
[11/二月/2011:13:48:24 CST] [B1151]: 正在加载目的地 mq.sys.dmq [队列] 以及 0 条消息
[11/二月/2011:13:48:24 CST] [B1152]: 目的地 mq.sys.dmq [队列] 加载完成
[11/二月/2011:13:48:24 CST] [B1239]: 使用平台 MBean 服务器
[11/二月/2011:13:48:24 CST] JESMF 类不存在 - 将不会启用 JESMF 支持。
[11/二月/2011:13:48:24 CST] 已使用 URL service:jmx:rmi://mq1.localdomain/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjE5Mi4xNjguMTEuMjAzAACN/V6+F1Fn42c4Fiu1QwAAAS4TQ1p0gAEAeA== 成功启动了 JMX 连接器服务器 jmxrmi
[11/二月/2011:13:48:24 CST] [B1004]: 使用 tcp(host = *, port=0, mode=dedicated) 启动 admin 服务,最小线程数是 4,最大线程数是 10
[11/二月/2011:13:48:24 CST] [B1227]: 使用 file 用户系统信息库进行 admin 服务连接验证
[11/二月/2011:13:48:24 CST] [B1004]: 使用 tcp(host = *, port=0, mode=dedicated) 启动 jms 服务,最小线程数是 10,最大线程数是 1000
[11/二月/2011:13:48:24 CST] [B1227]: 使用 file 用户系统信息库进行 jms 服务连接验证
[11/二月/2011:13:48:24 CST] [B1069]: 作为群集的主代理运行。
[11/二月/2011:13:48:24 CST] [B1075]: 从主代理接收到持久状态更改记录。接受客户连接已准备就绪。
[11/二月/2011:13:48:24 CST] [B1004]: 使用 tcp [ 0.0.0.0/0.0.0.0:54334 ] 启动 cluster 服务,最小线程数是 1,最大线程数是 1
[11/二月/2011:13:48:24 CST] [B1228]: 群集 Ping 间隔为 60 秒
[11/二月/2011:13:48:24 CST] [B1039]: 代理 "[email protected]:7676" 就绪。
mq2.localdomain运行结果
[11/二月/2011:13:55:03 CST]
==================================================================
Open Message Queue 4.4
Sun Microsystems, Inc.
版本: 4.4 (Build 16-a)
编译: Thu Aug 27 07:43:07 PDT 2009
Copyright (c) 2009 Sun Microsystems, Inc. All rights reserved. Use is
subject to license terms.
==================================================================
Java 运行时: 1.6.0_21 Sun Microsystems Inc. /usr/local/jdk1.6.0_21/jre
[11/二月/2011:13:55:03 CST] IMQ_HOME=/usr/local/MessageQueue4_4/mq
[11/二月/2011:13:55:03 CST] IMQ_VARHOME=/usr/local/MessageQueue4_4/var/mq
[11/二月/2011:13:55:03 CST] Linux 2.6.23.1-42.fc8 i386 node1.localdomain (1 cpu) root
[11/二月/2011:13:55:03 CST] Java 堆大小:最大为 190080k,当前为 190080k
[11/二月/2011:13:55:03 CST] 参数:-tty -cluster mq1.localdomain:7676,mq2.localdomain:7676 -Dimq.cluster.masterbroker=mq1.localdomain:7676
[11/二月/2011:13:55:03 CST] [B1004]: 使用 tcp [ 7676, 50, * ] 启动 portmapper 服务,最小线程数是 1,最大线程数是 1
[11/二月/2011:13:55:03 CST] [B1060]: 正在加载持久数据...
[11/二月/2011:13:55:03 CST] 使用内置的基于文件的持久存储库:/usr/local/MessageQueue4_4/var/mq/instances/imqbroker/
[11/二月/2011:13:55:03 CST] [B1041]: 群集初始化成功。
[11/二月/2011:13:55:03 CST] [B1004]: 使用 tcp [ 0, 100 ] 启动 cluster_discovery 服务,最小线程数是 1,最大线程数是 1
[11/二月/2011:13:55:03 CST] [B1136]: 正在处理存储的事务
[11/二月/2011:13:55:03 CST] [B1284]: 0 个群集事务保持 PREPARED 状态,0 个保持 COMMITTED 状态,等待远程代理完成
[11/二月/2011:13:55:03 CST] 在 0 个远程事务中,有 0 个处于 PREPARED 状态,有 0 个处于 COMMITTED 状态
[11/二月/2011:13:55:03 CST] [B1013]: 已经启用队列的自动创建
[11/二月/2011:13:55:03 CST] [B1151]: 正在加载目的地 mq.sys.dmq [队列] 以及 0 条消息
[11/二月/2011:13:55:03 CST] [B1152]: 目的地 mq.sys.dmq [队列] 加载完成
[11/二月/2011:13:55:04 CST] [B1239]: 使用平台 MBean 服务器
[11/二月/2011:13:55:04 CST] JESMF classes not present - JESMF support will not be enabled.
[11/二月/2011:13:55:04 CST] 已使用 URL service:jmx:rmi://mq2.localdomain/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjE5Mi4xNjguMTEuMjAwAAC6wccVdbj1QC5WY9SseAAAAS4TSXLXgAEAeA== 成功启动了 JMX 连接器服务器 jmxrmi
[11/二月/2011:13:55:04 CST] [B1004]: 使用 tcp(host = *, port=0, mode=dedicated) 启动 admin 服务,最小线程数是 4,最大线程数是 10
[11/二月/2011:13:55:04 CST] [B1227]: 使用 file 用户系统信息库进行 admin 服务连接验证
[11/二月/2011:13:55:04 CST] [B1004]: 使用 tcp(host = *, port=0, mode=dedicated) 启动 jms 服务,最小线程数是 10,最大线程数是 1000
[11/二月/2011:13:55:04 CST] [B1227]: 使用 file 用户系统信息库进行 jms 服务连接验证
[11/二月/2011:13:55:04 CST] 错误 [B1073]: 暂停所有服务,直到建立了和主代理的通讯为止。服务会自动恢复。
[11/二月/2011:13:55:04 CST] [B1004]: 使用 tcp [ 0.0.0.0/0.0.0.0:56536 ] 启动 cluster 服务,最小线程数是 1,最大线程数是 1
[11/二月/2011:13:55:04 CST] [B1228]: 群集 Ping 间隔为 60 秒
[11/二月/2011:13:55:04 CST] [B1039]: 代理 "[email protected]:7676" 就绪。
[11/二月/2011:13:55:04 CST] [B1179]: 激活的代理
Address = mq://192.168.1.105:7676/?instName=imqbroker&brokerSessionUID=3167207098217489408
StartTime = 1297403304443
ProtocolVersion = 410
[11/二月/2011:13:55:04 CST] [B1071]: 已经建立群集连接:mq://192.168.1.105:7676/?instName=imqbroker&brokerSessionUID=3167207098217489408[mq1.localdomain/192.168.1.105:54334]
[11/二月/2011:13:55:04 CST] [B1075]: 从主代理接收到持久状态更改记录。接受客户连接已准备就绪。
mq2.localdomain启动完毕后会在mq1.localdomain上提示如下信息:
[11/二月/2011:13:50:15 CST] [B1179]: 激活的代理
Address = mq://192.168.1.106:7676/?instName=imqbroker&brokerSessionUID=1388848195388534784
StartTime = 1297403417578
ProtocolVersion = 410
[11/二月/2011:13:50:15 CST] [B1071]: 已建立与代理 mq://192.168.1.106:7676/?instName=imqbroker&brokerSessionUID=1388848195388534784[/192.168.1.106:43217] 的群集连接
我们可以imqcmd命令连接到任意一台主机上执行来查看集群状态
[root@mq1 MessageQueue4_4]# mq/bin/imqcmd list bkr -b mq1.localdomain:7676
用户名: admin
密码: admin
列出以下代理所属的群集中的所有代理:
-----------------
主机 主端口
-----------------
localhost 7676
群集 ID
群集具有高可用性 false
-------------------------------
地址 状态
-------------------------------
192.168.1.105:7676 OPERATING
192.168.1.106:7676 OPERATING
已成功列出群集中的代理。
有关imqcmd脚本用法请使用imqcmd -h查看
至此Open Message Queue 4.4的集群搭建已经完成。