前端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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM