骆驼 Java Routebuilder 超时

Camel Java Routebuilder Timeout

我有一个 Camel routebuilder,其中定义了以下路线:

from(route).routeId("route1")
                .bean(myBean)
                .setHeader(Exchange.HTTP_METHOD, constant("GET"))
                .to("log:get-data-request?level=INFO&ShowHeaders=false&ShowBody=true")
                .to(myURI)
                .to("log:get-data-response?level=INFO&ShowHeaders=false&ShowBody=true")

是否可以为此路由添加超时,以便如果来自 myURI 的回复花费的时间超过 10 秒,它会抛出某种异常?

目前,如果没有立即响应,我的应用程序似乎会挂起等待请求。

有两种方法可以做到这一点:

  1. @soilworker 已经解释过 - http://localhost:9080/myservice?httpClient.soTimeout=5000. See unit test here.

  2. 这不是正确的方法,但适用于简单的场景。

    public static void main(String[] args) {
        JndiContext jndiContext = (new SetJndiContext()).SetJndiContext();
        CamelContext camelContext = new DefaultCamelContext(jndiContext);
        try {
             //camelContext.addRoutes(new MyRouteBuilder());
             camelContext.addRoutes(new FileDownloadRouter());
             camelContext.start();
             Thread.sleep(10000);
             camelContext.stop();
         } catch (Exception e) {
             e.printStackTrace();
         }
    }
    

基本上,当您的路由启动时 运行,上下文将在 10 秒后自动关闭。同样,这不是理想的方法。选项 1 是正确的方法,但此方法也适用。

您能否指定 toUri 的端点类型?

  • 如果它是一个 HTTP[1] 端点并且您正在调用 REST 端点,您可以在 http 调用下方使用您想要的 SocketTimeout 设置 Apache HTTP 组件。
  • 如果你想调用另一个 Camel 端点,你可以使用 Camel 提供的 Async [2] 策略。使用 Future Exchange,您可以设置原始端点等待的时间。但是第二个线程可以保持活动并完成任务。

[1] http://camel.apache.org/http.html [2] http://camel.apache.org/async.html