一、创建生产者
1、创建springboot项目引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、properties中配置rabbitmq
#rabbitmq 地址
spring.rabbitmq.addresses=39.105.104.195:5677
#rabbitmq 用户名
spring.rabbitmq.username=guest
#rabbitmq 密码
spring.rabbitmq.password=guest
#指定rabbitmq虚拟主机 默认是/
spring.rabbitmq.virtual-host=/
#rabbitmq 连接超时时间
spring.rabbitmq.connection-timeout=15000
#rabbitmq 消息发送到交换机确认机制,ack
spring.rabbitmq.publisher-confirms=true
#rabbitmq 是否确认回调
spring.rabbitmq.publisher-returns=true
# true 监听器接收不可达消息进行处理,false broker自动删除消息 默认为false
spring.rabbitmq.template.mandatory=true
3、创建rabbitmq类配置 确认和回调
/**
* @author kang
* @version 1.0
* @date 2020/3/30 16:31
*/
@Component
@Slf4j
public class RabbitSender {
@Autowired
private RabbitTemplate rabbitTemplate;
private final ConfirmCallback confirmCallback = (correlationData, ack, s) -> {
log.info("correlationData={}",correlationData);
log.info("ack={}",ack);
if (ack){
log.info("更新订单状态");
}else {
log.error("处理异常:{}",s);
}
};
private final RabbitTemplate.ReturnCallback callback = (message, errorCode, text, exchange, routingKey)
-> {
log.error("return exchange :{},routingKey:{},message:{},code:{},text:{}"
,exchange,routingKey,message,errorCode,text);
log.info("找不到对应的队列");
};
public void sendOrder(OrderMessageDto message ) throws Exception{
rabbitTemplate.setConfirmCallback(confirmCallback);
rabbitTemplate.setReturnCallback(callback);
CorrelationData correlationData = new CorrelationData("test-hello"+ LocalDateTime.now().toString());
rabbitTemplate.convertAndSend("order-exchange","order2.test",message,correlationData);
}
}
创建发送的消息对象
/**
* @author kang
* @version 1.0
* @date 2020/4/1 9:17
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OrderMessageDto implements Serializable {
private Long orderNumber;
private String orderName;
private Double price;
private LocalDateTime time;
}
测试投递
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootProducerApplicationTests {
@Autowired
private RabbitSender sender;
@Test
public void testSender2() throws Exception {
OrderMessageDto dto = new OrderMessageDto(1l,"测试订单",250.0,LocalDateTime.now());
sender.sendOrder(dto);
Thread.sleep(2000);
}
}
标题 二、创建消费者
1、创建springboot项目引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.kang</groupId>
<artifactId>springboot-producer</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
2、配置properties
#########################################################
#rabbitMQ
#########################################################
spring.rabbitmq.addresses=39.105.104.195:5677
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000
spring.rabbitmq.listener.simple.concurrency=5
spring.rabbitmq.listener.simple.max-concurrency=10
#手动签收
spring.rabbitmq.listener.simple.acknowledge-mode=manual
spring.rabbitmq.listener.simple.prefetch=1
spring.rabbitmq.listener.order.queue.name=order-queue
spring.rabbitmq.listener.order.queue.durable=true
spring.rabbitmq.listener.order.exchange.name=order-exchange
spring.rabbitmq.listener.order.exchange.type=topic
spring.rabbitmq.listener.order.exchange.durable=true
spring.rabbitmq.listener.order.exchange.ignoreDeclarationExceptions=true
spring.rabbitmq.listener.order.key=order2.*
3、创建配置类
/**
* @author kang
* @version 1.0
* @date 2020/3/31 10:22
*/
@Component
@Slf4j
public class RabbitReceiver {
/**
* 声明topic类型交换机和队列
* @param messageDto
* @param headers
* @param channel
* @throws Exception
*/
@RabbitHandler
@RabbitListener(
bindings = @QueueBinding(
//声明队列
value = @Queue(
value = "${spring.rabbitmq.listener.order.queue.name}",
durable = "${spring.rabbitmq.listener.order.queue.durable}"
),
//声明交换机
exchange = @Exchange(
value = "${spring.rabbitmq.listener.order.exchange.name}" ,
type = "${spring.rabbitmq.listener.order.exchange.type}" ,
durable = "${spring.rabbitmq.listener.order.exchange.durable}" ,
ignoreDeclarationExceptions = "${spring.rabbitmq.listener.order.exchange.ignoreDeclarationExceptions}"),
//声明路由键
key = "${spring.rabbitmq.listener.order.key}"
)
)
public void onOrderMessage(@Payload OrderMessageDto messageDto, @Headers Map<String,Object> headers, Channel channel) throws Exception{
log.info("message : {}",messageDto.toString());
Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);
if(messageDto.getOrderNumber().equals("")){
/**
* multiple 是否批量处理
* requeue 是否重回队列
* 将消息重新投递回broker中队列的尾端( 重回队列)
*/
channel.basicNack(deliveryTag,false,true);
}else{
//手工ack 确认签收
channel.basicAck(deliveryTag,false);
}
}
}
@Header 注入消息头的单个属性
@Payload 注入消息体到一个JavaBean中
@Headers 注入所有消息头到一个Map中
@RabbitListener 注解标记方法,当监听到队列中有消息时则会进行接收并处理
@RabbitListener注解指定目标方法来作为消费消息的方法,通过注解参数指定所监听的队列或者Binding。
4、启动消费者消费生产者发送的消息
打开控制台查看队列
消费前:
消费后: