Springboot整合rabbitmq

1、依赖及配置文件

依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

配置文件

# mq配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin

#交换机定义(交换机解析:[岸桥].[作业].[交换机].[交换机类型)   直连交换机
rabbit.exchange=A.Work.Exchange.Direct
#交换机定义(交换机解析:[岸桥].[作业].[交换机].[交换机类型].[后台服务广播到WEB])  广播交换机
rabbit.exchange.serviceToWeb=A.Work.Exchange.Fanout.ServiceToWeb

# 队列定义(队列解析:[系统].[发起对象].[数据类型].[数据场地])
#[前端采集程序发给数据服务的作业数据队列名,发送端为采集程序,消费者为数据服务]        作业队列
rabbit.queue.workData=A.Collect.WorkData.NICT
#[前端采集程序发给数据服务的车号预识别数据队列名,发送端为采集程序,消费者为数据服务]   车号预识别队列
rabbit.queue.plateData=A.Collect.PlateData.NICT
#[前端采集程序发给数据服务的设备维护数据队列名,发送端为采集程序,消费者为数据服务]     设备监控队列
rabbit.queue.equipmentData=A.Collect.EquipmentData.NICT

2、声明交换机和队列并进行绑定


import net.pingfang.jiaxing.config.Config;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * @title: rabbitMQ配置类 
 * @package com.rabbit.producer.util 
 * @description: TODO
 * @author: lzl
 * @date: 2020年9月2日 下午2:31:42 
 * @version: 1.0  
 */

@Configuration
public class RabbitMQConfig {
	
	//此配置文件请自己书写
	@Resource
	private Config config;
	
    //配置一个Direct类型交换机  直连
	@Bean
	public DirectExchange directExchange() {
		return new DirectExchange(config.getDirectExchange());
	}

	//配置一个Fanout类型交换机  广播
	@Bean
	public FanoutExchange fanoutExchange() {
		return new FanoutExchange(config.getServiceToWebFanoutExchange());
	}
	
	//设置一个队列,作业报文
	@Bean
	public Queue workDataQueue() {
		return new Queue(config.getWorkDataQueue());
	}
	
	//设置一个队列,硬件装备报文。
	@Bean
	public Queue equipmentDataQueue() {
		return new Queue(config.getEquipmentDataQueue());
	}

	//车号预识别队列
	@Bean
	public Queue plateDataQueue() {
		return new Queue(config.getPlateDataQueue());
	}

	//广播测试队列  测试用1
	@Bean
	public Queue fanoutToWebTestQueue1() {
		return new Queue("fanoutToWebTestQueue1");
	}
	//广播测试队列  测试用2
	@Bean
	public Queue fanoutToWebTestQueue2() {
		return new Queue("fanoutToWebTestQueue2");
	}


	/**
	 * 配置一个队列和交换机绑定
	 * directQueue 需要绑定队列的对象,参数名必须和某个@Bean的方法名完全相同,这样就会自动进行注入
	 * directExchange  需要绑定交换机的对象,参数名必须和某个@Bean的方法名完全相同,这样就会自动进行注入
	 */
	@Bean
	public Binding workDataQueueBind(Queue workDataQueue,DirectExchange directExchange) {
		return BindingBuilder.bind(workDataQueue).to(directExchange).with(config.getWorkDataQueue());
	}
	
	@Bean
	public Binding equipmentDataQueueBind(Queue equipmentDataQueue,DirectExchange directExchange) {
		return BindingBuilder.bind(equipmentDataQueue).to(directExchange).with(config.getEquipmentDataQueue());
	}

	@Bean
	public Binding plateDataQueueBind(Queue plateDataQueue,DirectExchange directExchange) {
		return BindingBuilder.bind(plateDataQueue).to(directExchange).with(config.getPlateDataQueue());
	}


	//广播测试1
	@Bean
	public Binding fanoutToWebTestQueue1Bind(Queue fanoutToWebTestQueue1,FanoutExchange fanoutExchange) {
		return BindingBuilder.bind(fanoutToWebTestQueue1).to(fanoutExchange);
	}

	//广播测试2
	@Bean
	public Binding fanoutToWebTestQueue2Bind(Queue fanoutToWebTestQueue2,FanoutExchange fanoutExchange) {
		return BindingBuilder.bind(fanoutToWebTestQueue2).to(fanoutExchange);
	}
}

3、消息生产和消费

生产者服务


import lombok.extern.slf4j.Slf4j;
import net.pingfang.jiaxing.config.Config;
import org.json.JSONObject;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @Author zengqifeng
 * @CreateTime 2021/7/1 17:54
 * @Description
 */
@Slf4j
@Component
public class MqSendService {

    @Resource
    private AmqpTemplate amqpTemplate;

    @Resource
    private Config config;

    /**
     * 此处message必须是json格式的字符串  否则广播失败 {  }
     * 向web前端广播
     * @param msgType
     * @param message
     */
    public void sendFanoutMessageToWeb(String msgType, String message) {
        try {
            JSONObject messageJson = new JSONObject(message);
            messageJson.put("msgType", msgType);
            Message tempMessage = new Message(messageJson.toString().getBytes(),new MessageProperties());
            amqpTemplate.convertAndSend(config.getServiceToWebFanoutExchange(),"fanout", tempMessage);
            log.info("广播成功!");
        } catch (Exception e) {
            log.info("广播失败:"+e.getMessage());
        }

    }

    public void sendDirectMessage(String message,String routingKey) {
        //amqpTemplate.convertAndSend(config.getDirectExchangeName(), routingKey, message);
    }

}

消费者服务


import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import net.pingfang.jiaxing.constants.MessageTypeEnum;
import net.pingfang.jiaxing.entity.equipment.EmCrane;
import net.pingfang.jiaxing.entity.licensePlate.LicensePlateJson;
import net.pingfang.jiaxing.entity.work.WorkJson;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 *
 * mq消息消费服务
 *
 * @Author zengqifeng
 * @CreateTime 2021/7/1 15:34
 * @Description
 */
@Slf4j
@Component
public class MqReceiveService {

    @Resource
    private MessageService messageService;


    /**
     * 作业队列消息监听(03作业识别报文  02作业结束报文)
     */
    @RabbitListener(queues = "${rabbit.queue.workData}")
    @RabbitHandler
    private void message03or02Handler(byte[] data) {
        String message = new String(data);
        WorkJson workJson = JSON.parseObject(message, WorkJson.class);
        String message_type = workJson.getMessage_type();

        if (MessageTypeEnum.MESSAGE_TYPE_02.getCode().equals(message_type)) {
            log.info("mq监听到02号报文,报文内容 = {}", message);
            messageService.messageHandler02(workJson);
        }else if (MessageTypeEnum.MESSAGE_TYPE_03.getCode().equals(message_type)) {
            //如果是03号报文 转成对象处理
            log.info("mq监听到03号报文,报文内容 = {}", message);
            messageService.messageHandler03(workJson);
        }

    }

    /**
     * 设备监控报文(06号设备监控报文)
     */
    @RabbitListener(queues = "${rabbit.queue.equipmentData}")
    @RabbitHandler
    private void message06Handler(byte[] data) {
        String message = new String(data);
        log.info("mq监听到06号报文,报文内容 = {}", message);
        EmCrane emCrane = JSON.parseObject(message, EmCrane.class);
        messageService.messageHandler06(emCrane);
    }

    /**
     * 车号预识别消息监听(16号车号预识别报文)
     */
    @RabbitListener(queues = "${rabbit.queue.plateData}")
    @RabbitHandler
    private void message16Handler(byte[] data) {
        String message = new String(data);
        log.info("mq监听到16号报文,报文内容 = {}", message);
        LicensePlateJson licensePlateJson = JSON.parseObject(message, LicensePlateJson.class);
        messageService.messageHandler16(licensePlateJson);
    }


    /**
     * 广播  测试
     */
    @RabbitListener(queues = "fanoutToWebTestQueue1")
    @RabbitHandler
    private void fanoutToWebTestQueue1(byte[] data) {
        String message = new String(data);
        log.info("监听到队列1广播的消息,报文内容 = {}", message);
    }

    /**
     * 广播  测试
     */
    @RabbitListener(queues = "fanoutToWebTestQueue2")
    @RabbitHandler
    private void fanoutToWebTestQueue2(byte[] data) {
        String message = new String(data);
        log.info("监听到队列2广播的消息,报文内容 = {}", message);
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值