5

我有一个作为独立 Java 应用程序运行的简单文件传输应用程序。它从 SFTP 端点获取文件并将它们移动到另一个端点。

文件在传输后会从 SFTP 端点中删除。当没有更多文件时,最好让程序结束。但是,我无法找到可以启动 Camel 并使其有条件地结束的解决方案(例如,当 SFTP 端点中没有更多文件时)。我目前的解决方法是启动 Camel,然后让主线程休眠很长时间。然后用户必须手动终止应用程序(通过 CTRL+C 或其他方式)。

有没有更好的方法让应用程序自动终止?

以下是我当前的代码:

在 CamelContext(Spring App 上下文)中:

<route>
    <from uri="sftp:(url)" />
    <process ref="(processor)" />
    <to uri="(endpoint)" />
</route>

main() 方法:

public static void main(String[] args)
{
  ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  CamelContext camelContext = appContext.getBean(CamelContext.class);

  try
  {
    camelContext.start();
    Thread.sleep(1000000000); // Runs the program for a long time -- is there a better way?
  }
  catch (Exception e)
  {
    e.printStackTrace();
  }

  UploadContentLogger.info("Exiting");
}
4

2 回答 2

6

你可以改变你的路线是这样的:

<route>
    <from uri="sftp:(url)?sendEmptyMessageWhenIdle=true" />
    <choose>
        <when>
            <simple>${body} != null</simple>
            <process ref="(processor)" />
            <to uri="(endpoint)" />
        </when>
        <otherwise>
            <process ref="(shutdownProcessor)" />
        </otherwise>
    </choose>
</route>

注意使用sendEmptyMessageWhenIdle=true

这是shutdownProcessor

public class ShutdownProcessor {
    public void stop(final Exchange exchange) {
        new Thread() {
            @Override
            public void run() {
                try {
                    exchange.getContext().stop();
                } catch (Exception e) {
                    // log error
                }
            }
        }.start();
    }
}

实际上我没有运行这段代码,但它应该可以按需要工作。

于 2012-10-16T17:39:56.090 回答
1

我只是想向您指出这个常见问题解答 http://camel.apache.org/how-can-i-stop-a-route-from-a-route.html

于 2012-10-17T08:53:26.647 回答