ActiveMQ基本介紹以及Springboot整合ActiveMQ

一、什麼是消息中間件

發送者將消息發送給消息服務器,消息服務器將消息存放在隊列中,在合適的時候再講消息轉發給接受者。

在這種模式下,發送和接收是異步的,發送者無需進行等待,而且二者的生命週期不一定相同,發送消息的時候接收者不一定正在運行,而接收消息的時候發送者也不一定運行,但是消息中間件服務必須運行。如圖:

消費者與消息中間件之間採用長連接方式通訊,在消費者監聽到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完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章