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));
}
}