我如何接收从Apache骆驼路由到Spring Boot Controller的响应

问题描述

从路由中我将数据发送到端点 direct:接收,并且我正在控制器中通过使用consumertemplate接收到数据,但是低于错误

[骆驼(camel-1)线程#1- JmsConsumer [MQT.EI.PRD2X4_PRODUCER_UT.REPLY.Q1]]错误 o.a.c.processor.DefaultErrorHandler.log-交付失败 (MessageId:ID:c3e2d840d4d8e3f14040404040404040040d85c2573b4cf7342上 ExchangeId:ID-APINP-ELPT60235-1597255599355-0-5)。精疲力尽 尝试投放:1个: org.apache.camel.component.direct.DirectConsumerNotAvailableException: 终结点上没有可用的使用者:direct:// recive。 交换[ID-APINP-ELPT60235-1597255599355-0-5]

任何人都可以提出关于如何从到控制器的路由中获取响应数据的建议吗?

控制器代码

O(N)

路由代码

@Autowired
    private CamelContext camelContext;
    @Autowired
    private ProducerTemplate producer;
    @Autowired
        ConsumerTemplate consumer;

    @PostMapping("/request-reply")
    public String requestReplyMapping(@RequestBody String inputReq) {

        Exchange exchangeRequest = ExchangeBuilder.anExchange(camelContext).withBody(inputReq).build();
        Exchange exchangeResponse = producer.send("direct:request-reply",exchangeRequest);

        Exchange receive = consumer.receive("direct:receive"); //receiving data from this endpoint
        return null;

    }

解决方法

您不需要使用ConsumerTemplate来尝试执行的操作。默认情况下,直接组件的交换模式为InOut。因此,您可以在处理骆驼路线后使用exchangeResponse变量进行交换。

骆驼路线:

from("direct:start")
.log("${body} in stat")
.transform().simple("text")
.to("direct:nextRoute");

from("direct:nextRoute")
.log("${body} in nextRoute");

其他控制器:

public class RestController{

    final static String CAMEL_START_URI ="direct:start";

    @Autowired
    CamelContext camelContext;

    @Autowired
    @EndpointInject(uri=CAMEL_START_URI)
    ProducerTemplate producer;

    @PostMapping(value = "/request")
    public String requestMapping(@RequestBody String inputReq) {
        
        Exchange sendExchange = ExchangeBuilder.anExchange(camelContext).withBody(inputReq).build();
        Exchange outExchange = producer.send(sendExchange);
        String outString = outExchange.getMessage().getBody(String.class);
        System.out.println(outString); //this will have a value of "text" since I am setting the body as "text" in the second route
        return outString; 
    }

}