Springboot整合activemq

今天呢心血來潮,也有不少之前的學弟問到我關於消息隊列的一些問題,有個剛入門,有的有問題都來問我,那麼今天來講說如何快速入門mq。html

1、首先說下什麼是消息隊列?前端

1.消息隊列是在消息的傳輸過程當中保存消息的容器。java

2、爲何要用到消息隊列?mysql

主要緣由是因爲在高併發環境下,因爲來不及同步處理,請求每每會發生堵塞,好比說,大量的insert,update之類的請求同時到達MySQL,直接致使無數的行鎖表鎖,甚至最後請求會堆積過多,從而觸發too many connections錯誤。經過使用消息隊列,咱們能夠異步處理請求,從而緩解系統的壓力。web

3、消息隊列都分爲哪幾種?spring

1. ActiveMQ/ApolloMQ
  優勢:老牌的消息隊列,使用Java語言編寫。對JMS支持最好,採用多線程併發,資源消耗比較大。若是你的主語言是Java,能夠重點考慮。
  缺點:因爲歷史悠久,歷史包袱較多,版本更新很緩慢。集羣模式須要依賴Zookeeper實現。最新架構的產品被命名爲Apollo,號稱下一代ActiveMQ,目前案例較少。sql

2. RocketMQ/Kafkaapache

  優勢:專爲海量消息傳遞打造,主張使用拉模式,自然的集羣、HA、負載均衡支持。話說仍是那句話,適合不適合看你有沒有那麼大的量。
  缺點:所謂魚和熊掌不可兼得,放棄了一些消息中間件的靈活性,使用的場景較窄,需關注你的業務模式是否契合,不然山寨變相使用很彆扭。除此以外,RocketMQ沒有.NET下的客戶端可用。RocketMQ身出名門,但使用者很少,生態較小,畢竟消息量能達到這種體量的公司很少,你也能夠直接去購買阿里雲的消息服務。Kafka生態完善,其代碼是用Scala語言寫成,可靠性比RocketMQ低一些。windows

3. RabbitMQ
  優勢:生態豐富,使用者衆,有不少人在前面踩坑。AMQP協議的領導實現,支持多種場景。淘寶的MySQL集羣內部有使用它進行通信,OpenStack開源雲平臺的通訊組件,最早在金融行業獲得運用。
  缺點:Erlang代碼你Hold得住不? 雖然Erlang是自然集羣化的,但RabbitMQ在高可用方面作起來還不是特別駕輕就熟,別相信廣告。

springboot

4、咱們今天重要說下如何快速上手activemq,也是在mq中最容易上手的一種

1.首先咱們先下載activemq  連接 http://activemq.apache.org/download.html

2.

3.下載對應的版本

4.啓動activemq(我這裏是mac環境,windows可雙擊運行)

出現這個說明mq已經啓動我可能夠經過active默認的端口號運行https://http://localhost:8161/

這裏看到他會alert一個登錄窗口 默認帳號密碼都爲admin

點擊Queues查看隊列是的消息,這樣咱們activemq就算運行了

那麼如今我將它整合在springboot裏,也十分簡單 首先看下項目結構

5.加入依賴 本次用的gradle

 compile('org.springframework.boot:spring-boot-starter-activemq:2.1.1.RELEASE')

6.yml配置

spring:
  activemq:
    broker-url: tcp://localhost:61616
    user: admin
    password: admin

這裏注意了配置的端口號和啓動端口號不是一直的,默認爲61616,在conf的jetty.xml下課進行查看也能夠修改

我們直接上代碼

7.Controller

package com.gd.acticemqtest.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

/**
 * @DATA 2019-01-09 22:42
 * @Author 張國偉  WeChat:17630376104
 * @Description TODO
 */
@RestController
public class controllerDemo {

    @Autowired
    private JmsTemplate jmsTemplate;

    @RequestMapping("/sendMsg")
    public void sendMsg(String msg) {
        jmsTemplate.send("q2", new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {

                TextMessage textMessage = session.createTextMessage();
                textMessage.setText(msg);
                return textMessage;
            }
        });
    }
這裏必定要注意的是JmsTemplate到底引用的那個包
jmsTemplate.send是向隊列裏發送消息,而且爲隊列起一個名字
package com.gd.acticemqtest.serive;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Service;

/**
 * @DATA 2019-01-09 22:54
 * @Author 張國偉  WeChat:17630376104
 * @Description TODO
 */
@Service
public class ActiveMsgListener {

   @JmsListener(destination = "q2")
    public void rctiveMsg(String message){
    System.out.println("------監聽到activemq的數據"+message);
    }

}

jmsListener是spring的針對消息的監聽器,當mq裏有數據後第一時間把消息監聽到,咱們跑一把試試

當敲下enter那一刻,控制檯已經把剛剛存進去的消息給打印了出來

那這個時候咱們再來看下activemq的服務中是否有消息

 能夠看到這時候隊列裏已經有了q2這個消息。隨後會出如何在前端接受消息,運用到websocket 再見!!
相關文章
相關標籤/搜索