|
|
|
@ -29,6 +29,17 @@ import static com.tianji.common.constants.MqConstants.Key.ERROR_KEY_PREFIX;
|
|
|
|
|
import static com.tianji.common.constants.MqConstants.Queue.ERROR_QUEUE_TEMPLATE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* MqConfig 用于配置RabbitMQ的相关参数和组件
|
|
|
|
|
* 实现了Spring的EnvironmentAware接口,
|
|
|
|
|
* 用于在应用程序启动时获取应用程序的名称,
|
|
|
|
|
* 并根据该名称设置默认的错误路由键和错误队列。
|
|
|
|
|
* <br/>
|
|
|
|
|
* {@code @ConditionalOnClass}
|
|
|
|
|
* 这个注解表示只有当 MessageConverter和 AmqpTemplate 这两个类在类路径中存在时
|
|
|
|
|
* 才会创建这个配置类
|
|
|
|
|
* @author 夜灬瞬
|
|
|
|
|
*/
|
|
|
|
|
@Configuration
|
|
|
|
|
@ConditionalOnClass(value = {MessageConverter.class, AmqpTemplate.class})
|
|
|
|
|
public class MqConfig implements EnvironmentAware{
|
|
|
|
@ -36,15 +47,33 @@ public class MqConfig implements EnvironmentAware{
|
|
|
|
|
private String defaultErrorRoutingKey;
|
|
|
|
|
private String defaultErrorQueue;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 用于创建一个名为"rabbitListenerContainerFactory"的bean对象。
|
|
|
|
|
* 这个bean对象是一个RabbitMQ的监听容器工厂,用于处理消息的消费者。
|
|
|
|
|
* @param configurer
|
|
|
|
|
* @param connectionFactory
|
|
|
|
|
* @param simpleContainerCustomizer
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
@Bean(name = "rabbitListenerContainerFactory")
|
|
|
|
|
@ConditionalOnProperty(prefix = "spring.rabbitmq.listener", name = "type", havingValue = "simple",
|
|
|
|
|
matchIfMissing = true)
|
|
|
|
|
SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(
|
|
|
|
|
SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory,
|
|
|
|
|
ObjectProvider<ContainerCustomizer<SimpleMessageListenerContainer>> simpleContainerCustomizer) {
|
|
|
|
|
// 创建 SimpleRabbitListenerContainerFactory 对象
|
|
|
|
|
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
|
|
|
|
|
// 使用 configurer对象对 factory对象进行配置
|
|
|
|
|
configurer.configure(factory, connectionFactory);
|
|
|
|
|
// 设置一个容器自定义器,用于对容器进行进一步的定制。
|
|
|
|
|
simpleContainerCustomizer.ifUnique(factory::setContainerCustomizer);
|
|
|
|
|
/*
|
|
|
|
|
这段代码设置了一个消息后处理器。
|
|
|
|
|
这个后处理器会在消息被消费者接收后执行,用于对消息进行后续处理。
|
|
|
|
|
具体来说,
|
|
|
|
|
这个后处理器会从消息的消息属性中获取一个名为"REQUEST_ID_HEADER"的头部信息,并将其放入MDC中。
|
|
|
|
|
这样,在后续的日志输出中,就可以方便地获取到这个请求的ID信息了。
|
|
|
|
|
*/
|
|
|
|
|
factory.setAfterReceivePostProcessors(message -> {
|
|
|
|
|
Object header = message.getMessageProperties().getHeader(REQUEST_ID_HEADER);
|
|
|
|
|
if(header != null) {
|
|
|
|
@ -55,6 +84,11 @@ public class MqConfig implements EnvironmentAware{
|
|
|
|
|
return factory;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 这段代码的作用是创建一个RabbitMQ消息转换器,用于将JSON格式的消息转换为Java对象。
|
|
|
|
|
* @param mapper JSON
|
|
|
|
|
* @return 返回
|
|
|
|
|
*/
|
|
|
|
|
@Bean
|
|
|
|
|
public MessageConverter messageConverter(ObjectMapper mapper){
|
|
|
|
|
return new Jackson2JsonMessageConverter(mapper);
|
|
|
|
@ -92,11 +126,21 @@ public class MqConfig implements EnvironmentAware{
|
|
|
|
|
return new DirectExchange(ERROR_EXCHANGE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 默认队列
|
|
|
|
|
* @return 队列
|
|
|
|
|
*/
|
|
|
|
|
@Bean
|
|
|
|
|
public Queue errorQueue(){
|
|
|
|
|
return new Queue(defaultErrorQueue, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 异常队列 交换机 绑定
|
|
|
|
|
* @param errorQueue 异常队列
|
|
|
|
|
* @param errorMessageExchange 异常交换机
|
|
|
|
|
* @return 返回绑定对象
|
|
|
|
|
*/
|
|
|
|
|
@Bean
|
|
|
|
|
public Binding errorBinding(Queue errorQueue, DirectExchange errorMessageExchange){
|
|
|
|
|
return BindingBuilder.bind(errorQueue).to(errorMessageExchange).with(defaultErrorRoutingKey);
|
|
|
|
@ -105,7 +149,9 @@ public class MqConfig implements EnvironmentAware{
|
|
|
|
|
@Override
|
|
|
|
|
public void setEnvironment(Environment environment) {
|
|
|
|
|
String appName = environment.getProperty("spring.application.name");
|
|
|
|
|
// 设置错误队列的路由键 error. applicationName
|
|
|
|
|
this.defaultErrorRoutingKey = ERROR_KEY_PREFIX + appName;
|
|
|
|
|
// 设置错误队列的队列名 error. applicationName .queue
|
|
|
|
|
this.defaultErrorQueue = StringUtils.format(ERROR_QUEUE_TEMPLATE, appName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|