发送:
package com.bjpowernode.activemq.transaction;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* ClassName:TransactionSender
* Package:com.bjpowernode.activemq.transaction
* Description:
*
* @date:2018/10/16 10:29
* @author: robin
*/
public class TransactionSender {
public static void main(String[] args) {
send();
}
private static void send() {
MessageProducer producer=null;
Session session= null;
Connection connection=null;
try {
//1.根据Broker地址创建连接工厂对象
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.31.128:61616");
//2.创建连接对象
connection=connectionFactory.createConnection();
//3.创建Session回话对象,
// 参数1为是否使用事务性的消息 false表示不使用事务 true表示使用事务
//参数2表示消息的确认机制,会影响消息的接收方法而不会影响发送方法Session.AUTO_ACKNOWLEDGE表示自动确认
session=connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
//4.创建一个目的地对象,createQueue创建一个基于点对点的目的地对象,参数为目的地名称,需要与接收时对应
Destination destination=session.createQueue("myTransaction");
//5.创建一个文本类型的消息,并设定消息的数据内容
Message message=session.createTextMessage("queue的Transaction测试消息");
//6.创建消息的发送者 ,并设定消息的发送位置
producer=session.createProducer(destination);
//7.发送消息到指定的目的地
producer.send(message);
//开启事务消息后,必须显示手动调用commit方法否则消息不会写入broker,注意:一个方法要发送2条或以上的消息时需要开启事务;
session.commit();
System.out.println("消息发送成功");
} catch (JMSException e) {
e.printStackTrace();
}finally {
if(producer!=null){
try {
producer.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
if(session!=null){
try {
session.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}
接收:
package com.bjpowernode.activemq.transaction;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* ClassName:TransactionReceive
* Package:com.bjpowernode.activemq.transaction
* Description:
*
* @date:2018/10/16 10:32
* @author: robin
*/
public class TransactionReceive {
public static void main(String[] args) {
receive();
}
private static void receive() {
MessageConsumer consumer =null;
Session session=null;
Connection connection=null;
try {
//1.根据Broker地址创建连接工厂对象
ConnectionFactory connectionFactory=new ActiveMQConnectionFactory("tcp://192.168.31.128:61616");
//2.创建连接对象
connection=connectionFactory.createConnection();
connection.start();//接收消息前前必须要start否则无法读取消息,线程会阻塞在receive()方法上
//3.创建Session回话对象,
// 参数1为是否使用事务性的消息 false表示不使用事务 true表示使用事务
//参数2表示消息的确认机制,会影响消息的接收方法而不会影响发送方法Session.AUTO_ACKNOWLEDGE表示自动确认
// 消息处理成功第三步(消息确认) 消息成功消费后从broker中删除
session=connection.createSession(true,Session.AUTO_ACKNOWLEDGE);
//4.创建一个目的地对象,createQueue创建一个基于点对点的目的地对象,参数为目的地名称,需要与发送时对应
Destination destination=session.createQueue("myTransaction");
//5.创建消息的接收者 ,并设定从哪里获取消息
consumer =session.createConsumer(destination);
//6从消息服务中读取消息 接收消息(消息成功消费的第一步)
Message message= consumer.receive();
//注意:使用事务消息后,必须显示的调用commit否则,读取的消息不会从broker中移除,这样的话后面的所有消息都不能够被消费
//如果一个系统中的方法,需要读取多个队列中的数据来完成业务那么就需要使用事务消息,
//接收时如果只有一接收也要尽可能使用事务性的消息
session.commit();
//获取消息的具体内容
if(message instanceof TextMessage){
// 处理消息(消息成功处理第二步)
System.out.println(((TextMessage) message).getText());
}
} catch (JMSException e) {
e.printStackTrace();
}finally {
if(consumer!=null){
try {
consumer.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
if(session!=null){
try {
session.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
if(connection!=null){
try {
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
}