Java 如何以自动方式关闭独立的Apache Camel应用程序?
我正在尝试使用ApacheCamel从FTP服务器下载和路由文件。然而,文件只会在很长一段时间内添加到FTP服务器上一次,因此让程序持续运行似乎有点过分。相反,我更希望有一个cronjob每周运行,并处理添加到服务器的任何新文件 有没有办法让Camel在不再有任何新文件要处理时自动关机 我当前的Java 如何以自动方式关闭独立的Apache Camel应用程序?,java,apache-camel,Java,Apache Camel,我正在尝试使用ApacheCamel从FTP服务器下载和路由文件。然而,文件只会在很长一段时间内添加到FTP服务器上一次,因此让程序持续运行似乎有点过分。相反,我更希望有一个cronjob每周运行,并处理添加到服务器的任何新文件 有没有办法让Camel在不再有任何新文件要处理时自动关机 我当前的main函数如下所示: public static void main (String[] args) throws Exception { org.apache.camel.spring.Mai
main
函数如下所示:
public static void main (String[] args) throws Exception {
org.apache.camel.spring.Main main = new org.apache.camel.spring.Main ();
main.setApplicationContextUri ("applicationContext.xml");
main.enableHangupSupport ();
main.run (args);
}
applicationContext.xml
中有趣的部分是:
<camelContext>
<route>
<from uri="ftp://ftp.example.com/remoteDir?username=user&password=pass"/>
<to uri="file:../ftp_data?tempPrefix=."/>
</route>
</camelContext>
请参阅此常见问题解答如何从路由停止路由: 然后,您可以启用选项:sendEmptyMessageWhenIdle=true,然后在路由中执行消息过滤器或基于内容的路由,并检测空消息,然后停止路由,然后在该上下文之后
虽然我也认为这个问题以前已经讨论过,所以你可以找到其他的so问题或google等,因为还有其他方法可以做到这一点。添加此示例可能对其他人有用,而无需挖掘链接中的所有示例 定义一个将启动单独线程的bean/处理器。这个新线程将在活动的
CamelContext
上调用stop()
public class ShutdownBean {
private final static Logger log = LoggerFactory.getLogger(ShutdownBean.class);
public void process(Exchange exchange) throws Exception {
final CamelContext camelContext = exchange.getContext();
Thread shutdownThread = new Thread(() -> {
Thread.currentThread().setName("ShutdownThread");
try {
camelContext.stop();
} catch (Exception e) {
log.error("Errore during shutdown", e);
}
});
shutdownThread.start();
}
}
在应用程序上下文中定义此路由,并在需要关闭Camel时调用它
<bean id="shutdownBean"
class="your.package.ShutdownBean" />
<camelContext>
<route id="ShutdownRoute">
<from uri="direct:shutdown" />
<log message="Shutdown..." />
<to uri="bean:shutdownBean" />
</route>
</camelContext>
注意:
enableHangupSupport()
在较新的Camel版本中不推荐使用:现在默认启用,因此不再需要调用此方法。完成Claus应答后,此代码仅以一次方式运行Main:
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.main.Main;
public class MyMainRouter extends RouteBuilder {
static Main main;
@Override
public void configure() throws Exception {
from("timer:foo?delay=5s")
.log("Hello camel, main world after 5 seconds!")
.process(processor -> main.completed());
}
public static void main(String[] args) throws Exception {
main = new Main();
main.addRouteBuilder(new MyMainRouter());
main.run();
}
}
5秒后,代码将只运行一次,因为我们将调用一个处理器,该处理器将调用completed()方法,该方法在内部具有CountDownLatch,用于停止来自另一个线程的路由模式。这应该是新的可接受答案。我有这样的工作,因为它关闭了路线,但我正在寻找一种方法,退出整个骆驼进程本身。有什么想法吗?我的解决方案停止了整个
CamelContext
。如果您使用Spring集成,这也应该退出整个应用程序。如何运行Camel?你说得对,我确实看到CamelContext
正在关闭。Camel是通过gradle任务启动的,但当它关闭时,任务似乎就挂起了。Camel可能不会关闭并带有退出代码吗?现在这可能更像是一个gradle问题。更新:因此问题最终与选项未正确附加到文件组件有关。我有uri=”file://path/to/dir?option1=val1?option2=val2 而应该是uri=”file://path/to/dir?option1=val1&选项2=val2。没有错误被轻易抛出;任务将在上下文关闭后挂起。结果还表明,通过&;这是非常重要的。