`

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

    博客分类:
  • JMS
jms 
阅读更多
学习了李刚的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集群也可以利用服务器集群的负载均衡提高稳定性。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics