有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

线程中带超时的java camel http4路由

我想使用http4路由,但让它在一个有超时的线程内执行。我已经有了我的http4路由设置,如下所示:

from("direct:start")
.setHeader(Exchange.HTTP_QUERY,simple("format=json&count=${in.headers.count}"))
.to("http4://www.host.com/someapi")
.unmarshal().json(JsonLibrary.JACKSON,MyResponseType.class)
.to("bean:SomeBean?method=echo");

我希望在http调用周围应用100毫秒的超时,并在这种情况下路由到故障处理程序。有人知道怎么做吗


共 (3) 个答案

  1. # 1 楼答案

    更新。。。我认为超时配置的语法在更高版本的Camel中已经更改。对于Camel 2.16.2,我发现文档中的超时参数可以通过query param选项设置,但它们需要以httpClient作为前缀。以下是对我有效的方法:

    ?httpClient.connectTimeout=10000&httpClient.connectionRequestTimeout=10000&httpClient.socketTimeout=30000
    

    我通过使用小得离谱的值(1ms)进行测试进行验证,结果产生了“读取超时”错误

    看起来httpClient的可用选项是RequestConfig.Builder上的setter值

  2. # 3 楼答案

    您可以通过指定http4://foo?httpClient.soTimeout=100在客户端上设置100ms超时。当超时发生时,它可能会抛出一个您可以像这样处理的异常(在我看来,是未经测试的代码):

    onException(IOException.class).to("direct:timeouts");
    
    from("direct:start")
    .setHeader(Exchange.HTTP_QUERY,simple("format=json&count=${in.headers.count}"))
    .to("http4://www.host.com/someapi?httpClient.soTimeout=100")
    .unmarshal().json(JsonLibrary.JACKSON,MyResponseType.class)
    .to("bean:SomeBean?method=echo");
    
    from("direct:timeouts").to("...");