jms原理简介-网摘

通常,jms应用程序开始于通过Jndi查找连接工厂ConnectionFactory实例,然后通过连接工厂创建Connection,再通过Connection创建Session实例。编程过程呢个非常类似于JDBC,我们将编写一个jms应用程序总结为以下六步:

1,jndi查找ConnectionFactory

2,Factory创建Connection

3,Connection创建sesson

4,session创建生产者、消费者

5,发送、接受消息

6,关闭资源



下面我们一步一步讲解,要使用jndi就必须有一个应用上下文,这里我们首先初始化一个应用上下文:

Hashtable properties = new Hashtable();

properties.put(Context.INITIAL_CONTEXT_FACTORY,"org.exolab.jms.jndi.InitialContextFactory");

properties.put(Context.PROVIDER_URL, "tcp://localhost:3035/");

Context context = new InitialContext(properties);

上述代码以服务器缺省配置创建了一个context,为了避免硬编码设计一些JNDI属性,我们在应用的classpath下新建一个jndi.properties ,以键值对的形式指定属性:

java.naming.factory.initial=org.exolab.jms.jndi.InitialContextFactory java.naming.provider.url=tcp://myhost:3035

 

现在初始化一个InitialContext 的代码就简化为:

Context context = new InitialContext();

创建ConnectionFactory:

通过JNDI查找连接工厂ConnectionFactory,openjms服务器的openjms.xml配置文件中预设值了一个名为“ConnectionFactory”的连接工厂,下面我们就可以通过这个名字查找。

ConnectionFactory factory = (ConnectionFactory) context.lookup("ConnectionFactory");

创建连接:

使用刚创建的连接工厂ConnectionFactory创建ConnectionFactory连接.
eg:

Connection connection = factory.createConnection();

//注意:这里的 Connection是jms的连接,位于包javax.jms包结构中,而非java.sql.Connection。


创建Session:

使用javax.jms.Connection创建Session,AUTO_ACKNOWLEDGE设定自动应答。

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

创建发送者:

要创建一个Producer必须指定目的地,通常目的地和连接工厂一样都是根据jndi获取。jms中分为点对点(point-to-point),发布订阅(publish-and-subscribe)两种,点对点是一对一行为,一个消息只能有一个接受者,而发布订阅模式类似于电视台和观众属于多对多;例如:CCTV1,ccvt2将自己的节目发送给全部观众,我们自己选择喜欢的节目接受收看,也就是接受消息;他们的区别在于消费者的数量;

Destination dest = context.lookup("destname");

MessageProducer sender = session.createProducer(dest);

备注:destname为服务器配置的目的地名称,配置在openjms.xml;


发送消息:

这里我们以文本消息为例,其他类似:

TextMessage message = session.createTextMessage("Hello World!");

sender.send(message); 同步接受消息:


MessageConsumer receiver = session.createConsumer(destination);

connection.start();

TextMessage message = (TextMessage) receiver.receive();异步接受消息:


通过MessageListener实现异步消息接受,核心实例代码如下:

MessageConsumer receiver = session.createConsumer(destination);

receiver.setMessageListener(new MessageListener(){

         public void onMessage(Message message) {

                     TextMessage text = (TextMessage) message;

            }

});

connection.start(); //开始连接、传输消息

释放资源:

context.close(); connection.close();

posted @ 2013-03-15 16:49  火光闪耀  阅读(524)  评论(0编辑  收藏  举报