我正在使用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());
}
}
}
1条答案
按热度按时间qgzx9mmu1#
这是不正确的,
HttpServletRequest
是一个servlet容器实体,它和容器紧密相连,当你把控制权返回给容器,ResponseEntity
时,它的生命周期就结束了.您必须寻找一种方法,将此请求转换为某种数据对象,该数据对象携带HTTP请求的主体和头部。