消息發送類
package com.wq.activeMq;
import java.io.Serializable;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
/**
* 消息發送類.
*
* @author wq
*
*/
public class MsgSender {
/** tcp地址. */
public static String tcpUrl = "tcp://localhost:61616";
/** ConnectionFactory :連接工廠,JMS 用它創建連接. */
public static ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, tcpUrl);
/**
* 發送文本消息.
* @param session
* @param producer
* @param msgType
* @param msg
*/
private static void sendTextMsg(Session session, MessageProducer producer,
String msgType, String msg) {
try {
// 構造消息.
TextMessage message;
// 獲得文本消息.
message = session.createTextMessage(msg);
// 設置消息類型.
message.setJMSType(msgType);
// 發送消息到目的地方.
producer.send(message);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 發送對象消息.
* @param session
* @param producer
* @param msgType
* @param msg
*/
private static void sendObjMsg(Session session, MessageProducer producer,
String msgType, Serializable msg) {
try {
// 構造消息.
ObjectMessage message;
// 獲得文本消息.
message = session.createObjectMessage(msg);
// 設置消息類型.
message.setJMSType(msgType);
// 發送消息到目的地方.
producer.send(message);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 發送消息.
*
* @param destinationName
* @param msgType
* @param msg
*/
public static void send(String destinationName, String msgType, Object msg) {
// Connection :JMS 客戶端到JMS Provider 的連接.
Connection connection = null;
// Session: 一個發送或接收消息的線程.
Session session;
// Destination :消息的目的地;消息發送給誰.
Destination destination;
// MessageProducer:消息發送者.
MessageProducer producer;
try {
// 構造從工廠得到連接對象.
connection = connectionFactory.createConnection();
// 啓動.
connection.start();
// 獲取操作連接.
session = connection.createSession(Boolean.TRUE,
Session.AUTO_ACKNOWLEDGE);
// destinationName需要在admin界面創建.
destination = session.createQueue(destinationName);
// 得到消息生成者.
producer = session.createProducer(destination);
// 設置持久化.
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
// 發送消息
if(msg instanceof String){// 文本類型
sendTextMsg(session,producer,msgType,msg.toString());
}else if(msg instanceof Serializable){// 序列化對象類型
sendObjMsg(session,producer,msgType,(Serializable)msg);
}else{// 默認是文本類型
sendTextMsg(session,producer,msgType,msg.toString());
}
// 提交事務.
session.commit();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
接收消息處理類
package com.wq.activeMq;
import java.util.HashMap;
import java.util.Map;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import com.wq.activeMq.receive.ReceiveObject;
import com.wq.activeMq.receive.ReceiveText;
/**
* 接收消息處理.
*
* @author wq
*
*/
public class MsgReceive {
/** tcp地址. */
public static String tcpUrl = "tcp://localhost:61616";
/** ConnectionFactory :連接工廠,JMS 用它創建連接. */
public static ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
ActiveMQConnection.DEFAULT_USER,
ActiveMQConnection.DEFAULT_PASSWORD, tcpUrl);
/** 消息處理類. */
public static Map<String, MsgDeal> msgDealMap = new HashMap<String, MsgDeal>();
static {
msgDealMap.put("TextType", new ReceiveText());
msgDealMap.put("ObjType", new ReceiveObject());
}
public static void Reveive(String destinationName) {
// Connection :JMS 客戶端到JMS Provider 的連接.
Connection connection = null;
// Session: 一個發送或接收消息的線程.
Session session;
// Destination :消息的目的地;消息發送給誰.
Destination destination;
// 消費者,消息接收者.
MessageConsumer consumer;
try {
// 構造從工廠得到連接對象
connection = connectionFactory.createConnection();
// 啓動
connection.start();
// 獲取操作連接
session = connection.createSession(Boolean.FALSE,
Session.AUTO_ACKNOWLEDGE);
// 獲取session注意參數是一個服務器的queue,須在在ActiveMq的console配置
destination = session.createQueue(destinationName);
// 獲取消費者
consumer = session.createConsumer(destination);
while (true) {
Message msg = consumer.receive(1000);
if (null != msg) {
String msgType = msg.getJMSType();
MsgDeal msgDeal = msgDealMap.get(msgType);
if(null != msgDeal){
msgDeal.onMessage(msg);
}else{
System.err.println("沒有配置msgDealMap:[" + msgType + "]");
}
} else {
break;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != connection) {
connection.close();
}
} catch (Throwable ignore) {
}
}
}
}
消息處理接口
package com.wq.activeMq;
import javax.jms.Message;
/**
* 消息處理接口.
* @author qingwu
*
*/
public interface MsgDeal {
void onMessage(Message msg);
}
文本消息處理測試接口實現
package com.wq.activeMq.receive;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;
import com.wq.activeMq.MsgDeal;
/**
* 文本消息接收處理測試.
*
* @author wq
*
*/
public class ReceiveText implements MsgDeal {
@Override
public void onMessage(Message msg) {
// TODO Auto-generated method stub
try {
TextMessage message = (TextMessage) msg;
if (null != message) {
System.out.println("收到TEXT消息:" + message.getText());
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
對象消息處理測試接口實現
package com.wq.activeMq.receive;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import com.wq.activeMq.MsgDeal;
import com.wq.test.TestVO;
/**
* 對象消息接收測試.
*
* @author wq
*
*/
public class ReceiveObject implements MsgDeal {
@Override
public void onMessage(Message msg) {
// TODO Auto-generated method stub
try {
ObjectMessage message = (ObjectMessage) msg;
if (null != message) {
TestVO vo = (TestVO) message.getObject();
System.out.println("收到OBJECT消息:" + vo.getName() + " " + vo.getSex() + " " + vo.getAge());
}
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
測試VO對象
package com.wq.test;
import java.io.Serializable;
public class TestVO implements Serializable {
private static final long serialVersionUID = -9118138350208832294L;
String name;
String sex;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
發送測試
package com.wq.test;
import com.wq.activeMq.MsgSender;
public class SendTest {
public static void sendText(){
String destinationName = "queue1";
for(int i=0;i<5;i++){
String msgType = "TextType";
String msg = "text_" + i;
MsgSender.send(destinationName, msgType, msg);
}
}
public static void sendObj(){
String destinationName = "queue1";
for(int i=0;i<5;i++){
String msgType = "ObjType";
TestVO vo = new TestVO();
vo.setName("name_"+i);
vo.setSex("sex_"+i);
vo.setAge(i);
MsgSender.send(destinationName, msgType, vo);
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
sendText();
sendObj();
}
}
接收測試
package com.wq.test;
import com.wq.activeMq.MsgReceive;
public class ReceiveTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MsgReceive.Reveive("queue1");
}
}