微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用 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.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?