前端vue监听activeMQ消息后端推送消息--实战

需求 : 工厂员工完成某道工序后,需要将消息推送给 检查人员

也可以使用 WebSockets ,前端更容易实现

思路: 使用activeMQ推送消息,前端实时接收消息

实现 :

  1.基于springBoot的activeMQ 实现起来比较方便 配置文件如下

############ activemq
spring.activemq.broker-url=tcp://127.0.0.1:61616
# 账号
spring.activemq.user=xxx
# 密码
spring.activemq.password=xxx
# 等待消息发送响应的时间。设置为0等待永远。
spring.activemq.send-timeout=0

queueName=polling.queue
topicName=polling.topic
# 默认情况下activemq提供的是queue模式,若要使用topic模式需要配置下面配置
spring.jms.pub-sub-domain=true

  2.java代码 配置文件

package workstation.open.config;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.config.SimpleJmsListenerContainerFactory;
import org.springframework.jms.core.JmsMessagingTemplate;

import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Topic;

/**
 * @author ThreeNut
 * @date 2021/5/18 13:55
 */
@Configuration
public class ActiveMQConfig {
    @Value("${queueName}")
    private String queueName;

    @Value("${topicName}")
    private String topicName;

    @Value("${spring.activemq.user}")
    private String usrName;

    @Value("${spring.activemq.password}")
    private  String password;

    @Value("${spring.activemq.broker-url}")
    private  String brokerUrl;

    @Bean
    public Queue queue(){
        return new ActiveMQQueue(queueName);
    }

    @Bean
    public Topic topic(){
        return new ActiveMQTopic(topicName);
    }

    @Bean
    public ActiveMQConnectionFactory connectionFactory() {
        return new ActiveMQConnectionFactory(usrName, password, brokerUrl);
    }

    @Bean
    public JmsMessagingTemplate jmsMessageTemplate(){
        return new JmsMessagingTemplate(connectionFactory());
    }

    // 在Queue模式中,对消息的监听需要对containerFactory进行配置
    @Bean("queueListener")
    public JmsListenerContainerFactory<?> queueJmsListenerContainerFactory(ConnectionFactory connectionFactory){
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(false);
        return factory;
    }

    //在Topic模式中,对消息的监听需要对containerFactory进行配置
    @Bean("topicListener")
    public JmsListenerContainerFactory<?> topicJmsListenerContainerFactory(ConnectionFactory connectionFactory){
        SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(true);
        return factory;
    }
}
View Code

  3.java代码 消息推送  消息生产者

       3.1 Queue(点到点)模式在点对点的传输方式中,消息数据被持久化,每条消息都能被消费,没有监听QUEUE地址也能被消费,数据不会丢失,一对一的发布接受策略,保证数据完整。

  3.2Topic主题模式,就是订阅模式,不保证消息都能被接收到   发送方式 :群发

package workstation.open.mq;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;

import javax.jms.Destination;
import javax.jms.Topic;

/**
 * 消息生产
 * @author BinPeng
 * @date 2021/5/18 13:47
 */
@Component
public class PollingQueueProducer {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    /**
     *  群发消息
     */
    @Autowired
    private Topic topic;

    public String sendQueue(String msg) {
        this.sendMessage(this.topic,msg);
        System.out.println("发送消息成功!!!");
        return "success";
    }

    private void sendMessage(Destination destination,String msg){
        jmsMessagingTemplate.convertAndSend(destination, msg);
    }

}

  4.后端测试(仅用来在后端测试,看是否接收到消息)

package workstation.open.mq;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import workstation.common.util.ReqResult;

import javax.servlet.http.Cookie;
import java.util.LinkedList;
import java.util.Queue;

@Component
public class QueueConsumer {
/**
     * queue模式的消费者
     * @param message 消息
     */


    @JmsListener(destination="${topicName}", containerFactory="topicListener")
    public ReqResult readActiveQueue(String message) {
        Queue<String> queue = new LinkedList<String>();
        queue.offer(message);
        System.out.println(message +"----------------------------------");
        return new ReqResult().put("msg",queue);
    }
}

  5.基于前端VUE使用Stompjs接收ActiveMQ消息实现方法  -- 消息消费者

  准备工作:

     npm install stompjs

    npm install net

 

  5.1 linkparam.js 配置文件

export const MQ_SERVICE = 'ws://127.0.0.1:61614/stomp' // mq服务地址(默认监听消息端口)
export const MQ_USERNAME = 'xxx' // mq连接用户名
export const MQ_PASSWORD = 'xxx' //mq连接密码

  5.2 sock.vue

 

<template>
  <div></div>
</template>

<script>
import Stomp from 'stompjs'
import { MQ_SERVICE, MQ_USERNAME, MQ_PASSWORD } from '../../utils/linkparam'
export default {
  name: 'entry',
  data () {
    return {
      client: Stomp.client(MQ_SERVICE),
      topic : '/topic/iqc_check_list'
    }
  },
  created () {
    this.connect()
  },

  methods: {
    onConnected: function (frame) {
      console.log('Connected: ---------' + frame.body)
      // 主题模式
      this.client.subscribe(this.topic, this.responseCallback, { id: 20210820 })
    },
    onFailed: function (frame) {

    },
    responseCallback: function (frame) {
      if(frame.body != null){
        this.$notify.info({
          showClose: true,
          message: '有新的检验单  ' + frame.body,
          position: 'bottom-right',
          duration: '3000',
          onClose: () => {
            // 执行查询方法
            this.$parent.query()
          },
        });
      }
    },

    connect: function () {
      let headers = {
        'login': MQ_USERNAME,
        'passcode': MQ_PASSWORD
      }
      // 心跳发送频率
      this.client.heartbeat.outgoing = 50000;
      // 心跳接收频率
      this.client.heartbeat.incoming = 50000;
      this.client.connect(headers, this.onConnected, this.onFailed)
    }
  }
}
</script>

 

 

 

  5.3 在APP.vue 文件下添加(因为要在此页面展示所以添加如下,展示页面按照你自己的实际情况配置即可)

import sock from './components/sock'

 

 

 components:{

  sock
}

至此前后端配置结束
总结: 需注意 如果监听的是远程服务 需要配置为外网ip地址,端口 61614和61616加入安全组. 监听端口为: 61614
         activeMQ 客户端地址:http://localhost:8161/admin/topics.jsp

posted @ 2021-05-27 14:24  三只坚果  阅读(3545)  评论(0编辑  收藏  举报