[英]Spring boot Camel problems when using rest post to send a message to rabbitmq
I have a spring boot application that publish a rest endpoint to receives xml messages using apache camel, below the relevant part of the code corresponding to the configuration of the route:
restConfiguration()
.component("servlet")
.bindingMode(RestBindingMode.auto);
rest("/api/").description("REST Message Endpoint Service")
.id("rest-producer-route")
// Accept post requests at /api/message
.post("/message")
// request in xml format
.consumes("application/xml")
.to("direct:remoteService");
from("direct:remoteService")
// RABBIT_URI = "spring-rabbitmq:%s?routingKey=%s&arg.queue.autoDelete=false";
.to(String.format(CamelConfiguration.RABBIT_URI, "coreEngine", "coreEngine"))
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(201));
嘗試使用 Postman 以 xml 格式發送消息時,大約 30 秒后我收到 500 錯誤,以下異常:
org.springframework.amqp.core.AmqpReplyTimeoutException: Reply timed out
at org.springframework.amqp.rabbit.AsyncRabbitTemplate$RabbitFuture$TimeoutTask.run(AsyncRabbitTemplate.java:762) ~[spring-rabbit-2.4.6.jar:2.4.6]
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) ~[spring-context-5.3.22.jar:5.3.22]
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) ~[na:na]
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:829) ~[na:na]
但是在 rabbitmq 服務器上,消息已成功保存到 coreEngine 隊列。
我不需要進行任何轉換,端點的目標只是接收 xml 格式的消息並將它們存儲在 rabbitmq 隊列中。
據我所知,使用了 AsyncRabbitTemplate,這會是問題的原因嗎? 我應該怎么做才能正確配置它?
這是因為默認情況下交換模式期待回復,因此駱駝使用AsyncRabbitTemplate.sendAndReceive
。 如果您只想觸發並忘記,請將交換模式設置為ExchangePattern.InOnly
以便 Camel 使用RabbitTemplate.send
。
您的代碼應更改為,
from("direct:remoteService")
// RABBIT_URI = "spring-rabbitmq:%s?routingKey=%s&arg.queue.autoDelete=false";
.to(ExchangePattern.InOnly, String.format(CamelConfiguration.RABBIT_URI, "coreEngine", "coreEngine"))
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(201));
參考Apache駱駝SpringRabbitMQProducer源碼SpringRabbitMQProducer
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.