使用 Spring AMQP 请求/响应保留 MDC

问题描述

我正在使用 RabbitMQ 模块通信在 Spring Boot 中开发一个简单的计算器 REST API。

我有 2 个模块,一个休息区和一个计算器。

在其余控制器中,我收到一个请求并使用 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...