activeMQ
是學習java消息隊列的實現(xiàn)項目召烂,使用jfinal +jfinal-ext + activeMQ + quartz快速構建。
1.消息隊列
消息隊列娃承,其實是一種基于數(shù)據(jù)結構實現(xiàn)的服務奏夫。而java語言中的實現(xiàn),有apache的activeMQ历筝,比較主流酗昼。
2.環(huán)境搭建
首先去apache的官網(wǎng)下載apache-activeMQ-...-.zip的包,解壓后梳猪,運行bin中的activeMQ服務仔雷。在瀏覽器中輸入http://localhost:8186/admin,出現(xiàn)登陸界面輸入admin/admin登陸即可。
然后創(chuàng)建一個FirstQueue隊列(給后面的實例提供服務)舔示。
3.activeMQ原始操作
記住activeMQ服務一定要一直開啟碟婆,發(fā)送者和接收者都會通過tcp協(xié)議去鏈接服務器,以取得消息隊列中的消息體惕稻。如下圖是我的服務器cmd截圖:
3.1.首先建立發(fā)送者Sender.java
packagecom.mg.demo;importjavax.jms.Connection;importjavax.jms.ConnectionFactory;importjavax.jms.DeliveryMode;importjavax.jms.Destination;importjavax.jms.MessageProducer;importjavax.jms.Session;importjavax.jms.TextMessage;importorg.apache.activemq.ActiveMQConnection;importorg.apache.activemq.ActiveMQConnectionFactory;publicclassSender {privatestaticfinalintSEND_NUMBER =5;publicstaticvoidmain(String[] args) {// ConnectionFactory :連接工廠竖共,JMS 用它創(chuàng)建連接ConnectionFactory connectionFactory;// Connection :JMS 客戶端到JMS// Provider 的連接Connection connection =null;// Session: 一個發(fā)送或接收消息的線程Session session;// Destination :消息的目的地;消息發(fā)送給誰.Destination destination;// MessageProducer:消息發(fā)送者MessageProducer producer;// TextMessage message;// 構造ConnectionFactory實例對象,此處采用ActiveMq的實現(xiàn)jarconnectionFactory =newActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,"tcp://localhost:61616");try{// 構造從工廠得到連接對象connection = connectionFactory.createConnection();// 啟動connection.start();// 獲取操作連接session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);// 獲取session注意參數(shù)值xingbo.xu-queue是一個服務器的queue俺祠,須在在ActiveMq的console配置destination = session.createQueue("FirstQueue");// 得到消息生成者【發(fā)送者】producer = session.createProducer(destination);// 設置不持久化公给,此處學習借帘,實際根據(jù)項目決定producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);// 構造消息,此處寫死淌铐,項目就是參數(shù)肺然,或者方法獲取sendMessage(session, producer); session.commit(); }catch(Exception e) { e.printStackTrace(); }finally{try{if(null!= connection) connection.close(); }catch(Throwable ignore) { } } }publicstaticvoidsendMessage(Session session, MessageProducer producer)throwsException {for(inti =1; i <= SEND_NUMBER; i++) { TextMessage message = session.createTextMessage("ActiveMq 發(fā)送的消息"+ i);// 發(fā)送消息到目的地方System.out.println("發(fā)送消息:"+"ActiveMq 發(fā)送的消息"+ i); producer.send(message); } }
3.2.再創(chuàng)建接收者Receiver.java
packagecom.mg.demo;importjavax.jms.Connection;importjavax.jms.ConnectionFactory;importjavax.jms.Destination;importjavax.jms.MessageConsumer;importjavax.jms.Session;importjavax.jms.TextMessage;importorg.apache.activemq.ActiveMQConnection;importorg.apache.activemq.ActiveMQConnectionFactory;publicclassReceiver{publicstaticvoidmain(String[] args) {// ConnectionFactory :連接工廠,JMS 用它創(chuàng)建連接ConnectionFactory connectionFactory;// Connection :JMS 客戶端到JMS Provider 的連接Connection connection =null;// Session: 一個發(fā)送或接收消息的線程Session session;// Destination :消息的目的地;消息發(fā)送給誰.Destination destination;// 消費者腿准,消息接收者MessageConsumer consumer; connectionFactory =newActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER, ActiveMQConnection.DEFAULT_PASSWORD,"tcp://localhost:61616");try{// 構造從工廠得到連接對象connection = connectionFactory.createConnection();// 啟動connection.start();// 獲取操作連接session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);// 獲取session注意參數(shù)值xingbo.xu-queue是一個服務器的queue际起,須在在ActiveMq的console配置destination = session.createQueue("FirstQueue"); consumer = session.createConsumer(destination);while(true) {// 設置接收者接收消息的時間,為了便于測試吐葱,這里誰定為100sTextMessage message = (TextMessage) consumer.receive(100000);if(null!= message) { System.out.println("收到消息"+ message.getText()); }else{break; } } }catch(Exception e) { e.printStackTrace(); }finally{try{if(null!= connection) connection.close(); }catch(Throwable ignore) { } } }}
3.3.測試結果
先運行接收者Receiver.java街望,在運行Sender.java。得到結果如下圖:(2個控制臺都會輸出如下圖數(shù)據(jù))
4.使用jfinal-ext中的jms插件操作activeMQ
整合quartz任務調(diào)度框架弟跑,實現(xiàn)每10秒發(fā)送一次消息到隊列灾前。
4.1.核心代碼
public static void main(String[] args) throwsInstantiationException, IllegalAccessException, ClassNotFoundException {JmsPlugin jp = newJmsPlugin("jms.properties");jp.start();PropertyConfig pc = PropertyConfig.me();pc.loadPropertyFile("job.properties");QuartzPlugin qp = new QuartzPlugin();if (pc.getPropertyToBoolean("a.enable")) { qp.add(pc.getProperty("a.cron"), (Job) Class.forName(pc.getProperty("a.job")).newInstance());} qp.start();}
4.2.配置文件jms.properties
################################# server info ################################## jms服務器地址serverUrl=tcp://localhost:61616username=adminpassword=admin################################# queue info ################################## 發(fā)送的隊列名字,用“孟辑,”號分隔sendQueues=firstMQ# 接受的隊列的名字哎甲,用“,”號分隔receiveQueues=firstMQ# 隊列firstMQ上消息名字為a的消息號queue.firstMQ.a=10000#接受到隊列q1上消息名字為a的消息的時候調(diào)用的處理器queue.firstMQ.a.resolver=com.mg.jfinal.ext.demo.resolver.MGResolver
4.3.配置文件job.properties
#JobAa.job=com.mg.jfinal.task.JobAa.cron=*/10 * * * * ?a.enable=true
4.4.運行結果
如圖:
Java高架構師饲嗽、分布式架構烧给、高可擴展、高性能喝噪、高并發(fā)、性能優(yōu)化指么、Spring boot酝惧、Redis、ActiveMQ伯诬、Nginx晚唇、Mycat、Netty盗似、Jvm大型分布式項目實戰(zhàn)學習架構師視頻免費學習加群:835638062 點擊鏈接加入群聊【Java高級架構】:https://jq.qq.com/?_wv=1027&k=5S3kL3v