zoukankan      html  css  js  c++  java
  • JMS开发(三):JMS消息的确认方式

    这里单独列出来我也是觉得有点必要的,毕竟JMS总体知识点并不多,这点可能被很多人所忽视.

    首选定义:消息的确认是指消息接受者接到消息,并做出了对应的处理之后,它将回送一个确认消息.

    对于非事务性会话,创建会话时应该指定确定方式,JMS定义了3种确认方式:

    JMS确认3种方式
    Auto_ACKnowledge

    自动通知.
    对于同步消费者,Receive方法调用返回,且没有异常发生时,将自动对收到的消息予以确认.
    对于异步消息,当onMessage方法返回,且没有异常发生时,即对收到的消息自动确认.

    Client_AcKnowledge

    客户端自行决定通知时机

    这种方式要求客户端使用javax.jms.Message.acknowledge()方法完成确认.

    Dups_OK_ACKnowledge

    延时//批量通知

    这种确认方式允许JMS不必急于确认收到的消息,允许在收到多个消息之后一次完成确认,与Auto_AcKnowledge相比,这种确认方式在某些情况下可能更有效,因为没有确认,当系统崩溃或者网络出现故障的时候,消息可以被重新传递. 

    二:JMS连接创建JMS会话的代码:

    想回看下这段代码:

    01 /**
    02      * @description 下面是要从服务器上获取连接工厂的JNDI和队列地址的JNDI. 然后就是发送信息到服务器端.
    03      * @param msg  消息的文本内容
    04      * @param cfJNDI 连接工厂的JNDI
    05      * @param queueJNDI 队列的JNDI
    06      * @return 如果成功返回true.
    07      * @throws JMSException
    08      * @throws NamingException
    09      */
    10     private boolean getConnectFactory(String msg, String cfJNDI, String queueJNDI) throws JMSException, NamingException {
    11         Connection connection = null;
    12         MessageProducer producer = null;
    13         try {
    14             //初始化上下文
    15             InitialContext ic = new InitialContext();
    16             //JMS客户端使用JNDI 查找,定位 连接工厂
    17             ConnectionFactory connectionFactory = (ConnectionFactory) ic.lookup(cfJNDI);
    18             //PTP模式,使用Queue.JMS客户端使用JNDI 查找,定位 Queue.
    19             Queue queue = (Queue) ic.lookup(queueJNDI);
    20             //通过连接工厂,获取 JMS连接.
    21             connection = connectionFactory.createConnection();
    22             //通过JMS连接,获取到 JMS会话.后面的参数下章或下下章讲解.
    23             Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    24             //在JMS会话中,创建一个 JMS消息生产者.
    25             producer = session.createProducer(queue);
    26             //在JMS会话中,创建Text文本消息.
    27             TextMessage message = session.createTextMessage();
    28             message.setText(msg);
    29             //发送到JMS目的.
    30             producer.send(message);
    31             //关闭JMS.
    32             this.close(connection, producer);
    33         } catch (JMSException e) {
    34             this.close(connection, producer);
    35             throw new JMSException(e.getMessage());
    36         } catch (NamingException e) {
    37             this.close(connection, producer);
    38             throw new NamingException(e.getMessage());
    39         }
    40         return true;
    41     }
    42  
    43     private void close(Connection connection, MessageProducer producer) throws JMSException {
    44         try {
    45             if (null != producer) {
    46                 producer.close();
    47             }
    48             if (null != connection) {
    49                 connection.close();
    50             }
    51         } catch (JMSException e) {
    52             throw new JMSException(e.getMessage());
    53         }
    54     }
    1 //通过JMS连接,获取到 JMS会话.后面的参数下章或下下章讲解.
    2             Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    上面这句是重点,这段代码是创建Session时调用了Connection的方法,第一个false参数,是表明会话是否具有事务性.如果是false,必须指定确认方式.

  • 相关阅读:
    事务隔离级别
    OpenSessionInView
    图像平滑处理(滤波)
    [原]Nginx+Lua服务端合并静态文件
    检查数据倾斜分布
    SQL Server研究之统计信息—发现过期统计信息并处理具体解释
    GDALWarp设置GDALWarpOptions::dfWarpMemoryLimit过大时处理失败
    Android Studio 2.0 稳定版新特性介绍
    供应商和管理员查看供应商地址簿信息SQL
    Table AdvanceTable针对表内行禁用multipleSelection , singleSelection
  • 原文地址:https://www.cnblogs.com/chenying99/p/3164640.html
Copyright © 2011-2022 走看看