【问题标题】:Passing array of arguments to Quartz Scheduler将参数数组传递给 Quartz 调度器
【发布时间】:2016-01-19 21:53:49
【问题描述】:

我正在尝试将 Quartz Scheduler 添加到现有的 Java 类中。

该类使用String[] args 作为主函数的输入。

public static void main(String[] args) {
   //validate(args);
   summarizeData(args);
}

但是Java类实现了Job,它必须使用execute方法,它只接受一个参数。

public void execute(JobExecutionContext arg0) throws JobExecutionException {
   // How to get the String[] args and pass it to this execute method?
   // Then I can pass it to the next helper functions, etc.
   // summarizeData(args);
}

有什么建议吗?

编辑 1:args 应该是 String 中的命令行参数

【问题讨论】:

  • 您可能想在您的问题中添加您传递给main 的内容(例如,args 是什么以及为什么在执行时需要它)
  • @Avantol13 参数是字符串中的两个日期(start_date,end_date)。我在执行时需要它,因为其他帮助函数,例如 summariseData() 使用它作为输入。

标签: java command-line-arguments quartz-scheduler


【解决方案1】:

问题解决了。

我必须将命令行参数映射到调度程序类中的JobDataMap。然后在.execute 方法中使用getJobDataMap() 来检索参数并将它们放回String[]

【讨论】:

    【解决方案2】:

    您可以将对象添加到调度程序上下文中

    scheduler.getContext().put("arg1", "value1"); //or loop through your args
    

    然后检索它:

    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        String arg1 = null;
        try {
            arg1 = (String)jobExecutionContext.getScheduler().getContext().get("arg1");
            //Do something
        } catch (SchedulerException e) {
            //Error management
        }
    }
    

    【讨论】:

      【解决方案3】:

      在这种情况下,根据传入的参数类型(以及您正在创建的类),创建新的静态类变量并将它们设置在main 中可能是有利的。如果您需要非静态变量,您可能需要修改您的类构造函数和访问器/修改器(getter/setter)方法来设置它们。

      选项 I - 静态变量?

      仅当变量在类的所有实例中都相同时才有效!

      另外,我不知道 Quartz 是如何工作的,所以请注意我在代码 cmets 中的警告。

      public class YourClass extends Job
      {
          // Your other class variables
      
          // New static variables
          private static String someVariable;
          private static String someOtherVariable;
      
          public static void main(String[] args) {
              someVariable = args[0]; //<---- Set class variables
              someOtherVariable = args[1];
      
              // Do other stuff
          }
      
          // WARNING: If main isn't called (from any instance) before execute
          // the class variables will still be null
          public void execute(JobExecutionContext arg0) throws JobExecutionException {
             // Do stuff with someVariable and someOtherVariable 
             System.out.println(someVariable + " " + someOtherVariable);
         }
      }
      

      选项 II - 非静态变量

      根据您的实现,您可能希望将变量设置在main 之外,因此它们不是静态的。在这种情况下,只需创建非静态类变量并修改构造函数以在创建对象时设置这些变量(和/或添加访问器/突变器(getter/setter)方法以在初始化后修改变量)。

      由于我不知道你是如何使用这个类的,所以我不知道上面两个选项中哪个效果最好。

      【讨论】:

      • static 很好,但是当有execute 时根本不会调用main。如果我在main 之外设置变量,我还能接受命令行参数吗?
      猜你喜欢
      • 1970-01-01
      • 2017-12-29
      • 2016-12-09
      • 2012-01-15
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多