簡體   English   中英

Spring開機駱駝問題使用rest后發消息給rabbitmq

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM