一、什麼是消息中間件
發送者將消息發送給消息服務器,消息服務器將消息存放在隊列中,在合適的時候再講消息轉發給接受者。
在這種模式下,發送和接收是異步的,發送者無需進行等待,而且二者的生命週期不一定相同,發送消息的時候接收者不一定正在運行,而接收消息的時候發送者也不一定運行,但是消息中間件服務必須運行。如圖:
消費者與消息中間件之間採用長連接方式通訊,在消費者監聽到MQ中有消息存在時可以及時獲取到消息。
二、ActiveMQ介紹
1.1ActiveMQ是個啥?
ActiveMQ是一個消息隊列應用服務器。支持JMS規範。
1.2.ActiveMQ的消息模型
- Point-to-Point (P2P) 點對點消息模式
- Publish/Subscribe(Pub/Sub) 發佈訂閱
1.2.1.點對點
概念:
發送者(producer):發送消息的生產者;
消費者(consumer):接收消息的消費者;
消息隊列(queue):用來存儲發送者發送消息的中間件;
特點:
1.每一個消息都被髮送到一個特定的隊列,接收者從隊列中獲取消息,隊列中保留着消息,直到消息被消費或者超時。
2.每一個消息只能被一個消費者消費,被消費後的消息將會從隊列中移除。
3.發送者和接收者之間在時間上沒有依賴性,即就是當發送者發送消息後,不管接收者是否運行,都不會影響到消息被髮送到隊列
4.接收者在成功接收到消息後需要向隊列應該成功。
點對點模式適合A與B用戶發消息,接收消息後,消息即不存在於隊列。
1.2.2.發佈訂閱
概念:
發佈者(Publisher):發佈消息的生產者;
訂閱者(Subscriber):接收消息的消費者;
主題(topic):用來存儲發佈者發佈的消息;
特點:
1.每一個消息可以有多個消費者。
2.對於某一個主題的訂閱者,他必須創建了一個訂閱之後,才能消費發佈者的消息,而且爲了消費消息,訂閱者需要保持運行狀態,所以發佈者和訂閱者有時間上的依賴性。
三、ActiveMQ的安裝
3.1.Windows下安裝ActiveMQ
1.下載Windows版本的ActiveMQ壓縮包,ActiveMQ官網地址。
2.將下載的安裝包解壓到然後進去bin目錄
3.在bin目錄中根據自己電腦的位數,進入不同文件夾,雙擊 activemq.bat 的批處理文件,運行ActiveMQ。
4.啓動圖如下圖,默認端口爲6161
5.登錄,驗證MQ是否啓動成功,默認賬戶名,密碼都是 admin
四、SpringBoot整合ActiveMQ
4.1.點對點模式下整合
1.引入依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<!-- 管理依賴 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M7</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot整合Web組件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot Activemq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
2.引入application.yml配置
server:
port: 8080
spring:
activemq:
broker-url: tcp://127.0.0.1:61616
user: admin
password: admin
#自定義隊列名稱
queue: gothic-queue
3.創建QueueConfig,注意引包
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
@Component
public class ConfigQueue {
@Value("${queue}")
private String queueName;
//將隊列注入到Springboot容器
@Bean
public Queue queue(){
return new ActiveMQQueue(queueName);
}
}
4.創建生產者
@Component
public class QueueProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
private int count = 1;
//設置五秒鐘往隊列發送一次消息
@Scheduled(fixedDelay = 5000)
public void send() {
String msg = "消息隊列: 第 " + count + " 次發送消息";
//將消息轉化併發送到消息隊列
jmsMessagingTemplate.convertAndSend(queue, msg);
System.out.println("發送到隊列中的消息爲:" + msg);
count++;
}
}
5.創建消費者
@Component
public class QueueConsumer {
@JmsListener(destination = "${queue}")
public void receive(String msg) {
System.out.println("消費者接收到消息爲:" + msg);
}
}
6.啓動服務
@EnableScheduling
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class,args);
}
}
7.控制檯打印結果以及ActiveMQ客戶端查看
在ActiveMQ的管理平臺可以看到生產的消息被消息,當把生產者和消費者部署在不通服務下時,會發現之間互不影響。
4.2.發佈訂閱
4.2.1.創建訂閱者(消費者)
1.引入依賴,依賴於點對點相同
2.引入application.yml配置
server:
port: 8082
spring:
activemq:
broker-url: tcp://127.0.0.1:61616
user: admin
password: admin
#### 開啓發布訂閱
jms:
pub-sub-domain: true
##自定義主題名稱
topic: gothic-topic
3.創建訂閱者
@Component
public class TopicConsumer {
@JmsListener(destination = "${topic}")
public void receiveTopic(String msg) {
System.out.println("消費者消費的消息爲: " + msg);
}
}
4.創建啓動類
@SpringBootApplication
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
}
5.啓動訂閱者
4.2.2.創建發佈者(生產者)
1.引入依賴,依賴於點對點相同
2.引入application.yml配置
server:
port: 8081
spring:
activemq:
broker-url: tcp://127.0.0.1:61616
user: admin
password: admin
##自定義主題名稱
topic: gothic-topic
3.創建TopicConfig
@Component
public class TopicConfig {
//獲取主題名稱
@Value("${topic}")
private String topicName;
//將topic注入到Springboot的容器中
@Bean
private Topic topic(){
return new ActiveMQTopic(topicName);
}
}
4.創建生產者
@Component
public class TopicProducer {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Topic topic;
private int count = 1;
//每五秒發佈一次
@Scheduled(fixedDelay = 5000)
public void sendTopic() {
String msg = "發佈訂閱: 第" + count + "次發佈消息";
jmsMessagingTemplate.convertAndSend(topic, msg);
System.out.println(msg);
count++;
}
}
5.創建生產者的啓動類
@EnableScheduling
@SpringBootApplication
public class ProducerApp {
public static void main(String[] args) {
SpringApplication.run(ProducerApp.class, args);
}
}
6.啓動發佈者
4.2.3.測試查看控制檯
訂閱者控制檯打印
生產者控制檯
至此Springboot集成ActiveMQ完成。