CSDN博客

img liuzhenwen

JBoss4中JMS的使用

发表于2008/9/28 11:01:00  849人阅读

在现在的项目中分布式程序越来越多,SOA的架构下,各种服务相互调用都是以消息来传递的,所以JMS作为java的消息机制因该要很好的掌握一下,当然像web services之间并不是直接调用JMS的API。

本文主要是讲JMS的在JBoss4中的具体使用,JBoss中的JMS的实现叫JBossMQ,关于其理论方面很多文章都有讲,google一下就有了,所以这里就不重复了。至于像在weblogic,websphere中的使用也大同小异。

JMS的使用按照其Destination分为两种,一种是queue,也就是点对点模式;一种是topic,也就是发布/订阅模式,两者在一些使用上还是有比较大的差别的。

首先我们来看以queue为Destination的模式,它是一种点对点模式,也就是说发送方发送一条消息到jms服务器上后,message保存在一个queue中,接收者从jms服务器中取得该message后,queue中的该message也就没了,再有其它的用户来取就取不到了。也就是说该条消息只有一个用户,这是区别于topic最本质的地方。具体编码如下:先通过jnid查找到一个QueueConnectionFactory(jboss提供了好几种ConnectionFactory)和一个Queue,关于对一个具体的Queue的定义在JBoss中的jbossmq-destinations-service.xml的配置文件中。说到这简单介绍一下JBoss4种关于JMS的一些配置文件,它们在deploy/jms下,一般我们常规的使用可能要用到下面几个

jbossmq-destinations-service:设置Destination

hsqldb-jdbc-state-service.xml:连接JMS的用户名和密码设置,它会在jboss启动时往一个内存型数据库中建立用户名及其对应的密码的表,如果我们用topic的Durable连接也要在它中间设置用户名和密码

hsqldb-jdbc2-service.xml:将message持久化到数据库的配置文件,它中间包含sql语句,你可以在docs/examples/jms下找到一些具体数据库的配置文件样例。我们默认的message也是持久化的,应该是保存在一个file中,但我还没找到这个地方。

上面三个可能是我们要使用中要修改的,还有一些也是比较重要的配合文件

jbossmq-service.xml:关于jbossmq的一些默认的配置

jms-ds.xml;等等

言规正转我们还是接着讲queue的编程。当得到Queue和QueueConnectionFactory后我们得到一个QueueConncetion,然后通过QueueConnection得到QueueSession,通过QueueSession和Queue能得到关于这个Queue的QueueSender或是QueueReceiver,对应产生消息并发送没什么好说的,对于消息的消费有两种,一种是同步,即通过QueueReceiver的receive()方法从JMS的queue中去拉消息,一次只能取得一条消息;另一种是异步的,即通过QueueReceiver set一个MessageListener给JMS服务器,有message到了,则推给QueueReceiver,回调MessageListener中的onMessage()方法,这样是可以持续保持连接,用户可以得到多条消息。利用queue来发送消息,没有durable的说法,因为它从本质上对message的消费者来说就是durable的,当我们messagesend到queue中后,服务器会对message持久化的,我们即使关闭服务器都没问题,当我们在启动服务器后,如果有消费者连接到该queue上则可以取得该消息,我们不用提及注册该用户,而且发消息时消费者不必是激发的,对于拉方式来说肯定不是激活的,对于推方式也没有强求,这点和topic有些不同。

下面我们来看关于topic的模式,它是一种订阅/发布的模式,它的一份消息可以被多个用户消费,但有一点要记得,就是你只能消费你订阅后该topic发布的消息,也就是说该topic之前发布的消息你得不到,这就要求你在使用时要先注册(相当于订阅),这对非durable的消费没有什么用,因为非durable的消费,只能在你消费者是激活状态下才能得到消息,也就是消费者程序是在运行的,这样程序开始部分就相当于注册了;而对于durable的消费,则有些不一样,durable的连接是指当消费者的程序没有运行时,topic发布的消息在它激活后也能收到,这就要求要先注册一些,durable的连接要有个用户名的,我们可以先建立和该topic的连接,把指定的用户名设置好,下次durable的连接过去一看是同一个用户名,则将以前的message也发过来,从而达到我们的要求,当然这是在我们第一次运行durable的连接的客户程序是就要收到以前的message才要注册,如果以前没有则不需注册,我在第一次运行时就相当于注册了。这种注册只需一次,以后就不用来,估计该注册信息也是持久化了的。同样topic也有退和拉两种方式来取得消息。为什么topic模式需要提前订阅了,因为一个topic的message有多个消费,所以你不先注册,那么jms服务器不知道要把消息发给谁,而queue则不管有多少个用户,它只保证把message给一个用户就行,所以两者在这个地方还是有些不同的。

第一篇就写到这把,我们现在已经能够用程序写出保证消息能够被我们要求的一个用户消费的程序了,不管这中间出现什么异常,这就保证了消息发送的可靠性。在下一篇中我将来讲解消息持久性方面的一些内容和在JMS中的一些事务方面。

阅读全文
0 0

相关文章推荐

img
取 消
img