如何通过命令行将参数传递给 Apache Camel?

How to pass parameters to Apache Camel through command line?

我使用 Apache Camel’s Spring Main 启动我的 Camel 应用程序。我需要我的应用程序读取命令行参数来设置一些参数。所以,我不能使用 属性 个文件。

目前,我可以通过 JVM 系统属性传递参数,而且效果很好:

Application.java

public class Application extends org.apache.camel.spring.Main {

  public static void main(String[] args) throws Exception {
    Application app = new Application();
    instance = app;
    app.run(args);
  }
}

camel-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <bean id="shutdownBean" class="com.example.ShutdownBean" />

  <camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="file:{{inputFile}}?noop=true"/>

      <to uri="bean:shutdownBean" />
    </route>
  </camelContext>

</beans>

我 运行 使用 java com.example.Application -DinputFile=C:/absolute/path/to/watch 的应用程序,一切正常:

…
FileEndpoint                   INFO  Using default memory based idempotent repository with cache max size: 1000
InternalRouteStartupManager    INFO  Route: route1 started and consuming from: file://C:/absolute/path/to/watch
AbstractCamelContext           INFO  Total 1 routes, of which 1 are started
…

但我想进行一些输入验证并使应用程序更易于使用,因为 -D 可能会让非 Java 用户感到困惑。所以我改变 Application.java:

public class Application extends org.apache.camel.spring.Main {

  private File inputFile;

  public static void main(String[] args) throws Exception {
    Application app = new Application();
    instance = app;
    app.run(args);
  }

  public Application() {
    addOption(new ParameterOption("i", "inputFile", "The input file", "inputFile") {
      @Override
      protected void doProcess(String arg, String parameter, LinkedList<String> remainingArgs) {
        File file = FileUtils.getFile(parameter);

        // some business validation

        setInputFile(file);
      }
    });
  }

  private void setInputFile(File inputFile) {
    this.inputFile = inputFile;
  }
}

然后,我可以使用以下命令 运行 应用程序:java com.example.Application -inputFile C:/absolute/path/to/watch

如何在我的 Camel 路线中使用我的 inputFile 字段?

在您的 doProcess 方法中调用 addProperty(String key, String value)。然后它将可以通过 {{key}} 表示法访问。


我的申请:

public final class MyApplication extends Main {

    private MyApplication() {
        super();
        addCliOption("g", "greeting", "Greeting");
        addCliOption("n", "name", "Who to greet");
    }

    public static void main(String[] args) throws Exception {
        MyApplication app = new MyApplication();
        app.configure().addRoutesBuilder(MyRouteBuilder.class);
        app.run(args);
    }

    private void addCliOption(String abbrevation, String parameterName, String description) {
        addOption(new ParameterOption(abbrevation, parameterName, description, parameterName) {
            protected void doProcess(String arg, String parameter, LinkedList<String> remainingArgs) {
                addProperty("console." + parameterName, parameter);
            }
        });
    }
}

MyRouteBuilder:

public class MyRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("quartz:foo")
            .log("{{console.greeting}} {{console.name}}");
    }
}

java org.apache.camel.example.MyApplication -问候你好 -name Morgan

23:10:25.862 [DefaultQuartzScheduler-MyCoolCamel_Worker-1] INFO  route1 - Hello Morgan
23:10:26.832 [DefaultQuartzScheduler-MyCoolCamel_Worker-2] INFO  route1 - Hello Morgan
23:10:27.829 [DefaultQuartzScheduler-MyCoolCamel_Worker-3] INFO  route1 - Hello Morgan