安装rabbitmq_delayed_message_exchange插件
插件下载地址:http://www.rabbitmq.com/community-plugins.html
下载完插件后,将其放置到RabbitMQ安装目录下的 plugins 目录下,并使用如下命令启动这个插件:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
systemctl restart rabbitmq-server
上代码:
package com.study.soufang.rabbit.a003.springboot.rabbitmq;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ConfirmCallback;
import org.springframework.amqp.rabbit.support.CorrelationData;
public class MyConfirmCallback implements ConfirmCallback {
@Override
public void confirm(CorrelationData correlationData, boolean ack, String cause) {
// TODO Auto-generated method stub
System.out.println("correlationData:"+correlationData+",ACK:"+ack+",Cause:"+cause);
}
}
--------------------------------------------------------------------------------------------------------------------------------------------
package com.study.soufang.rabbit.a003.springboot.rabbitmq;
import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.boot.autoconfigure.amqp.RabbitProperties;
import org.springframework.boot.autoconfigure.amqp.SimpleRabbitListenerContainerFactoryConfigurer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyRabbitConfiguration {
private RabbitProperties properties;
MessageConverter messageConverter = new Jackson2JsonMessageConverter();
@Bean
@ConditionalOnMissingBean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
PropertyMapper map = PropertyMapper.get();
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setConfirmCallback(new MyConfirmCallback());
template.setReturnCallback(new MyReturnCallback());
template.setMessageConverter(messageConverter);
//mandatory 默认为FALSE,如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,会直接将消息扔掉
template.setMandatory(true);
return template;
}
@Bean(name = "rabbitListenerContainerFactory")
@ConditionalOnMissingBean(name = "rabbitListenerContainerFactory")
@ConditionalOnProperty(prefix = "spring.rabbitmq.listener", name = "type", havingValue = "simple", matchIfMissing = true)
public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
factory.setMessageConverter(messageConverter);
return factory;
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------
package com.study.soufang.rabbit.a003.springboot.rabbitmq;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate.ReturnCallback;
public class MyReturnCallback implements ReturnCallback {
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
System.out.println("Message : "+ message);
System.out.println("replyCode : "+ replyCode);
System.out.println("replyText : "+ replyText);
System.out.println("exchange : "+ exchange);
System.out.println("routingKey : "+ routingKey);
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
package com.study.soufang.rabbit.a003.springboot.rabbitmq;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Exchange;
import org.springframework.amqp.core.ExchangeBuilder;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyRabbitDeclareConfiguration {
public static final String EXCHANGE_NAME_TEST = "order";
public static final String QUEUE_NAME_TEST = "springboot.rabbit.test.exchange.queue";
public static final String EXCHANGE_ROUTINGKEY_TOPIC = "test.*";
@Autowired
AmqpAdmin amqpAdmin;
@Bean
public Exchange testExchange(){
//注意delayed(),设置延时
return ExchangeBuilder.topicExchange(EXCHANGE_NAME_TEST).delayed().build();
}
@Bean
public Queue testExchangeQueue(){
Queue queue = new Queue(QUEUE_NAME_TEST);
amqpAdmin.declareQueue(queue);
return queue;
}
@Bean
public Binding bind1(){
return BindingBuilder.bind(testExchangeQueue()).to(testExchange()).with(EXCHANGE_ROUTINGKEY_TOPIC).noargs();
}
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
package com.study.soufang.rabbit.a003.springboot.rabbitmq.topic;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import com.study.soufang.rabbit.a003.springboot.rabbitmq.MyRabbitDeclareConfiguration;
import com.study.soufang.rabbit.a003.springboot.rabbitmq.User;
@Component
public class TestRecvTopic {
@RabbitListener(queues=MyRabbitDeclareConfiguration.QUEUE_NAME_TEST)
public void process(User user){
System.out.println("receive from top exchange : "+user);
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
package com.study.soufang.rabbit.a003.springboot.rabbitmq.topic;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.study.soufang.rabbit.a003.springboot.rabbitmq.MyRabbitDeclareConfiguration;
import com.study.soufang.rabbit.a003.springboot.rabbitmq.User;
@Component
public class TestSendTopic {
@Autowired
AmqpAdmin amqpAdmin;
@Autowired
AmqpTemplate amqpTemplate;
public void send(){
amqpTemplate.convertAndSend(MyRabbitDeclareConfiguration.EXCHANGE_NAME_TEST,
MyRabbitDeclareConfiguration.EXCHANGE_ROUTINGKEY_TOPIC,
new User().setId(16).setName("张大朋"),new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
//设置延迟消费时间10秒
message.getMessageProperties().setDelay(10000);
return message;
}
});
System.out.println("发送消息");
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------
package com.study.soufang.rabbit.a003.springboot.rabbitmq;
import java.io.Serializable;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain=true)
public class User implements Serializable{
private Integer id;
private String name;
}