EMS server Tibco

http://www.cnblogs.com/jackson-ou/archive/2008/12/30/1365382.html

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信息的日志文件,发布关于systemevent 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支持消息的存储转发。

=======

weblogic与MQ的集成方案大致有两种:
一是将MQ配置为weblogic的外部JMS服务器(foreign JMS server),第二种是weblogic的消息桥(messaging bridge)
http://www.360doc.com/content/10/1129/16/4810544_73459234.shtml

3.3.集成到Weblogic
其实这部分的工作,没多少难度,就是配置比较繁琐,开始吧:

3.3.1.创建外部JMS服务器(foreign JMS server)

启动weblogic,登陆控制台,展开domain->服务->消息传递->JMS模块。
选择新建一个JMS模块JMSModule_MQ:


图3.3.1:创建JMS模块


选择一个server:

图3.3.2:创建JMS模块2


在刚才的模块创建一个资源,类型为外部服务器(foreign server)名为ForeignServer_JMS:

图3.3.3:创建模块资源--外部服务器



图3.3.4:创建模块资源--外部服务器2


外部服务器JND配置

图3.3.5:JNDI参数


在外部服务器创建两个目标:

图3.3.6:两个目标


及两个连接工厂:

图3.3.7:两个连接工厂


配置完之后,当然要写一个MDB测试一下:
消息驱动bean代码如下:
Java代码 复制代码
  1. package mq;   
  2.   
  3. import javax.annotation.Resource;   
  4. import javax.ejb.ActivationConfigProperty;   
  5. import javax.ejb.MessageDriven;   
  6. import javax.jms.Message;   
  7. import javax.jms.MessageListener;   
  8. import javax.jms.QueueConnection;   
  9. import javax.jms.QueueSender;   
  10. import javax.jms.QueueSession;   
  11. import javax.jms.Session;   
  12. import javax.jms.TextMessage;   
  13.   
  14. /**  
  15.  *   
  16.  * @author Justin  
  17.  */  
  18. @MessageDriven(name = "TestMDB2", mappedName = "jms/applicationJMSQueue",   
  19. activationConfig = {   
  20.     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")   
  21. })   
  22. public class MQTestBean2 implements MessageListener {   
  23.   
  24.     @Resource(mappedName = "jms/approvalJMSQueue")   
  25.     private javax.jms.Queue approvalJMSQueue;   
  26.     @Resource(mappedName = "jms/approvalFactory")   
  27.     private javax.jms.QueueConnectionFactory approvalFactory;   
  28.   
  29.     public void onMessage(Message message) {   
  30.   
  31.         try {   
  32.             String msg = ((TextMessage) message).getText();   
  33.             System.out.println("=> 收到申请: " + msg);   
  34.             sendMessage("同意申请:" + msg);   
  35.         } catch (Exception ex) {   
  36.             ex.printStackTrace();   
  37.         }   
  38.     }   
  39.   
  40.     private void sendMessage(String msg) throws Exception {   
  41.         QueueConnection conn = null;   
  42.         QueueSession session = null;   
  43.         try {   
  44.             conn = approvalFactory.createQueueConnection();   
  45.             session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);   
  46.             QueueSender sender = session.createSender(approvalJMSQueue);   
  47.             Message newMsg = session.createTextMessage(msg);   
  48.             sender.send(newMsg);   
  49.             System.out.println("=> 发送审批结果:" + msg);   
  50.         } catch (Exception e) {   
  51.             e.printStackTrace();   
  52.         } finally {   
  53.             try {   
  54.                 session.close();   
  55.                 conn.close();   
  56.             } catch (Exception e) {   
  57.                 e.printStackTrace();   
  58.             }   
  59.         }   
  60.     }   
  61. }  
package mq; import javax.annotation.Resource; import javax.ejb.ActivationConfigProperty; import javax.ejb.MessageDriven; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.QueueConnection; import javax.jms.QueueSender; import javax.jms.QueueSession; import javax.jms.Session;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              


部署文件如下:
Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <weblogic-ejb-jar xmlns="http://www.bea.com/ns/weblogic/90">  
  3.     <weblogic-enterprise-bean>  
  4.         <ejb-name>TestMDB2</ejb-name>  
  5.         <message-driven-descriptor>  
  6.             <destination-jndi-name>  
  7.                 jms/applicationJMSQueue   
  8.             </destination-jndi-name>  
  9.             <connection-factory-jndi-name>  
  10.                 jms/applicationFactory   
  11.             </connection-factory-jndi-name>  
  12.         </message-driven-descriptor>  
  13.     </weblogic-enterprise-bean>  
  14. </weblogic-ejb-jar>  
<?xml version="1.0" encoding="UTF-8"?> <weblogic-ejb-jar xmlns="http://www.bea.com/ns/weblogic/90"> <weblogic-enterprise-bean> <ejb-name>TestMDB2</ejb-name> <message-driven-descriptor> <destination-jndi-name> jms/applicationJMSQueue </destination-jndi-name> <connection-factory-jndi-name> jms/applicationFactory </connection-factory-jndi-name> </message-driven-descriptor> </weblogic-enterprise-bean> </weblogic-ejb-jar>


打包并发布到weblogic。

现在测试一下:
在MQ管理器中,在application队列放入一个消息:

图3.3.8.放入测试消息


如果所有配置正确,则MDB->MQTestBean2会接收到刚刚放入的消息,并进行处理,然后放到approval队列:



图3.3.9.weblogic服务器输出(netbeans控制台)


之后我们可以再到MQ管理器查看approval队列,可以看到MDB处理后的消息:



图3.3.10.到approval队列查看处理后的消息


OK,至此,我们成功地将MQ无缝地集成到了weblogic上,使部署在weblogic上的MDB可以像使用原生的JMS一样操控MQ队列了。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TIBCO Rendezvous(RV)是一种基于消息的中间件,它提供了高效、可靠的消息传递机制。下面是一个简单的 Java RV Server 和 Client 的示例代码: Server: ```java import com.tibco.tibrv.*; public class RVServer implements TibrvMsgCallback { private TibrvQueue queue; private TibrvRvdTransport transport; public RVServer(String service, String network, String daemon) throws TibrvException { Tibrv.open(); queue = new TibrvQueue(); transport = new TibrvRvdTransport(service, network, daemon); new TibrvListener(queue, this, transport, "test.subject", null); } public void onMsg(TibrvListener listener, TibrvMsg msg) { try { String message = msg.getField("message").data.toString(); System.out.println("Received message: " + message); } catch (TibrvException e) { e.printStackTrace(); } } public void start() throws TibrvException { queue.dispatch(); } public void stop() throws TibrvException { Tibrv.close(); } public static void main(String[] args) { try { RVServer server = new RVServer("7500", null, "tcp:7500"); server.start(); } catch (TibrvException e) { e.printStackTrace(); } } } ``` Client: ```java import com.tibco.tibrv.*; public class RVClient { private TibrvRvdTransport transport; public RVClient(String service, String network, String daemon) throws TibrvException { Tibrv.open(); transport = new TibrvRvdTransport(service, network, daemon); } public void send(String subject, String message) throws TibrvException { TibrvMsg msg = new TibrvMsg(); msg.setSendSubject(subject); msg.add("message", message); transport.send(msg); System.out.println("Sent message: " + message); } public void stop() throws TibrvException { Tibrv.close(); } public static void main(String[] args) { try { RVClient client = new RVClient("7500", null, "tcp:7500"); client.send("test.subject", "Hello, World!"); client.stop(); } catch (TibrvException e) { e.printStackTrace(); } } } ``` 在上面的示例中,Server 和 Client 都使用了 `TibrvRvdTransport` 来进行通信。Server 运行在本地的 `7500` 端口上,监听 `test.subject` 主题。当收到消息时,会调用 `onMsg` 方法进行处理。Client 发送一条消息到 `test.subject` 主题。 需要注意的是,上述代码需要使用 TIBCO RV Java API 来编译和运行。你需要在项目中添加相应的 JAR 文件,并在代码中进行引用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值