问题描述
我正在使用 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 (将#修改为@)