-
首先是配置文件application.yml
spring:
profiles:
active: dev #指定为开发环境
#rabbitmq
rabbitmq:
host: 119.x.x.x
port: 5672
username: guest
password: guest
virtual-host: /
#elasticsearch配置
data:
elasticsearch:
cluster-name: docker-cluster
cluster-nodes: 119.x.x.x:9300
index-name: shard
-
生产者举例
/** * 引入rabbit的操作模板 */ @Autowired private RabbitTemplate rabbitTemplate; rabbitTemplate.convertAndSend(TimeTriggerConfig.DELAYED_EXCHANGE_XDELAY, TimeTriggerConfig.DELAY_ROUTING_KEY_XDELAY, timeTriggerMsg, message -> { Long current = DateUtil.getDateline(); //如果执行的延时任务应该是在现在日期之前执行的,那么补救一下,要求系统一秒钟后执行 if (triggerTime < current) { message.getMessageProperties().setDelay(1000); } else { Long time = (triggerTime - current) * 1000 + 5000 ; message.getMessageProperties().setHeader("x-delay", time); } logger.debug("还有【" + message.getMessageProperties().getExpiration() + "】执行任务"); return message; });
-
消费者举例
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = AmqpExchange.MEMBER_INFO_COMPLETE + "_QUEUE"),
exchange = @Exchange(value = AmqpExchange.MEMBER_INFO_COMPLETE, type = ExchangeTypes.FANOUT)
))
public void memberInfoComplete(Long memberId) {
if (events != null) {
for (MemberInfoCompleteEvent event : events) {
try {
event.memberInfoComplete(memberId);
} catch (Exception e) {
logger.error("会员完善信息出错", e);
}
}
}
}
- 生产者工厂模式
package com.enation.app.javashop.framework.rabbitmq;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionalEventListener;
/**
* 对ApplicationEventPublisher的publishEvent的监听,默认在事务提交后执行
*
* @author fk
* @version v7.2.0
* @since v7.2.0
* 2020-06-15 21:50:52
*/
@Component
public class TransactionalMessageListener {
@Autowired
private AmqpTemplate amqpTemplate;
/**
* 默认在事务提交后执行
* @param message
*/
@TransactionalEventListener(fallbackExecution = true)
public void handleSupplierBillPush(MqMessage message){
this.amqpTemplate.convertAndSend(message.getExchange(), message.getRoutingKey(), message.getMessage());
}
}
package com.enation.app.javashop.framework.rabbitmq;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service;
/**
* mq的publisher
*
* @author fk
* @version v7.2.0
* @since v7.2.0
* 2020-06-15 21:50:52
*/
@Service
public class MessageSenderImpl implements MessageSender {
@Autowired
private ApplicationEventPublisher publisher;
@Override
public void send(MqMessage message) {
publisher.publishEvent(message);
}
}
- 消息对象定义
-
package com.enation.app.javashop.framework.rabbitmq; /** * 发送的消息对象 * * @author fk * @version v7.2.0 * @since v7.2.0 * 2020-06-15 21:50:52 */ public class MqMessage { private String exchange; private String routingKey; private Object message; public MqMessage(String exchange, String routingKey, Object message) { this.exchange = exchange; this.routingKey = routingKey; this.message = message; } public String getExchange() { return exchange; } public void setExchange(String exchange) { this.exchange = exchange; } public String getRoutingKey() { return routingKey; } public void setRoutingKey(String routingKey) { this.routingKey = routingKey; } public Object getMessage() { return message; } public void setMessage(Object message) { this.message = message; } }
pom.xml引入依赖包
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency>