一.ActiveMQ的簡介
Activemq : 是一個實現了JMS的消息中間間。該中間可跨平臺,java ,c++ python ,.net都能使用,最近流行websocket ,mqtt 也能實現,但是activemq 是java寫的,實現jms的規範寫的!
特點:
1、支持多種語言編寫客戶端
2、對spring的支持,很容易和spring整合
3、支持多種傳輸協議:TCP,SSL,NIO,UDP等
4、支持AJAX
消息形式:
1、點對點(queue)
2、一對多(topic
二.MQ的原理
三.MQ的作用
1.異步操作
2.流量削峯
在淘寶雙11的時候,晚上0點的時候會有大量的訂單產生,可能會導致服務器崩潰,我們可以使用ActiveMQ使訪問的流量均勻,以恆定的速率
3.解耦合
用戶下單成功後,不需要(order-service)依賴(message-api)發起遠程調用才能發送,只需要依賴mq就可以了
4.軟總線
本質就是遠程調用-》進程間的通信-》實現進程的內存共享
使用mq做軟總線:
1.所有的內核都必須連接在一個mq上面
2.每個內核都能向mq裏面發信息,
3.每個內核都能向mq裏面讀取信息。
四.ActiveMQ的安裝
1.把ActiveMQ的壓縮包上傳到Linux系統
2.解壓
3在bin目錄下啓動
4.頁面
5.創建隊列
6.創建主題
五.java操作ActiveMQ
1.導入依賴
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
2.接收隊列的消息
public class MQApp {
public static void main(String[] args) {
listener();
//sendQueueMsg();
}
public static void listener() {
String brokerURL = "tcp://120.27.247.208:61616";
// 1 連接工廠
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(brokerURL);
// 2 連接
try {
Connection connection = activeMQConnectionFactory.createConnection("admin", "admin");
connection.start(); // 在監聽消息時,需要手動的啓動
// 3 會話
/**
* transacted : 是否支持事務
* acknowledgeMode:簽收模式,僅僅在事務爲false 才起作用,若是true,他沒有作用
* 3 種簽收模式
* 1 AUTO_ACK(Session.AUTO_ACKNOWLEDGE) 只要客戶端拿到消息,就代表它消費成功了,mq 服務器也會刪除該消息
* 2 CLIENT_ACK(Session.CLIENT_ACKNOWLEDGE)客戶端要拿到消息,而且必須手動確認,該消費消費成功了,mq 服務器纔會刪除它
* 3 DUPS_ACK(批量的隨機簽收)和發送順序相關,當消息的數量達到一次次數後,進行一個簽收
*
*/
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
// 5 消息發送的目的地(隊列)
Destination destination = new ActiveMQQueue("sxt.queue");
// 6 消息的消費者
MessageConsumer messageConsumer = session.createConsumer(destination);
System.out.println("開始監聽");
messageConsumer.setMessageListener(new MessageListener() { // 新啓動子線程
@Override
public void onMessage(Message message) {
System.out.println("收到消息了");
ActiveMQTextMessage textMsg = (ActiveMQTextMessage) (message);
try {
String text = textMsg.getText(); // 獲取消息的內容
System.out.println("消息爲:"+text);
message.acknowledge(); // 手動簽收消息
session.commit(); // 消息被消費了,也要提交事務
} catch (JMSException e) {
e.printStackTrace();
}
}
});
System.in.read(); // 掛起主線程
} catch (Exception e) {
e.printStackTrace();
}finally {
// 關閉資源
}
}
然後在運行queue 的接收端,可以看到消息已經發出了:
2.向隊列裏面發送消息
在運行queue 的接收端,可以看到消息已經發出了:
6.ActiveMQ實際上的使用(整合spring)
Spring-context
ActiveMq
Spring-Jms 在spring 裏面簡化對activemq的操作
Spring-Jms 對activemq 的java的做了封裝,以後操作activemq ,將非常簡單
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.activemq/activemq-all -->
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.9</version>
</dependency>
1.消息的發送 spring-jms-producer.xml
2.spring-jms-comsumer.xml
發送消息
public class ActiveMQApp {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-jms-comsumer.xml");
JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
//jmsTemplate.send(destination, messageCreator);
jmsTemplate.convertAndSend("boot");
System.out.println("發送成功了");
////////////////////監聽消息////////////////////
try {
System.out.println("開始監聽");
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
監聽器
一個簡單的ActiveMQ就實現了 如果想要複雜使用的話,關於JMS中的生產者和消費者參數可以詳細瞭解一下,比如能配置隊列消息存活時間,消費優先級,消費模式。