1.自定义CorrelationData
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MyCorrelationData extends CorrelationData {
/**
* 内容
* @author LXC
* @date 2023/2/4 15:47
*/
private String body;
/**
* 交换机名
* @author LXC
* @date 2023/2/4 15:47
*/
private String exchangeName;
/**
* 路由钥匙
* @author LXC
* @date 2023/2/4 15:47
*/
private String routingKey;
}
2.自定义RabbitTemplate
public class MyRabbitTemplate extends RabbitTemplate{
public MyRabbitTemplate(ConnectionFactory connectionFactory) {
super(connectionFactory);
}
public void convertAndSend(MyCorrelationData myCorrelationData){
String messageId = UUID.randomUUID().toString().replace("-","");
MessagePostProcessor messagePostProcessor = message -> {
MessageProperties messageProperties = new MessageProperties();
messageProperties.setMessageId(messageId);
messageProperties.setReceivedExchange(myCorrelationData.getExchangeName());
messageProperties.setReceivedRoutingKey(myCorrelationData.getRoutingKey());
return new Message(myCorrelationData.getBody().getBytes(),messageProperties);
};
myCorrelationData.setId(messageId);
convertAndSend(myCorrelationData.getExchangeName(),myCorrelationData.getRoutingKey(),
myCorrelationData.getBody(),messagePostProcessor, myCorrelationData);
}
}
3.自定义rabbitmqconfig
@Configuration
@Slf4j
public class RabbitConfig {
@Bean(name = "myRabbitTemplate")
@Primary
public MyRabbitTemplate rabbitTemplate(CachingConnectionFactory connectionFactory) {
MyRabbitTemplate rabbitTemplate = new MyRabbitTemplate(connectionFactory);
rabbitTemplate.setMandatory(true);
rabbitTemplate.setUsePublisherConnection(true);
rabbitTemplate.setUserCorrelationId(true);
return rabbitTemplate;
}
}
4.配置请求头的问题在关于SpringBoot 中 SecurityUtils在 Thread 中无法获取的问题!_活在梦里鑫的博客-CSDN博客
5.拦截AOP RabbitListener
@Aspect
@Component
public class RabbitMQInterceptor {
@Around("@annotation(org.springframework.amqp.rabbit.annotation.RabbitListener)")
public Object around(ProceedingJoinPoint point) throws Throwable{
Object[] args = point.getArgs();
if(ObjectUtils.isEmpty(args)){
return point.proceed();
}
for (Object obj:args){
if(!(obj instanceof Message)){
continue;
}
Message message = (Message) obj;
Map<String, Object> headers = message.getMessageProperties().getHeaders();
for (String key:headers.keySet()){
if(!(headers.get(key) instanceof String)){
continue;
}
ThreadLocalUtils.addHeader(key, String.valueOf(headers.get(key)));
}
break;
}
return point.proceed();
}
}
6.完美解决!