欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JMS消息对象、队列浏览器、事务、异常监听、集群学习笔记

程序员文章站 2022-05-03 23:50:51
...
学习了李刚的javaEE企业应用实战,做了有关笔记和思考。
JMS消息
一JMS消息对象
1.不管哪种消息对象,它都是Message接口的实例,它包含标准的消息头,可扩

展的消息属性,消息主体内容。而其中的消息头、消息属性本质上都是一系列的

key-value对,而其区别就在于消息头的所有key都是标准的、固定的,而消息属

性则是我们可以自己定义的。我们通过
setXxxProperty(String name,xxx 
value);
来设置属性。
2.重用消息对象:为什么可以重用消息对象?这是因为使用send()方法发送消息

时,会把有关消息的数据复制到一个内部缓冲中,一旦send()方法调用完成,我

们就可以重新使用Message了,而不必担心原来的数据还没有发出去就被覆盖。

对于JMS消息消费者来说,消息是只读的。这就好像是别人发来的邮件,或是别

人在BBS上发表的主题,我们不能修改一样。
3.JMS消息传递方式和有效时间。
sender.setDeliveryMode(DeliveryMode.PERSISTENT);
sender.setTimeToLive(20000);
传递模式中的持久化的意思是在发送之前,先把消息存储在数据库或文件中,而

这个有效期就代表这个消息能够存储多长时间。
4.设置消息的优先级,
MessageProducer sender = session.createProducer(dest);sender.setPriority(9);
首先这个优先级有0到9之分,数字越大优先级

越高,第二,这个设置的是消息生产者的默认优先级,第三,如果我们不设置优

先级的话,那么它就默认为4。最后,我们也可以设置某次传输的优先级或者说

传输模式,如sender.send(msg,DeliveryMode.PERSISTENT,3,15000);
5.消息的确认方式,AUTO_ACKNOWLEDGE,自动确认,还有其他的方式,这里不再

赘述。
6.消息选择器,什么是消息选择器,我的理解是,消息消费者用他们选择他们感

兴趣的消息。
createConsumer(Destination dest,String messageSelector);


据指定的消息目的来创建一个消息消费者。这个消息选择器的表达式是一个

SQL-92的字符串表达式。
7.消息的临时目的:为了动态创建消息目的,我们使用消息的临时目的,客户端

在使用时临时创建,客户端退出时删除。消息目的的一个使用场景就是将

JMSReplayTo消息头设为临时创建的消息目的,当JMS消费者收到消息后,向该临

时消息目的返回一个响应。这个JMSReplayTo就相当于消息发送地址。

二.使用队列浏览器查看全部消息,createBrowser(Queue queue);根据指定的队

列来创建一个队列浏览器。
createBrowser(Queue queue,String 
messageSelector)
。典型的用法是:
QueueBrowser browser = session.createBrowser((javax.jms.Queue)dest);
Enumeration em = browser.getEnumeration();
while(em.hasMoreElements){
TextMessage msg = (TextMessage)em.nextElement;
System.out.println(msg.getText());
}

三.JMS和事务
JMS提供两种事务控制方式,使用事务性的session,在JTA全局事务中使用JMS。
1消息生产者发送的消息会被缓存,在事务被提交之前,消息消费者不会接受到

任何未提交的消息,当消息生产者完成一次业务逻辑之后,消息生产者执行提交

事务,之前所有发送的消息才会被整体性地传递到消息消费者,如果事务回滚,

JMS服务器会直接丢弃所有缓存的消息。而对于消息消费者,在接收到并处理多

个消息成功之后,消息消费者提交事务,此时才会向消息生产者确认之前收到的

所有消息。如果事务回滚,JMS服务器会把所有消息退还给相关的消息队列和消

息主题。这里要注意,使用事务性session时,只是控制有关JMS的操作成为一个

整体,而如果要把有关EJB的操作,数据库的操作和JMS的操作都看成是一个整体

的话,我们就要使用JTA全局事务。
2.JTA全局事务,
什么是JTA,JTA,即Java Transaction API,译为Java事务API。我的理解是,

JTA允许两个或多个网络计算机上的java平台的组件参与到一个JTA事务中。
在JMS中如何使用?通过JNDI查找来获得JTA服务器的引用。如:
UserTransaction tx = (UserTransaction)ctx.lookup("javax.transaction.UserTransaction");
tx.begin();
...
tx.commit();

四JMS服务器的异常监听
如果JMS服务器异常了,那么JMS客户端就无法收到这些异常的信息,那么为了让

JMS客户端可以接收到JMS服务器上的异常信息。JMS提供一种异常监听器机制。

异常监听器需要实现javax.jms.ExceptionListener接口,实现该接口需要实现

onException方法。
conn.setException(new ExceptionListener
public void onException(javax.jms.Exception){
//此处获得JMS服务器上的异常信息
}
);

但要注意这里只是监听服务器上的异常,并不监听消息生产者的异常。
五JMS集群
什么是JMS集群,我的理解是将JMS的消息目的分散到不同的服务器节点,当某个

服务器节点或某个服务器消息目的瘫痪时,JMS客户端就会收到JMS目的发生异常

的信息,这样,JMS客户端可以自动切换消息目的到其他服务器节点的消息目的

。此外使用JMS集群也可以利用服务器集群的负载均衡提高稳定性。
相关标签: jms