SpringCloud stream连接RabbitMQ收发信息

1、POM引入spring-cloud-starter-stream-rabbit

<!--消息通道-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    </dependency>

2、application.properties

通用配置:

#rabbit的配置信息
rabbitmq.addresses=amqp://10.18.75.231:5672
rabbitmq.username=user_admin
rabbitmq.password=12345678

当存在多个binder时必须指定一个默认的binder

# 设置一个默认的binder,如果不配置将报错
spring.cloud.stream.defaultBinder=boss

消费者配置:

# 配置ecm消费者的服务器配置信息
spring.cloud.stream.binders.ecm.type=rabbit
spring.cloud.stream.binders.ecm.environment.spring.rabbitmq.addresses=${rabbitmq.addresses}
spring.cloud.stream.binders.ecm.environment.spring.rabbitmq.username=${rabbitmq.username}
spring.cloud.stream.binders.ecm.environment.spring.rabbitmq.password=${rabbitmq.password}
spring.cloud.stream.binders.ecm.environment.spring.rabbitmq.virtual-host=ecm

#交易系统ECM的货柜模板变更消费者
spring.cloud.stream.bindings.ecm_shop_template.binder=ecm
spring.cloud.stream.bindings.ecm_shop_template.destination=这里填exchange的名字
#默认情况下同一个队列的只能被同一个group的消费者消费
spring.cloud.stream.bindings.ecm_shop_template.group=这里是消费者的名称
spring.cloud.stream.bindings.ecm_shop_template.contentType=text/plain
#指定该主题的类型为广播模式
spring.cloud.stream.bindings.ecm_shop_template.consumer.exchangeType=fanout
#消费失败的消息放入dlq队列
spring.cloud.stream.bindings.ecm_shop_template.consumer.autoBindDlq=true
spring.cloud.stream.bindings.ecm_shop_template.consumer.republishToDlq=true

生产者配置:

# BOSS消息生产者服务器配置
spring.cloud.stream.binders.boss.type=rabbit
spring.cloud.stream.binders.boss.environment.spring.rabbitmq.addresses=${rabbitmq.addresses}
spring.cloud.stream.binders.boss.environment.spring.rabbitmq.username=${rabbitmq.username}
spring.cloud.stream.binders.boss.environment.spring.rabbitmq.password=${rabbitmq.password}
spring.cloud.stream.binders.boss.environment.spring.rabbitmq.virtual-host=boss

#BOSS基础信息生产者
spring.cloud.stream.bindings.message_output.destination=exchange的名称
#exchange的类型为广播模式
spring.cloud.stream.rabbit.bindings.message_output.producer.exchangeType=fanout

下面是java代码

1、定义消息的Input和Output配置信息

import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;

/**
 * mq连接源定义
 * 
 * 其中类中的2个属性的值和properties里的配置需要一致
 **/
public interface MqMessageSource {
    // BOSS生产者
    String MESSAGE_OUTPUT = "message_output";
    // ECM消费者
    String ECM_SHOP_TEMPLATE_INPUT = "ecm_shop_template";

    @Output(MESSAGE_OUTPUT)
    MessageChannel messageOutput();

    @Input(ECM_SHOP_TEMPLATE_INPUT)
    MessageChannel messageInput();

}

2、消息消费

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.messaging.Message;

import com.alibaba.fastjson.JSONObject;

import lombok.extern.slf4j.Slf4j;

/**
 * MQ消费者
 * @author yangzhilong
 *
 */
@Slf4j
@EnableBinding(MqMessageSource.class)
public class MqMessageConsumer {

    @Autowired
    private XXService xxService;

    /**
     * 消费ECM的货柜模板变更
     * @param message
     */
    @StreamListener(MqMessageSource.ECM_SHOP_TEMPLATE_INPUT)
    public void receive(Message<String> message) {
        log.info("接收货柜模板开始,参数={}", JSONObject.toJSONString(message));
        if (null == message) {
            return;
        }
        try {
            String payload = message.getPayload();
            log.info("具体消息内容= {}", JSONObject.toJSONString(payload));
            JSONObject jsonObject = JSONObject.parseObject(payload);
            ShopReqDto shopReqDto = new ShopReqDto();
            shopReqDto.setCode(jsonObject.getString("shopNo"));
            shopReqDto.setGoodsMarketTemplateId(jsonObject.getLong("goodsMarketTemplateId"));
            shopReqDto.setGoodsMarketTemplateName(jsonObject.getString("goodsMarketTemplateName"));
            ResponseResult<String> responseResult = xxService.updateTemplateIdAndName(shopReqDto);
            if(responseResult.isSuccess()){
                log.info("【MQ消费货柜模板更新信息成功】");
            }else{
                log.error("【MQ消费货柜模板更新信息失败】,返回结果信息:" + JSONObject.toJSONString(responseResult));
            }
        } catch (Exception e) {
            log.error("接收处理货柜模板MQ时出现异常:{}", e);
            throw new RuntimeException(e);
        }
    }
}

3、消息生产者代码

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

/**
 * 消息生产者
 *
 **/
@EnableBinding(MqMessageSource.class)
@Slf4j
public class MqMessageProducer {
    @Autowired
    @Output(MqMessageSource.MESSAGE_OUTPUT)
    private MessageChannel channel;


    //品牌
    public void sendBrandAdd(Brand brand) {
        BossMessage<Brand> message = new BossMessage<>();
        message.setData(brand);
        message.setOpType(MqMessageProducer.ADD);
        message.setDataType(MqMessageProducer.BRAND);
        channel.send(MessageBuilder.withPayload(JSON.toJSONString(message)).build());
        log.info("【MQ发送内容】" + JSON.toJSONString(message));
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34288630/article/details/79557245