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;
}
}
运行结果