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.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class TestRecv {
@RabbitListener(queuesToDeclare=@Queue("springboot.rabbit.test.simple.queue"))
public void processMessage(User user) throws Exception {
System.out.println("---------"+user);
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------
package com.study.soufang.rabbit.a003.springboot.rabbitmq;
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.amqp.core.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class TestSend {
@Autowired
AmqpAdmin amqpAdmin;
@Autowired
AmqpTemplate amqpTemplate;
public void send(){
String queueName = "springboot.rabbit.test.simple.queue";
//注意默认队列是持久化的
amqpAdmin.declareQueue(new Queue(queueName));
/**
* mandatory 默认为FALSE,如果exchange根据自身类型和消息routeKey无法找到一个符合条件的queue,会直接将消息扔掉
* 发送过程中RabbitServer挂掉,会直接报错 Connection refused: connect
*/
//默认消息持久化发送
amqpTemplate.convertAndSend("",queueName, new User().setId(14).setName("中文"));
//发送非持久化消息,RabbitServer重启后,消息丢失
amqpTemplate.convertAndSend(queueName, new User().setId(14).setName("中文"), new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);
return message;
}
});
}
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------
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;
}