zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    使用redis配置分布式session
    邮件发送整合
    Spark基础-scala学习(八、隐式转换与隐式参数)
    QMQ去哪儿网-mq中间件(启动失败)
    Spark基础-scala学习(七、类型参数)
    JMH实践-代码性能测试工具
    Spark基础-scala学习(五、集合)
    [JavaWeb基础] 012.Struts2 自定义标签使用
    html5学习之路_003
    [Objective-C] 017_UI篇_UIView(中)
  • 原文地址:https://www.cnblogs.com/qlong8807/p/2961749.html
Copyright © 2011-2022 走看看