一、消息接收者(点对点)
package recevers;
import Constants.Constant;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* jms消息接收者,点对点
* Created with IntelliJ IDEA.
* User: wxshi
* Date: 15-3-6
* Time: 下午4:58
* To change this template use File | Settings | File Templates.
*/
public class QueueReceiver {
private ConnectionFactory connectionFactory; // ConnectionFactory :连接工厂,JMS 用它创建连接
private Connection connection; // Connection :JMS 客户端到JMS Provider 的连接
private Session session; // Session: 一个发送或接收消息的线程
private Destination destination; // Destination :消息的目的地;消息发送给谁.
public QueueReceiver(){
try{
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, Constant.MQ_URL);
connection = connectionFactory.createConnection(); // 构造从工厂得到连接对象
session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); // 获取会话
destination = session.createQueue(Constant.QUEUE);
connection.start(); // 启动
}catch (Exception e){
e.printStackTrace();
}
}
//接收消息并处理
public void receiveMsg(){
try {
MessageConsumer consumer = null; // 消费者,消息接收者
String msgSelecter = "JMSCorrelationID='5' AND msgName='消息5'"; //定义消息选择器
consumer = session.createConsumer(destination,msgSelecter); //使用消息选择器创建接收者
while (true) {
// 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
Message message = consumer.receive(100000);
if (null != message) {
if(message instanceof TextMessage){
System.out.println("收到text消息:" + ((TextMessage) message).getText());
}else if(message instanceof StreamMessage){
System.out.println("收到stream消息名:" + message.getStringProperty("streamName"));
System.out.println("收到stream消息内容:" + message.getStringProperty("streamContent"));
}else if(message instanceof MapMessage){
System.out.println("收到map消息名:" + message.getStringProperty("mapName"));
System.out.println("收到map消息内容:" + message.getStringProperty("mapContent"));
}else if(message instanceof ObjectMessage){
System.out.println("收到object消息:" + ((ObjectMessage) message).getObject().toString());
}
System.out.println("准备回复确认...");
System.out.println("----------------------------");
MessageProducer sender = session.createProducer(message.getJMSReplyTo());
TextMessage reqMsg = session.createTextMessage("消费者已经消费消息0");
reqMsg.setJMSCorrelationID(message.getStringProperty("uuid"));
sender.send(reqMsg);
sender.setTimeToLive(10000);
session.commit();
}else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//关闭链接
public void exit(){
try{
if(connection!=null){
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
QueueReceiver queueReceiver = new QueueReceiver();
queueReceiver.receiveMsg();
queueReceiver.exit();
}
}
二、消息生产者(点对点):
package senders;
import Constants.Constant;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
import java.util.UUID;
/**
* jms消息发送者,点对点
* Created with IntelliJ IDEA.
* User: wxshi
* Date: 15-3-6
* Time: 下午4:57
* To change this template use File | Settings | File Templates.
*/
public class QueueSender {
private ConnectionFactory connectionFactory; // ConnectionFactory :连接工厂,JMS 用它创建连接
private Connection connection = null; //Provider 的连接 Connection :JMS 客户端到JMS
private Session session; // Session: 一个发送或接收消息的线程
private Destination destination; // Destination :消息的目的地;消息发送给谁.
private String uuid ;
private Destination destinationReq; //消息确认队列
public QueueSender(){
try{
// 构造ConnectionFactory实例对象,此处采用ActiveMq的实现jar
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, Constant.MQ_URL);
connection = connectionFactory.createConnection(); // 获取操作连接
session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); //创建jms会话
destination = session.createQueue(Constant.QUEUE); //创建消息队列,即消息目的地
destinationReq = session.createQueue(Constant.RESPOMSE_QUEUE);
connection.start(); // 启动
}catch (Exception e){
e.printStackTrace();
}
}
//发送消息
public void sendMessage(){
try{
MessageProducer producer = null; // MessageProducer:消息发送者
producer = session.createProducer(destination); // 得到消息生成者【发送者】
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); // 设置不持久化,此处学习,实际根据项目决定
producer.setTimeToLive(10000); //设置消息十秒后失效
for (int i = 1; i <= Constant.SEND_NUMBER; i++) {
Message message = null;
uuid = UUID.randomUUID().toString();
if(i==1){
message = session.createTextMessage("ActiveMq 发送的消息"+ i);
//以下两行是设置消息选择器
message.setJMSCorrelationID("1");
message.setStringProperty("msgName", "消息1");
System.out.println("发送text消息:" + "ActiveMq 发送的消息" + i);
}else if(i==2){
message = session.createStreamMessage();
message.setStringProperty("streamName","streamMsg消息名"+i);
message.setStringProperty("streamContent","streamMsg消息内容"+i);
//以下两行是设置消息选择器
message.setJMSCorrelationID("2");
message.setStringProperty("msgName", "消息2");
System.out.println("发送stream消息:" + "ActiveMq 发送的消息" + i);
}else if(i==3){
message = session.createObjectMessage();
((ObjectMessage)message).setObject(new String("object消息内容"+i));
//以下两行是设置消息选择器
message.setJMSCorrelationID("3");
message.setStringProperty("msgName", "消息3");
System.out.println("发送object消息:" + "ActiveMq 发送的消息" + i);
}else if(i==4){
message = session.createObjectMessage();
((ObjectMessage)message).setObject(new String("object消息内容"+i));
//以下两行是设置消息选择器
message.setJMSCorrelationID("4");
message.setStringProperty("msgName", "消息4");
System.out.println("发送object消息:" + "ActiveMq 发送的消息" + i);
}else{
message = session.createMapMessage();
message.setStringProperty("mapName","map消息"+i);
message.setStringProperty("mapContent","map消息内容"+i);
//以下两行是设置消息选择器
message.setJMSCorrelationID("5");
message.setStringProperty("msgName", "消息5");
System.out.println("发送map消息:" + "ActiveMq 发送的消息" + i);
}
message.setJMSReplyTo(destinationReq);
message.setStringProperty("uuid",uuid);
producer.send(message); // 发送消息到目的地方
session.commit();
this.receiveReq();
// String filter = "JMSCorrelationID = '"+message.getJMSMessageID()+"'";
}
// session.commit();
}catch (Exception e){
e.printStackTrace();
}
}
//接收确认消息
public void receiveReq(){
try{
while(true){
String filter = "JMSCorrelationID = '"+uuid+"'"; //收到接收者1的确认消息
MessageConsumer consumer = session.createConsumer(destinationReq,filter);
TextMessage message = (TextMessage) consumer.receive(10000);
if(message!=null){
System.out.println("收到消息确认:" + message.getText());
System.out.println("------------------");
} else{
break;
}
}
}catch (JMSException e){
e.printStackTrace();
}
}
//关闭链接
public void exit(){
try{
if(connection!=null){
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
QueueSender queueSender = new QueueSender();
queueSender.sendMessage();
// queueSender.receiveReq();
queueSender.exit();
}
}
三、消息接收者(订阅、发布):
package recevers;
import Constants.Constant;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* 持久订阅者,在没有开启的情况下,也不会漏掉消息
* Created with IntelliJ IDEA.
* User: wxshi
* Date: 15-3-9
* Time: 下午4:05
* To change this template use File | Settings | File Templates.
*/
public class TopicRecever {
private ConnectionFactory connectionFactory; // ConnectionFactory :连接工厂,JMS用它创建连接
private Connection connection = null ; // Connection :JMS客户端到JMS Provider的连接
private Session session; // Session:一个发送或接收消息的线程
private Topic topic; //主题
public TopicRecever(){
try {
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
Constant.MQ_URL);
connection =connectionFactory.createConnection(); // 构造从工厂得到连接对象
connection.setClientID("clientID0019");
connection.start(); // 启动
session = connection.createSession( false ,Session.AUTO_ACKNOWLEDGE); // 获取session
topic = session.createTopic(Constant.TOPIC); // 获取操作连接主题 ,消费者从这里获取消息
}catch (JMSException e){
e.printStackTrace();
}
}
//接收消息并处理
public void receiveMessage(){
try {
MessageConsumer consumer = null; // 消费者,消息接收者
String msgSelecter = "JMSCorrelationID='1' AND msgName='消息1'"; //定义消息选择器
consumer = session.createDurableSubscriber(topic, "MQ_sub19",msgSelecter,false); // 得到消息生成者【发送者】
while ( true ){
// 设置接收者接收消息的时间,为了便于测试,这里谁定为100s
Message message = consumer.receive(100000);
if (null != message) {
if(message instanceof TextMessage){
System.out.println("收到text消息:" + ((TextMessage) message).getText());
System.out.println("----------------------------");
}else if(message instanceof StreamMessage){
System.out.println("收到stream消息名:" + message.getStringProperty("streamName"));
System.out.println("收到stream消息内容:" + message.getStringProperty("streamContent"));
System.out.println("----------------------------");
}else if(message instanceof MapMessage){
System.out.println("收到map消息名:" + message.getStringProperty("mapName"));
System.out.println("收到map消息内容:" + message.getStringProperty("mapContent"));
System.out.println("----------------------------");
}else if(message instanceof ObjectMessage){
System.out.println("收到object消息:" + ((ObjectMessage) message).getObject().toString());
System.out.println("----------------------------");
}
} else break ;
}
}catch (JMSException e){
e.printStackTrace();
}
}
//关闭链接
public void exit(){
try{
if(connection!=null){
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
TopicRecever topicRecever = new TopicRecever();
topicRecever.receiveMessage();
topicRecever.exit();
}
}
四、消息生产者(订阅、发布):
package senders;
import Constants.Constant;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
/**
* jms消息服务:发布/订阅模式
* Created with IntelliJ IDEA.
* User: wxshi
* Date: 15-3-9
* Time: 下午4:04
* To change this template use File | Settings | File Templates.
*/
public class TopicSender {
private ConnectionFactory connectionFactory; // ConnectionFactory :连接工厂,JMS用它创建连接
private Connection connection = null ; // Connection :JMS客户端到JMS Provider的连接
private Session session; // Session:一个发送或接收消息的线程
private Topic topic; //主题
public TopicSender(){
try{
connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD,
Constant.MQ_URL);
connection = connectionFactory.createConnection(); //得到连接对象
connection.start(); //启动
//获取操作连接
session = connection.createSession( false , Session.AUTO_ACKNOWLEDGE);
topic = session.createTopic(Constant.TOPIC); // 主题,消息目的地
}catch (JMSException e){
e.printStackTrace();
}
}
//发送消息
public void sendMessage(){
try{
MessageProducer producer = null; //消息发送者
producer = session.createProducer(topic); // 得到消息生成者【发送者】
producer.setDeliveryMode(DeliveryMode.PERSISTENT); //设置持久化
for ( int i= 1 ; i<=Constant.SEND_NUMBER; i++){
Message message = null;
if(i==1){
message = session.createTextMessage("ActiveMq 发送的消息"+ i);
//以下两行是设置消息选择器
message.setJMSCorrelationID("1");
message.setStringProperty("msgName", "消息1");
System.out.println("发送text消息:" + "ActiveMq 发送的消息" + i);
}else if(i==2){
message = session.createStreamMessage();
message.setStringProperty("streamName","streamMsg消息名"+i);
message.setStringProperty("streamContent","streamMsg消息内容"+i);
//以下两行是设置消息选择器
message.setJMSCorrelationID("2");
message.setStringProperty("msgName", "消息2");
System.out.println("发送stream消息:" + "ActiveMq 发送的消息" + i);
}else if(i==3){
message = session.createObjectMessage();
((ObjectMessage)message).setObject(new String("object消息内容"+i));
//以下两行是设置消息选择器
message.setJMSCorrelationID("3");
message.setStringProperty("msgName", "消息3");
System.out.println("发送object消息:" + "ActiveMq 发送的消息" + i);
}else{
message = session.createMapMessage();
message.setStringProperty("mapName","map消息"+i);
message.setStringProperty("mapContent","map消息内容"+i);
//以下两行是设置消息选择器
message.setJMSCorrelationID("4");
message.setStringProperty("msgName", "消息4");
System.out.println("发送map消息:" + "ActiveMq 发送的消息" + i);
}
producer.send(message);
}
}catch (JMSException e){
e.printStackTrace();
}
}
//关闭链接
public void exit(){
try{
if(connection!=null){
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
TopicSender topicSender = new TopicSender();
topicSender.sendMessage();
topicSender.exit();
}
}