Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程中带超时的驼峰式http4路由_Java_Apache Camel - Fatal编程技术网

Java 线程中带超时的驼峰式http4路由

Java 线程中带超时的驼峰式http4路由,java,apache-camel,Java,Apache Camel,我想使用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

我想使用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毫秒的超时,并在这种情况下路由到故障处理程序。有人知道怎么做吗?

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


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

?httpClient.connectTimeout=10000&httpClient.connectionRequestTimeout=10000&httpClient.socketTimeout=30000
我通过使用小得离谱的值(1ms)进行测试进行验证,结果产生了“读取超时”错误


httpClient的可用选项似乎是上的setter值。

这并不理想,因为soTimeout映射到套接字的读取超时。因此,它不考虑连接时间,并且会为发生的每个socket.read()重置超时。所以,如果我有一个严格的延迟,我需要强制执行,soTimeout不能保证这一点。在没有camel的情况下执行此操作时,我知道的唯一方法是在线程内执行HttpClient,并从外部强制执行超时(通过Future,在Future.get()上超时)。但是我会让您使用+1来演示OneException技巧。但是,我如何确保只有来自特定路由的异常才会被定向到OneException路由?您的延迟要求有那么严格吗?大声想一想,您可能能够通过在队列上执行HTTP调用并超时来实现您的用例。关于OneException,您可以将其设置为“特定于路由”,请参阅并滚动到使用全局和每路由异常子句。我对SEDA队列的担心是,我不希望任何东西排队(或者我不想让它阻塞)。它应该总是直接分派给线程。我想我可以通过为SEDA线程池(?)选择适当数量的线程来解决这个问题。
?httpClient.connectTimeout=10000&httpClient.connectionRequestTimeout=10000&httpClient.socketTimeout=30000