我如何从ApacheCammel路由接收到Spring引导控制器的响应
通过使用consumertemplate将数据从路由发送到endpointdirect:receive,我在控制器中接收相同的数据,但错误如下 [骆驼(骆驼-1)线#1- JmsConsumer[MQT.EI.PRD2X4_PRODUCER_UT.REPLY.Q1]]错误 o、 a.c.processor.DefaultErrorHandler.log-为的传递失败 (消息ID:ID:C3E2D840D4D8E3F1404040400D85C2573B4CF7342打开 交换ID:ID-APINP-ELPT60235-1597255599355-0-5)。筋疲力尽 传递尝试:1捕获: org.apache.camel.component.direct.DirectConsumerNotAvailableException: 终结点上没有可用的使用者:direct://recive. 交易所[ID-APINP-ELPT60235-1597255599355-0-5] 是否有人能就如何从控制器的路径获取响应数据给出建议 控制器代码:我如何从ApacheCammel路由接收到Spring引导控制器的响应,spring,spring-boot,apache-camel,Spring,Spring Boot,Apache Camel,通过使用consumertemplate将数据从路由发送到endpointdirect:receive,我在控制器中接收相同的数据,但错误如下 [骆驼(骆驼-1)线#1- JmsConsumer[MQT.EI.PRD2X4_PRODUCER_UT.REPLY.Q1]]错误 o、 a.c.processor.DefaultErrorHandler.log-为的传递失败 (消息ID:ID:C3E2D840D4D8E3F1404040400D85C2573B4CF7342打开 交换ID:ID-APIN
@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;
}
@Component
public class RequestReplyRouter extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:request-reply").
to("jms:RequestQueue?ReplyTo=ResponseQueue&exchangePattern=InOut")
.log("Request-reply Body is ${body} and header info is ${headers} ");
from("jms:ResponseQueue")
.log("Received Body is ${body} and header info is ${headers} ")
.to("direct:receive"); // sending data to the endpoint
}
}
路线代码:
@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;
}
@Component
public class RequestReplyRouter extends RouteBuilder {
@Override
public void configure() throws Exception {
from("direct:request-reply").
to("jms:RequestQueue?ReplyTo=ResponseQueue&exchangePattern=InOut")
.log("Request-reply Body is ${body} and header info is ${headers} ");
from("jms:ResponseQueue")
.log("Received Body is ${body} and header info is ${headers} ")
.to("direct:receive"); // sending data to the endpoint
}
}
您不需要一个consumerTemplate来完成您的尝试。默认情况下,Direct组件的交换模式为InOut。因此,您可以使用
exchangereresponse
变量在处理骆驼路线后获取交换
骆驼路线:
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;
}
}
我很感激你的时间,但我仍然面临其他问题,请你检查一下好吗