如何解决使用 Spring AMQP 请求/响应保留 MDC
我正在使用 RabbitMQ 模块通信在 Spring Boot 中开发一个简单的计算器 REST API。
在其余控制器中,我收到一个请求并使用 RabbitTemplate convertSendAndReceive() 发送一个对象,其中包含计算器要处理的数字和运算。
我在计算器模块中有一个监听器,它接收消息并进行数学运算,然后返回结果。之后,我在其余控制器中返回响应。
一个要求是我总是在响应头中给用户一个响应令牌。为此,我使用了一个 MDC 过滤器来保存令牌并将其发送到响应标头中。
所有这些都在起作用。现在的问题是,另一个需求是我在模块通信中记录令牌,所以我使用log4j2记录了保存在MDC中的密钥。当 rest 控制器收到请求时,它正在为第一个操作工作,它出现在我插入那里的日志中,但我还需要计算器监听器中的一个日志,并且密钥没有出现在该日志中。
这里有什么问题?
休息控制器
public class RestController {
private static final Logger log = LogManager.getLogger(RestController.class);
@Autowired
private RabbitTemplate rabbitTemplate;
public ResponseEntity<Object> produceNewOperation(Operation op){
log.info("Produced new operation: " + op);
BigDecimal response = (BigDecimal) rabbitTemplate.convertSendAndReceive(CalculatorConfig.EXCHANGE_NAME,CalculatorConfig.ROUTING_KEY,op);
return ResponseEntity.status(HttpStatus.ACCEPTED).body(
Collections.singletonMap("result",response));
}
@GetMapping("/sum")
public ResponseEntity<Object> sum(@RequestParam BigDecimal a,@RequestParam BigDecimal b){
Operation op = new Operation(OP.SUM,a,b);
return produceNewOperation(op);
}
@GetMapping("/sub")
public ResponseEntity<Object> sub(@RequestParam BigDecimal a,@RequestParam BigDecimal b){
Operation op = new Operation(OP.SUB,b);
return produceNewOperation(op);
}
@GetMapping("/div")
public ResponseEntity<Object> div(@RequestParam BigDecimal a,@RequestParam BigDecimal b){
if(b.compareto(BigDecimal.ZERO) == 0){
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(
Collections.singletonMap("result","can't divide by 0"));
}
Operation op = new Operation(OP.DIV,b);
return produceNewOperation(op);
}
@GetMapping("/mul")
public ResponseEntity<Object> mul(@RequestParam BigDecimal a,@RequestParam BigDecimal b){
Operation op = new Operation(OP.MUL,b);
return produceNewOperation(op);
}
听众
public class OperationListener extends SimpleMessageListenerContainer {
private static final Logger log = LogManager.getLogger(OperationListener.class);
@RabbitListener(queues = CalculatorConfig.DEFAULT_PARSING_QUEUE)
public BigDecimal consumeNewOperation(final Operation operation){
log.info("Consumed new operation: " + operation);
return CalculatorController.calculate(operation);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。