1.pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.application.ym文件
mq.rabbit.host: 127.0.0.1
mq.rabbit.port: 5672
mq.rabbit.virtualHost: /
mq.rabbit.username: guest
mq.rabbit.password: guest
mqType: rabbit
3.rabbitmq的配置文件
package com.example.mq.config;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
@Configuration
public class RabbitMqConfig implements EnvironmentAware{
private Environment env;
@Override
public void setEnvironment(Environment environment) {
this.env = environment;
}
/**
* 这个注解能够控制某个configuration是否生效。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,
* 如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。
* 如果返回值为false,则该configuration不生效;为true则生效。
*/
@Bean
@ConditionalOnProperty(name = "mqType",havingValue = "rabbit")
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
connectionFactory.setHost(env.getProperty("mq.rabbit.host"));
connectionFactory.setPort(env.getProperty("mq.rabbit.port",Integer.class));
connectionFactory.setUsername(env.getProperty("mq.rabbit.username"));
connectionFactory.setPassword(env.getProperty("mq.rabbit.password"));
connectionFactory.setVirtualHost(env.getProperty("mq.rabbit.virtualHost"));
connectionFactory.setPublisherConfirms(true);
return connectionFactory;
}
@Bean
@ConditionalOnProperty(name = "mqType",havingValue = "rabbit")
public RabbitTemplate rabbitTemplate() {
RabbitTemplate template = new RabbitTemplate(connectionFactory());
//自定义消息转换器,转换成json格式
template.setMessageConverter(new Jackson2JsonMessageConverter());
return template;
}
}
4.rabbitmq的回调配置
package com.example.mq.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.support.CorrelationData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class CallbackConfig implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnCallback {
private Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
public RabbitTemplate rabbitTemplate;
@PostConstruct
public void init(){
rabbitTemplate.setConfirmCallback(this);
rabbitTemplate.setReturnCallback(this);
log.info("ConfirmCallbackConfig init ConfirmCallback and ReturnCallback");
}
/**
* 发送消息成功后的回调信息
*/
@Override
public void confirm(CorrelationData correlationData, boolean ack, String msg) {
if(ack){
log.info("rabbit mq confirmed success: {}", correlationData);
}else {
log.warn("rabbit mq confirmed failed: id {} msg {}", correlationData, msg);
}
}
/**
* 消费消息失败后的回调
*/
@Override
public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
log.info("rabbit mq returnedMessage : message : {}, replyCode : {}, replyText : {}, exchange : {}, routingKey : {}",
new String(message.getBody()), replyCode, replyText, exchange, routingKey);
log.warn(message.getMessageProperties().getCorrelationIdString() + "-----消费失败");
}
}
5. Fanout类型的Exchange
5.1 fanout的配置文件
package com.example.mq.config;
import com.example.mq.message.fanout.FanoutConsumer;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FanoutConfig {
public static final String EXCHANGE_FANOUT = "exchange_fanout";
public static final String QUEUE_FANOUT_A = "queue_fanout_a";
public static final String QUEUE_FANOUT_B = "queue_fanout_b";
public static final String QUEUE_FANOUT_C = "queue_fanout_c";
/*************************** 创建交换机 ***************************************/
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange(EXCHANGE_FANOUT);
}
/*************************** 创建