Active MQ 是Apache出品,最流行的,能力強勁的開源消息總線。
一、Active MQ特性:
1、多種語言和協議編寫客戶端。語言: Java,C,C++,C#,Ruby,Perl,Python,PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
2、完全支持JMS1.1和J2EE 1.4規範 (持久化,XA消息,事務)
3、對Spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統裏面去,而且也支持Spring2.0的特性
4、通過了常見J2EE服務器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業服務器上
5、支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
6、支持通過JDBC和journal提供高速的消息持久化
7、從設計上保證了高性能的集羣,客戶端-服務器,點對點
8、支持Ajax
9、支持與Axis的整合
10、可以很容易的調用內嵌JMS provider,進行測試
二、消息中間件
接下來讓我們瞭解下消息中間件(MOM:Message Orient middleware)的概念:
1. 將數據從一個應用程序傳送到另一個應用程序,或者從軟件的一個模塊傳送到另外一個模塊;
2. 負責建立網絡通信的通道,進行數據的可靠傳送。
3. 保證數據不重發,不丟失
4. 能夠實現跨平臺操作,能夠爲不同操作系統上的軟件集成技工數據傳送服務
三、Active MQ使用實例
/**
* 消息隊列輔助類
* 提供從消息隊列裏讀取、寫入
* mq地址正式環境從配置文件裏讀取
*
*/
public class ActiveMqTookit {
private Connection connection = null;
// private String subject = "TOOL.DEFAULT"; "tcp://localhost:61616"
public static String mqBroker = "tcp://localhost:61616/";//mq地址
public static String spiderStatus="spiderStatus";//爬蟲狀態subject
protected BrokerService brokerService;
/**
* 以下爲正式環境數據庫配置文件讀取
*/
// try {
// InputStream is =
// JdbcUtil.class.getClassLoader().getResourceAsStream("classpath*:mq.properties");
// Properties pro = new Properties();
// pro.load(is);
// mqBroker = pro.getProperty("activemq.url");
// } catch (IOException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
/**
* 服務端active 寫入消息隊列
*
* @param msgList
* @param subject
* @param socketStr
*/
public void writeMsgToActiveMq(ArrayList<String> msgList, String subject,
String socketStr) {
try {
ActiveMQConnectionFactory connectionFactory = null;
Session session = null;
session = getSession(socketStr, connectionFactory, session);
// 創建destination
Destination destination = session.createQueue(subject);
// 創建producer
MessageProducer producer = session.createProducer(destination);
// 設置JMS的持久性
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (String s : msgList) {
TextMessage message = session.createTextMessage(s);
// 發生消息message
producer.send(message);
// 關閉資源
message.clearProperties();
}
session.close();
connection.stop();
connection.close();
System.out.println("msgList的長度是:"+msgList.size());
System.out.println("關閉資源。。。。");
} catch (JMSException e) {
e.printStackTrace();
}
}
/**
* 服務端active json數據類型 寫入消息隊列
* @param msgJsonList
* @param subject
* @param socketStr
*/
public void writeMsgToActiveMqByJson(ArrayList<JSONObject> msgJsonList, String subject,
String socketStr){
ArrayList<String> msgList=new ArrayList<String>();
for(JSONObject obj:msgJsonList){
msgList.add(obj.toString());
}
writeMsgToActiveMq(msgList,subject,socketStr);
}
/**
* 服務端active json數據類型 寫入消息隊列
* @param msgJsonList
* @param subject
* @param socketStr
*/
public void writeMsgToActiveMqByJson(JSONArray array, String subject,
String socketStr){
ArrayList<String> msgList=new ArrayList<String>();
for(int i=0;i<array.size();i++){
msgList.add(array.getJSONObject(i).toString());
}
writeMsgToActiveMq(msgList,subject,socketStr);
}
/**
* 獲取消息隊列session對象
*
* @param socketStr
* @param connectionFactory
* @param session
* @return
*/
public Session getSession(String socketStr,
ActiveMQConnectionFactory connectionFactory, Session session) {
try {
if (null == connectionFactory) {
connectionFactory = new ActiveMQConnectionFactory(socketStr);
}
// 創建connection
if (null == connection) {
connection = connectionFactory.createConnection();
}
// 創建session,設置消息確認機制
if (null == session) {
connection.start();
session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
}
return session;
} catch (JMSException e) {
e.printStackTrace();
JdbcUtil.executeSql("insert into spi_u_exceptionlog(exceptionType,description ) values ('activateMQ未啓動','activateMQ未啓動,請啓動activateMQ')");
}
return null;
}
/**
* 服務端active 讀取消息隊列
* @param readCount
* @param socketUrl
* @param subject
* @return
*/
public ArrayList<String> readMsgFromActiveMq(int readCount,
String socketUrl, String subject) {
ArrayList<String> msgList = new ArrayList<String>();
ActiveMQConnectionFactory connectionFactory = null;
Session session = null;
try {
// 創建session
session = getSession(socketUrl, connectionFactory, session);
// 創建destination
Destination destination = session.createQueue(subject);
MessageConsumer consumer = session.createConsumer(destination);
for (int i = 0; i < readCount; i++) {
Message msg = consumer.receive(3000);
if(msg==null){
break;
}
String str = ((TextMessage) msg).getText();
msgList.add(str);
msg.clearProperties();
}
return msgList;
} catch (JMSException e) {
e.printStackTrace();
} finally {
try {
session.close();
connection.stop();
connection.close();
} catch (JMSException ex) {
ex.printStackTrace();
}
}
return null;
}
/**
* 從mq中讀取數據
* @param spider
* @param readCount
* @return
*/
public static ArrayList<String> readFromMq(String subject,int readCount){
ActiveMqTookit activeMqTookit = new ActiveMqTookit();
ArrayList<String> resultList = activeMqTookit.readMsgFromActiveMq(readCount, ActiveMqTookit.mqBroker, subject);
return resultList;
}
/**
* 寫入數據到mq
* @param spider
* @param readCount
* @return
*/
public static void writeToMq(JSONArray jsonArray,String subject){
ActiveMqTookit activeMqTookit = new ActiveMqTookit();
activeMqTookit.writeMsgToActiveMqByJson(jsonArray, subject,ActiveMqTookit.mqBroker);
}
public static void writeToMq(JSONObject object,String subject){
ActiveMqTookit activeMqTookit = new ActiveMqTookit();
ArrayList<String> msgList = new ArrayList<String>();
msgList.add(object.toString());
activeMqTookit.writeMsgToActiveMq(msgList, subject, ActiveMqTookit.mqBroker);
}
}