ActiveMq之事物和消息签收方式-yellowcong

ActiveMq消息队列中,需要知道消息的签收方式,以及事物 的案例,事物在生产过程中很重要,还有分布式事物的情况。

事务开启

#第一个参数 是否开启事物
#第二个参数 消息接受方式  客户端签收
Session session = conn.createSession(true, Session.CLIENT_ACKNOWLEDGE);

#提交事务
session.commit();

案例

package com.yellowcong.provice;


import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 创建用户:狂飙的yellowcong<br/>
 * 创建日期:2017年12月9日<br/>
 * 创建时间:上午9:35:14<br/>
 * 机能概要:
 */
public class DemoProvider {

    //activemq的服务器地址
    private static final String ACTIVEMQ_HOST = "tcp://192.168.100.10:61616";

    //用户名
    private static final String USERNAME = "yellowcong";
    //密码
    private static final String PASSWORD = "yellowcong";

    public static void main(String[] args) throws Exception {

        //1、创建连接的工厂类
        ConnectionFactory factory = new ActiveMQConnectionFactory(
                USERNAME,
                PASSWORD, 
                ACTIVEMQ_HOST);

        //2、创建Connection
        Connection conn = factory.createConnection();
        conn.start();

        //3、创建Session
        //第一个参数     是否开启事物
        //第二个参数 消息的接受方式
        Session session = conn.createSession(true, Session.CLIENT_ACKNOWLEDGE);

        //4、创建Destination, 目标的地址
        Destination dest = session.createQueue("yellowcong");

        //5、创建生产者
        MessageProducer prod = session.createProducer(dest);

        //设定消息不持久化
        prod.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

        for(int i=0;i<5;i++){
            TextMessage msg = session.createTextMessage();
            msg.setText("你是逗比吗\t"+i);
            //发送消息
            prod.send(msg);
        }

        //提交事物
        session.commit();

        //关闭连接
        conn.close();
    }
}

消息签收方式

//自动签收
Session.AUTO_ACKNOWLEDGE = 1; 
//客户端,手动签收,通过 执行    TextMessage.acknowledge(); 来表示签收
Session.CLIENT_ACKNOWLEDGE = 2; 
//不必确保用户是否签收,这种方式很少用
Session.DUPS_OK_ACKNOWLEDGE = 3;
//事物
Session.SESSION_TRANSACTED = 0;

案例演示一下手动签收

手动签收消息,在消息收到后,确认消息收到了,这样在ActiveMq中,就消费了这条消息。如果不签收,服务器就会认为没有消费这条消息

package com.yellowcong.provice;

import java.util.concurrent.SynchronousQueue;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;

/**
 * 创建用户:狂飙的yellowcong<br/>
 * 创建日期:2017年12月9日<br/>
 * 创建时间:上午10:41:00<br/>
 * 机能概要:
 */
public class DemoAck{
    // activemq的服务器地址
    private static final String ACTIVEMQ_HOST = "tcp://192.168.100.10:61616";

    // 用户名
    private static final String USERNAME = "yellowcong";
    // 密码
    private static final String PASSWORD = "yellowcong";

    public static void main(String[] args) throws Exception {
        provider();
        customer();
    }

    /**
     * 创建用户:狂飙的yellowcong<br/>
     * 创建日期:2017年12月9日<br/>
     * 创建时间:上午10:52:05<br/>
     * 机能概要:消费者确认消息
     * 
     * @throws Exception
     */
    public static void customer() throws Exception {
        // 获取连接
        Connection conn = null;

        try {
            conn = getConnection();
            // 获取session
            Session session = conn.createSession(true, Session.CLIENT_ACKNOWLEDGE);
            // 创建队列
            Destination destination = session.createQueue("test");
            // 获取消费者
            MessageConsumer cus = session.createConsumer(destination);
            // 接收消息
            TextMessage msg = (TextMessage) cus.receive();
            // 确认接收, 又开启一个线程,去发送给服务器,按收到消息了
            msg.acknowledge();
            System.out.println("-------------接收并确认消息----------------");
            System.out.println(msg.getText());

        } finally {
            // 关闭连接
            conn.close();
        }
    }

    /**
     * 创建用户:狂飙的yellowcong<br/>
     * 创建日期:2017年12月9日<br/>
     * 创建时间:上午10:48:03<br/>
     * 机能概要: 生产消息
     * 
     * @throws Exception
     */
    public static void provider() throws Exception {
        // 获取连接
        Connection conn = null;
        try {
            conn = getConnection();
            // 获取session
            Session session = conn.createSession(true, Session.CLIENT_ACKNOWLEDGE);
            // 创建队列
            Destination destination = session.createQueue("test");
            // 获取生产者
            MessageProducer pro = session.createProducer(destination);
            // 消息非持久化
            pro.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            // 创建消息
            TextMessage msg = session.createTextMessage();
            msg.setText("请确认消息");
            // 发送消息
            pro.send(msg);

            //提交事物
            session.commit();

            System.out.println("-----------------发送消息----------------");
        } finally {
            // 关闭连接
            conn.close();
        }

    }

    /**
     * 创建用户:狂飙的yellowcong<br/>
     * 创建日期:2017年12月9日<br/>
     * 创建时间:上午10:42:48<br/>
     * 机能概要: 获取连接
     * 
     * @return
     * @throws Exception
     */
    public static Connection getConnection() throws Exception {
        // 1.获取工厂连接类
        ConnectionFactory fc = new ActiveMQConnectionFactory(USERNAME, PASSWORD, ACTIVEMQ_HOST);

        // 2.获取连接
        Connection conn = fc.createConnection();
        conn.start();

        System.out.println("-----------------获取连接----------------");

        return conn;

    }
}

运行结果
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂飙的yellowcong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值