1.需要引入的jar
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>1.5.1.RELEASE</version>
</dependency>
2.属性文件配置
spring:
###rabbitmq
rabbitmq.host: 127.0.0.1
rabbitmq.port: 5672
rabbitmq.username: guest
rabbitmq.password: guest
rabbitmq:
#发送方确认机制
#生产者将信道设置成 confmn 确认)模式,一旦信道进入 confmn 模式,所有在该信道上
#面发布的消息都会被指派 个唯一的 IDC 开始),一旦消息被投递到所有匹配的队列之后,
#RabbitMQ 会发送一个确认 CBasic.Ack) 给生产者(包含消息的唯一 ID) ,这就使得生产
#者知晓消息已经正确到达了目的地了
publisher-confirms: true
#当使用ConvertAndSend的时候不需要设置返回值,convertSendAndReceive才需要
publisher-returns: true
template:
#当mandatory 参数设为 true,交换器无法根据自身的类型和路由键找到一个符合条件
#的队列,那么 RabbitM 会调用 Basic.Return 命令将消息返回给生产者 。当 mandatory
#数设置为 false 时,出现上述情形,则消息直接被丢弃
mandatory: true
3. 定义的常量
/***
* 延迟队列type x-delayed-message
*/
public static final String X_DELAYED_MESSAGE = "x-delayed-message";
/***
* 延迟队列args key = "x-delayed-type"
*/
public static final String DELAY_ARGS_KEY = "x-delayed-type";
/***
* 延迟队列args value = "direct"
*/
public static final String DELAY_ARGS_VALUE = "direct";
/***
*
*/
public static final String DELAY_HEADER_KEY = "x-delay";
/***
* 延迟队列delay_order_status_queue
*/
public static final String DELAY_ORDER_STATUS_QUEUE = "delay_order_status_queue";
/***
* 延迟队列delay_order_status_exchange
*/
public static final String DELAY_ORDER_STATUS_EXCHANGE = "delay_order_status_exchange";
/***
* 延迟队列delay_test_queue
*/
public static final String DELAY_TEST_QUEUE = "delay_test_queue";
/***
* 延迟队列delay_test_exchange
*/
public static final String DELAY_TEST_EXCHANGE = "delay_test_exchange";
/***
* 延迟队列delay_update_user_queue
*/
public static final String DELAY_UPDATE_USER_QUEUE = "delay_update_user_queue";
/***
* 延迟队列delay_update_user_exchange
*/
public static final String DELAY_UPDATE_USER_EXCHANGE = "delay_update_user_exchange";
/***
* DirectConfig
* direct_exchange_a
*/
public static final String DIRECT_EXCHANGE_A = "direct_exchange_a";
/***
* 延迟队列名称 :direct_queue_a
*/
public static final String DIRECT_QUEUE_A = "direct_queue_a";
4.DirectConfig.java
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.shy.springboot.utils.Constant;
/***
* @Title: springstarter
* @author shy
* @Description direct队列
*
*/
@Configuration
public class DirectConfig {
/*********************************
* test_direct_queue
**************************************/
@Bean
public DirectExchange getDirectExchange() {
return new DirectExchange("test_direct_exchange", true, true);
}
@Bean
public Queue testDirectQueue() {
Queue queue = new Queue("test_direct_queue", true);
return queue;
}
@Bean
public Binding testDirectBinding() {
return BindingBuilder.bind(testDirectQueue()).to(getDirectExchange()).with("test_direct_queue");
}
/*********************************
* direct_queue_a
**************************************/
@Bean
public DirectExchange getDirectExchangeA() {
return new DirectExchange(Constant.DIRECT_EXCHANGE_A, true, true);
}
@Bean
public Queue getDirectQueueA() {
return new Queue(Constant.DIRECT_QUEUE_A, true);
}
@Bean
public Binding directBindingA() {
return BindingBuilder.bind(getDirectQueueA()).to(getDirectExchangeA()).with(Constant.DIRECT_QUEUE_A);
}
}
5. 消费
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSONObject;
import com.shy.springboot.utils.Constant;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class ConsumeDirect {
@RabbitListener(queues = "test_direct_queue")
public void processDirectMessage(String message) throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
log.info("消息接受时间》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》:" + sdf.format(new Date()));
log.info("已消费的信息》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》:" + message);
}
@RabbitListener(queues = Constant.DIRECT_QUEUE_A)
public void processDirectAMessage(String message) throws ParseException{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
log.info("消息接受时间》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》:" + sdf.format(new Date()));
}
}
6. 推送消息
@RequestMapping(value = "/direct")
@ResponseBody
public String directSend() {
log.info("请求发起时间 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》 :" + CommonUtils.dateFormat(new Date(), null));
String message = "進入test_direct_queue隊列,message = {direct queue 测试发送}, 即將被消費... ";
rabbitTemplate.convertAndSend("test_direct_exchange", "test_direct_queue", message);
return "success";
}