在Java中将HttpServletRequest推入RabbitMQ队列

u4vypkhs  于 2022-11-23  发布在  RabbitMQ
关注(0)|答案(1)|浏览(449)

我正在使用springboot和rabbitmq来排队请求,这些请求稍后将由接收方处理。当我们发送任何对象时,MQ发送方都能正常工作,但是当HTTP请求试图排队时,它会抛出下面的异常。

org.springframework.amqp.support.converter.MessageConversionException: Failed to convert Message content
    at org.springframework.amqp.support.converter.AbstractJackson2MessageConverter.createMessage(AbstractJackson2MessageConverter.java:463)
    at org.springframework.amqp.support.converter.AbstractMessageConverter.toMessage(AbstractMessageConverter.java:70)
    at org.springframework.amqp.support.converter.AbstractMessageConverter.toMessage(AbstractMessageConverter.java:58)
    at org.springframework.amqp.rabbit.core.RabbitTemplate.convertMessageIfNecessary(RabbitTemplate.java:1831)
    at org.springframework.amqp.rabbit.core.RabbitTemplate.convertAndSend(RabbitTemplate.java:1137)
    at org.springframework.amqp.rabbit.core.RabbitTemplate.convertAndSend(RabbitTemplate.java:1130)

将HTTP请求作为JSON写入MQ时发生转换异常。
如何将HTTP请求推送到MQ,以便在处理来自队列的请求时使用它来标识租户/安全性/头。
MQ配置、交换、队列和绑定对于普通对象来说是很好的。它只对HttpServletRequest类型有这种转换异常。
控制器及发送方法为:
第一次
下面是接收方服务尝试对应用程序中的另一个服务进行Rest模板POST调用的代码。被调用的服务在单独的Docker容器中运行。但是,当前正在本地尝试。

@RabbitListener(queues = "${spring.rabbitmq.requestqueue}")
public void receivedMessage(RequestDTO requestDto) {
    logger.info("Request Received is.. " + requestDto.getFileName());
    logger.debug("baseUrl to access file-service: " + baseUrl);

    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
    headers.setContentType(MediaType.APPLICATION_JSON);
    headers.add("X-Tenant-Identifier",requestDto.getTenantId());
    String accessToken = requestDto.getAccessToken();
    headers.set("Authorization", "Bearer " + accessToken);

    if (logic) {
        String url = baseUrl+"/processFile";
        HttpEntity<RequestDTO> requestEntity = new HttpEntity<>(requestDto, headers);
        ResponseEntity<ResponseDTO> resp = restTemplate.postForEntity(baseUrl, requestEntity, ResponseDTO.class);
        logger.debug("Response:"+resp);
        if (resp.getStatusCode() != HttpStatus.OK) {
            logger.debug("Error occurred processing request:" + requestDto.getFileName());
        }
    }
}
qgzx9mmu

qgzx9mmu1#

这是不正确的,HttpServletRequest是一个servlet容器实体,它和容器紧密相连,当你把控制权返回给容器,ResponseEntity时,它的生命周期就结束了.
您必须寻找一种方法,将此请求转换为某种数据对象,该数据对象携带HTTP请求的主体和头部。

相关问题