一、EMS基本应用
TIBCO Enterprise Message Service 是一个消息服务器产品,它采用C语言编写,
完全支持JMS的通讯协议,在运行速度和消息吞吐量上表现非常出色,
对于Windows、Linux、Mac、AIX平台都提供支持,关于这个产品,我也是刚刚接触不久,
以下是本人一段时间使用的一个小结:
1、将EMS设置为控制访问模式
默认安装好的EMS对于消息队列(Queue) 或者消息主题(Topic) 的访问是不需要口令的,
显然在任何生产环境中都不会让这样的设置存在,我们第一步要做的事情就是打开服务的访问控制:
启动 EMS Administration Tool ,使用管理员(admin)身份登录,密码初始为空,敲入命令
tcp://192.168.1.23:7222> set server authorization=enabled
Server parameters have been changed
2、更改管理员登录口令
设置好了访问控制,下一步就是修改管理员密码:
tcp://192.168.1.23:7222> set password admin admin
Password of user 'admin' has been modified
set password 是一个控制命令,这句话的意思是将用户 admin 的密码设置为 admin。
3、创建用户和用户组
创建用户组 emsgroup:
tcp://192.168.1.23:7222> create group emsgroup
Group 'emsgroup' has been created
创建用户 emsuser:
tcp://192.168.1.23:7222> create user emsuser password=emsuser
User 'emsuser' has been created
将用户添加至用户组中:
tcp://192.168.1.23:7222> add member emsgroup emsuser
Group 'emsgroup' has been modified
查看用户是否添加成功:
tcp://192.168.1.23:7222> show group emsgroup
Group: emsgroup
Description:
Users: 1
以上显示组 emsgroup 中有一个用户,显然就是 emsuser 这个用户。
4、创建消息队列
创建一个名叫 nanjing 的消息队列:
tcp://192.168.1.23:7222> create queue nanjing
Queue 'nanjing' has been created
5、为用户分配访问权限
为用户 emsuser 分配 receive,send,browse 的权利:
tcp://192.168.1.23:7222> grant queue nanjing emsuser receive,send,browse
Permissions have been changed
好了,现在就可以使用 JMS 客户端向服务器的7222端口上发送消息了,使用的用户名就是我们
刚才设置的 emsuser 口令是 emsuser,消息队列的名称:nanjing。
二、EMS容错配置
Ems容错配置(翻译)
注意:在实际环境中ems数据应存储在SAN或NAS中,以便主服务器和备份服务器都能访问存储数据。
SAN-Storage Area Network
NAS-Network Area storage
但在我们的例子里,我们只使用操作系统的文件系统(由主服务器和备份服务器共享)
1、容错配置
为了便于区别,参数用斜黑体表示。
配置主服务器
打开c:\tibco\ems\bin\tibemsd.conf (该文件称作Ems配置文件)
Server=EMS-SERVER-RAMU(该值取决于您的选择)
Listen=tcp://7222(该值取决于您的选择)
Ft_active=tcp://7444(该值取决于您的选择)
配置备份服务器
在bin目录下创建Backup目录,并把c:\tibco\ems\bin\ 目录下的*.conf 文件(只是配置文件)拷贝到c:\tibco\ems\bin\Backup\
注意:从现在起,我们将在Backup目录下工作,打开该目录下的tibemsd.conf 文件
Server=EMS-SERVER-RAMU(这个值必须和主服务器的tibemsd.conf 文件中的服务器参数的值一致)
Listen=tcp://7444(这个值必须和主服务器的tibemsd.conf 文件中的Ft_active 参数的值一致)
Ft_active=tcp://7222(这个值必须和主服务器的tibemsd.conf 文件中的监听参数的值一致)
store=c:\tibco\ems\bin\datastore(这个值必须和主服务器的tibemsd.conf 文件中的存储参数store,注意主服务器的tibemsd.conf 文件中的这个值正好是datastore)
在备份服务器tibemsd.conf的下述列表中,前面加上路径c:\tibco\ems\bin\Backup\
users=c:\tibco\ems\bin\Backup\users.conf
groups=c:\tibco\ems\bin\Backup\groups.conf
topics=c:\tibco\ems\bin\Backup\topics.conf
queues=c:\tibco\ems\bin\Backup\queues.conf
acl_list=c:\tibco\ems\bin\Backup\acl.conf
factories=c:\tibco\ems\bin\Backup\factories.conf
routes=c:\tibco\ems\bin\Backup\routes.conf
bridges=c:\tibco\ems\bin\Backup\bridges.conf
transports=c:\tibco\ems\bin\Backup\transports.conf
tibrvcm=c:\tibco\ems\bin\Backup\queues.conf
durables=c:\tibco\ems\bin\Backup\durables.conf
如果您观察主服务器的 tibemsd.conf文件,并和备份服务器的 tibemsd.conf文件对比,您会发现主服务器的tibemsd.conf文件中的某些参数未指明路径。例如"users=users.conf"在备份服务器的tibemsd.conf 文件中我们定义为"users=c:\tibco\ems\bin\Backup\users.conf"。之所以这样是因为安装ems服务器时,设置了这些值,知道在哪个路径下查找,所以在主服务器的tibemsd.conf文件中各参数没有包含完整路径。
2、运行服务器
进入“所有程序”>“运行”>输入"cmd"
得到window下的命令提示符,输入命令:cd c:\tibco\ems\bin
现在进入bin目录
启动主服务器
输入命令:tibemsd(这是一个应用程序)
启动备份服务器
打开另一个命令提示符,输入下列命令,进入相应目录:cd c:\tibco\ems\bin
输入如下命令,启动备份服务器:
tibemsd -config Backup\tibemsd.conf (备份服务器以此方式启动,主服务器不用,因为主服务器的tibemsd.conf文件和tibemsd应用程序在同一个目录)
在备份服务器命令提示行可以看到它处于standby模式(tcp://7222)
三、如何查看QUEUE里面的MSG被那台机器吃掉
可以看到队列CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE的msg都被来自testwebdev44的应用吃掉了
tcp://hksudv38:7262> show consumers queue=CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE
Msgs Sent
Id Conn User T Queue SAS Sent Size Uptime
700145 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
700146 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
700147 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
700148 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
700149 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
tcp://hksudv38:7262> show connections type=Q full
L Version ID FSXT S Host IP address User ClientID
Sess Prod Cons TmpT TmpQ Uptime
.
.
.
J 5.1.0 V10 360644 ---Q + testwebdev44 146.222.75.148 b2bapp BW-Main-Connection-queue-B2B-APP-ACK-B2B-APP-ACK
38 13 25 0 0 31:36:38
.
.
.
转自:http://sid.gd/archives/265
由于版本号不同,命令也有所不同,具体可查看用户手册
tcp://localhost:7022> show stat consumers queue=testQueue
Total Count Rate/Second
User Conn T Destination Msgs Size Msgs Size
dmsesb 9 Q testQueue 2 0.5 Kb 0 0.0 Kb
tcp://localhost:7022> show connections version address
L Version ID FSXT S Host Address User ClientID Sess Uptime
可以看到队列CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE的msg都被来自testwebdev44的应用吃掉了
tcp://hksudv38:7262> show consumers queue=CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE
Msgs Sent
Id Conn User T Queue SAS Sent Size Uptime
700145 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
700146 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
700147 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
700148 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
700149 360644 b2bapp Q CS.B2B.PROC_REQ.0001.JOB_REQ.PREP.CUSSTDAK997.IN.QUE +T- 0 0 30:32:25
tcp://hksudv38:7262> show connections type=Q full
L Version ID FSXT S Host IP address User ClientID
Sess Prod Cons TmpT TmpQ Uptime
.
.
.
J 5.1.0 V10 360644 ---Q + testwebdev44 146.222.75.148 b2bapp BW-Main-Connection-queue-B2B-APP-ACK-B2B-APP-ACK
38 13 25 0 0 31:36:38
.
.
.
转自:http://sid.gd/archives/265
由于版本号不同,命令也有所不同,具体可查
看用户手册
tcp://localhost:7022> show stat consumers queue=testQueue
Total Count Rate/Second
User Conn T Destination Msgs Size Msgs Size
dmsesb 9 Q testQueue 2 0.5 Kb 0 0.0 Kb
tcp://localhost:7022> show connections version address
L Version ID FSXT S Host Address User ClientID Sess Uptime
四、Tibco EMS routing 设置
Tibco Enterprise Message Service (EMS) 是一个兼容JMS标准的实现,是整个Tibco产品中的重要一环。Tibco组件除了可以用它构建整个管理域外,也使用它传递业务数据。通常业务整合的两个或多个party会使用并管理自己的EMS, EMS 支持信息EMS(A) routing 到MES(B)。可是往往由于设置不当造成无法通讯
假设现在有两台EMS服务器,名字分别是BLADE和VAMPIRE。注意这里的服务名字至关重要,登陆EMS管理界面后运行show server
这里的服务名是在tibemsd.conf里配置,与机器名无关。
下一步要检查EMS的其他设置,运行命令show config
routing的设置的复杂程度在authorization=enabled/disabled的不同情况下有很大区别,无论何种情况一定要修改tibemsd.conf设置为routing=enabled并重启EMS。
1)authorization=disabled ,注意这是BLADE的设置,这表明这是其他EMS(例如VAMPIRE)作为客户登陆入BLADE不需要用户名和密码。假设我们希望队列mysample里的信息能从VAMPIRE流向BLADE,首先要在VAMPIRE里建立routing, 命令如下:create route BLADE url=tcp://hostname:port
这里BLADE是信息流向的EMS的服务名,一定要注意不能弄错,否则无法发送到BLADE,以后引用这个route就用BLADE表示即可。接下来我们在BLADE这个EMS里建立带有global属性的mysample队列,所有可以接受来自其他EMS的队列必须带有global属性。create queue mysample global
最后一步是在VAMPIRE中建立同样名字的队列,命令和在BLADE中的有所差别:create queue mysample@BLADE这里@BLADE表明这个队列的所有者是route BLADE所指向的EMS,所有发送到VAMPIRE 队列mysample的信息都能流向BLADE。
2)authorization=enabled ,注意这仍然是BLADE的设置,这表明这是其他EMS(例如VAMPIRE)作为客户登陆入BLADE需要用户名和密码。要启动该选项,输入命令:
set server authorization=enabled
改变该设置并不需要重启服务。此时我们可以发现信息都pending在VAMPIRE这台EMS中。我们要在BLADE建立用户帐号如下:
create user VAMPIRE password=12345
这里一定要注意VAMPIRE是帐号,一定要是要登录进来的服务名。最后一步是设置VAMPIRE这台EMS,EMS会用自己的服务名来登录,关键就是设置密码:
set server password=12345
VAMPIRE会用这个密码登入BLADE,我们可以发现信息又可
以routing到BLADE。
五、EMS 动态queue
在EMS里,动态queueu是由application产生的,而静态queue是由管理界面或修改config文件创建的. 动态queue有很大的灵活性,在某些场合比使用静态queue更适合。有关讨论可以看JMS。
1)EMS的动态queue是以 "*" 作为开头,还有一种特殊的动态queue叫临时queue, "*"开头后紧跟$TMP$
2)如过动态queue没有consumer也没有信息在队列中,ems会择机清除该queue
3)临时queue的名字是由EMS server生成,只有在创建该queue的session才能消费里面的内容。EMS 重起后临时queue会被清除,不管里面有无内容。
4)要允许application创建动态queue,queues.conf 必须使用wildcard进行配置。
六、整合Tibco和JBoss的补充说明
本文补充说明整合Tibco Ent. for JMS与JBoss中的几个问题。
第一部分 SSL
要在Tibco Ent. for JMS中使用SSL,有以下几步:
1、修改tibjmsd.conf文件,在TIBCO/JMS/bin目录下,
找到 listen = tcp://7222
改成
listen = tcp://localhost:7222
listen = ssl://localhost:7223
让Tibco用不同的协议同时监听两个端口。
再配置以下几个SSL属性:
ssl_server_identity = certs/server.cert.pem
ssl_server_key = certs/server.key.pem
ssl_password = password
然后,启动tibjmsd,在控制台应该可以看到如下信息:
Secure Socket Layer is enabled.
Accepting connections on ssl://localhost:7223.
Accepting connections on tcp://localhost:7222.
2、把tibcrypt.jar文件也拷入%JBOSS_HOME%libext目录下。
3、修改jndi.properties,加上以下两句:
com.tibco.tibjms.naming.security_protocol=ssl
com.tibco.tibjms.naming.ssl_enable_verify_host=false
4、修改jboss.jcml,
找到
在其后再加上一句
再找到
换成:
同理,把
也换成
5、在客户端的JNDI中,也要相应修改一下
private static Context getTibcoContext() throws NamingException {
String providerContextFactory = "com.tibco.tibjms.naming.TibjmsInitialContextFactory";
String defaultProviderURL = "ssl://localhost:7223";
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,providerContextFactory);
env.put(Context.PROVIDER_URL,defaultProviderURL);
return new InitialContext(env);
}
第二部分 Routing
Tibco的Routing用集群服务来提高消息接收的效率。它与一般概念上的负载均衡的区别在于,它有一个消息拥
有者,它是保存消息的所在,但是可以通过路由在多个节点传递消息。比如我们有三台服务器:A、B和C,定义B是消息拥有者,我们将消息发到A,然后MDB从C接收消息。情况会怎样?大家可以试一下:)
要实现Route,只需简单地修改一下tibjmsd.conf和routes.conf文件即可。
下面,我们在一台机器上启动两个服务来说明routing的配置。
1、先把Tibco/JMS/bin目录改名复制一份,比如 JMS_2/bin/,
修改其下的tibjmsd.conf文件:
server = E4JMS-SERVER2
...
listen = tcp://localhost:7022
这样就与原来的服务E4JMS-SERVER和端口7222区别开,我们可以在一台机器上同时启动两个服务了。
2、还是修改tibjmsd.conf,打开 routing = enabled ,两个服务都要打开routing属性。
3、打开JMS/bin目录下的routes.conf文件,应该已有一个route配置(如果没有则加上):
[E4JMS-SERVER2]
url=tcp://localhost:7022
再打开JMS_2/bin目录下的routes.conf文件,同样配置一个route来对应上面的route,把原来的修改如下:
[E4JMS-SERVER]
url=tcp://localhost:7222
4、配置一个需要route的queue,在tibjmsadmin工具中使用如下命令:
在端口7222这个服务中,这样:
create queue queue/testQueue@E4JMS-SERVER2 global
在端口7022这个服务中,这样设置(让它作为消息拥有者):
create queue queue/testQueue global
5、重新分别启动两个服务,会在控制台分别看到如下信息:
Route 'E4JMS-SERVER' accepted from 'tcp://localhost:7222'.
和
Connected to route 'E4JMS-SERVER2' at 'tcp://localhost:7022'.
说明两个server已被routing成功。
客户端只需发送消息到任何一个服务的queue/testQueue队列,Tibco已经为其实现了负载均衡。
七、EMS SERVER
Note: From Tibco EMS Server document
1. Message Model
Point-to-Point模式(queue):每个Message仅有一个生产者和一个消费者。每个Queue可以有多个生产者和多个消费者。Queue可以被声明具有排它性。具有排它性Queue中的消息只能被第一个消费者获取。不论是否具有排它性,消息被某个消费者获取后,会从Queue中删除。
Publish and Subscribe模式(topic):每个Message可以拥有若干生产者和若干个消费者。消费者根据订阅关系获取topic中的消息。EMS API允许持久性的订阅者,消息会为这些持久性订阅者所保存。
2. Destination
对Message Model功能的提升,主要特征包括:
a.通过secure模式提供queue, topic层面的访问控制,参考secure mode and Destination Control
b.设置queue, topic占用内存空间的约束,参考flowControl and overflowPolicy
c.路由消息到Destination,参考Working With Routes
d.通过在Destinatin之间创建bridge,建立混合型Message Model
e. 控制Message发送到Destination的速度,参考Flow
Control
g. 与其他Message Service交换消息,如queue能够从Tibco Rendezvous, SmartSockets接收消息,topic能够与Tibco Rendezvous, SmartSockets双向交换消息
h. queue可被设置为具有exclusive或者non-exclusive,参考exclusive
i. queue在可以设置redelivery policy,参考maxRedelivery
j. 跟踪,日志消息到Destination的传送过程,参考trace
k.在消息中包含user name,参考sender name and sender name enforced
l. 在Destination name上支持Wildcards
m.在topic, queue上设置failsafe属性,用于把消息同步保存到硬盘上
n. 设置消费者在后台批量接受消息以提供性能,或者设置queue的消息一次只接收一个消息,参考prefetch
3. Client API
提供基于java, .net,COBOL的API。示例代码位于安装目录的samples子目录。EMS同时提供了Java类用于纯粹的Java TIBCO Rendezvous Application来连接EMS Server。
4. Administration
EMS提供了针对Server Operation, Server Object(如ConnectionFactories, Destinations)的管理机制。这些管理功能可以通过Administration Tool的命令行工具实现,也可以通过管理API实现。EMS Client可以通过JNDI来获取Server Object的引用。
管理Server功能:使用Configuration Files, EMS Administration Tool, Authentication and Permissions, Monitor Server Activity(包含Server Activity信息的日志文件,发布关于system event Message到Topic中便于对Server的监控,对不同层次细节的统计分析)。
EMS提供对user, groups的本地化管理,也可以通过外部的LDAP来统一。TIBCO Hawk提供了对EMS Server的管理和监控。EMS Server支持SSL协议,用于Client-Server,
Server-Server间的安全通信。支持backup EMS Server,实现了Fault Tolerance。EMS提供了Server-Server间的消息路由。Topic消息可以在任意多个hop间传递,Queue消息最多在一个hop间传递。EMS支持消息的存储转发。