Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.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 如何以自动方式关闭独立的Apache Camel应用程序?_Java_Apache Camel - Fatal编程技术网

Java 如何以自动方式关闭独立的Apache 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

我正在尝试使用ApacheCamel从FTP服务器下载和路由文件。然而,文件只会在很长一段时间内添加到FTP服务器上一次,因此让程序持续运行似乎有点过分。相反,我更希望有一个cronjob每周运行,并处理添加到服务器的任何新文件

有没有办法让Camel在不再有任何新文件要处理时自动关机

我当前的
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&amp;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。没有错误被轻易抛出;任务将在上下文关闭后挂起。结果还表明,通过&;这是非常重要的。