Active MQ的使用

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);
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章