JMS消息对象、队列浏览器、事务、异常监听、集群学习笔记
程序员文章站
2022-05-03 23:50:51
...
学习了李刚的javaEE企业应用实战,做了有关笔记和思考。
JMS消息
一JMS消息对象
1.不管哪种消息对象,它都是Message接口的实例,它包含标准的消息头,可扩
展的消息属性,消息主体内容。而其中的消息头、消息属性本质上都是一系列的
key-value对,而其区别就在于消息头的所有key都是标准的、固定的,而消息属
性则是我们可以自己定义的。我们通过
2.重用消息对象:为什么可以重用消息对象?这是因为使用send()方法发送消息
时,会把有关消息的数据复制到一个内部缓冲中,一旦send()方法调用完成,我
们就可以重新使用Message了,而不必担心原来的数据还没有发出去就被覆盖。
对于JMS消息消费者来说,消息是只读的。这就好像是别人发来的邮件,或是别
人在BBS上发表的主题,我们不能修改一样。
3.JMS消息传递方式和有效时间。
这个有效期就代表这个消息能够存储多长时间。
4.设置消息的优先级,
越高,第二,这个设置的是消息生产者的默认优先级,第三,如果我们不设置优
先级的话,那么它就默认为4。最后,我们也可以设置某次传输的优先级或者说
传输模式,如sender.send(msg,DeliveryMode.PERSISTENT,3,15000);
5.消息的确认方式,AUTO_ACKNOWLEDGE,自动确认,还有其他的方式,这里不再
赘述。
6.消息选择器,什么是消息选择器,我的理解是,消息消费者用他们选择他们感
兴趣的消息。
据指定的消息目的来创建一个消息消费者。这个消息选择器的表达式是一个
SQL-92的字符串表达式。
7.消息的临时目的:为了动态创建消息目的,我们使用消息的临时目的,客户端
在使用时临时创建,客户端退出时删除。消息目的的一个使用场景就是将
JMSReplayTo消息头设为临时创建的消息目的,当JMS消费者收到消息后,向该临
时消息目的返回一个响应。这个JMSReplayTo就相当于消息发送地址。
二.使用队列浏览器查看全部消息,createBrowser(Queue queue);根据指定的队
列来创建一个队列浏览器。
三.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服务器的引用。如:
四JMS服务器的异常监听
如果JMS服务器异常了,那么JMS客户端就无法收到这些异常的信息,那么为了让
JMS客户端可以接收到JMS服务器上的异常信息。JMS提供一种异常监听器机制。
异常监听器需要实现javax.jms.ExceptionListener接口,实现该接口需要实现
onException方法。
但要注意这里只是监听服务器上的异常,并不监听消息生产者的异常。
五JMS集群
什么是JMS集群,我的理解是将JMS的消息目的分散到不同的服务器节点,当某个
服务器节点或某个服务器消息目的瘫痪时,JMS客户端就会收到JMS目的发生异常
的信息,这样,JMS客户端可以自动切换消息目的到其他服务器节点的消息目的
。此外使用JMS集群也可以利用服务器集群的负载均衡提高稳定性。
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集群也可以利用服务器集群的负载均衡提高稳定性。
上一篇: Java泛型