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,必须指定确认方式.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值