0

我已经从一个属性文件中配置了 CronExpression,但是这个属性文件是 apache-deltaspike.properties,它位于 .jar 文件中。我需要从我的自定义配置文件中获取 cron 表达式:

import org.apache.deltaspike.core.api.config.PropertyFileConfig;

public class myOwnPropertyFileConfig  implements PropertyFileConfig  {
  private static final long serialVersionUID = 1L;

  @Override
  public String getPropertyFileName() {
    return "cfg/myOwnPropFile.properties";
  }

  @Override
  public boolean isOptional() {
    return false;
  }

}

myOwnPropFile.properties

deltaspike_ordinal=500
property1=value1
property2=value2
QuartzJob=0 25 17 * * ?

工作:

@Scheduled(cronExpression = "{QuartzJob}")
public class MyQuartzJob implements Job {
  //job code
}

当我设置这个属性时一切顺利: QuartzJob=0 25 17 * * ? 在 apache-deltaspike.properties 中,但是当我在自己的属性文件中设置它时,我得到:

java.lang.IllegalStateException: No config-value found for config-key: QuartzJob 

研究,我发现我的属性文件是在 Quartz 初始化之后立即加载的,这就解释了原因。现在,我在 Deltaspike 文档中读到,可以在我的属性文件中使用 deltaspike_ordinal 随时加载我的属性文件。所以我尝试了,但它似乎忽略了 deltaspike_ordinal=500,并且错误不断出现。

那么,有人知道如何解决这个问题吗?Deltaspike 文档也谈到了 ConfigSource 等,但不是很清楚,也没有例子。

提前致谢!

4

1 回答 1

1

知道了。关键是查看 PropertyFileConfig 的 javadoc:

  1. 通过 java.util.ServiceLoader 机制自动获取 如果您有 EAR 或者您在 CDI 容器启动期间已经需要配置的值,那么您还可以通过 java.util.ServiceLoader 机制注册 PropertyFileConfig。为了不让这个配置被选中两次,需要用 org.apache.deltaspike.core.api.exclude.Exclude 注释你自己的 PropertyFileConfig 实现。

ServiceLoader 机制需要有一个 META-INF/services/org.apache.deltaspike.core.api.config.PropertyFileConfig 文件,其中包含您自己的 PropertyFileConfig 实现类的完全限定类名称。
com.acme.my.own.SomeSpecialPropertyFileConfig 实现将如下所示:

@Exclude
  public class SomeSpecialPropertyFileConfig implements PropertyFileConfig      {
      public String getPropertyFileName() {
          return "myconfig/specialconfig.properties"
      }
      public boolean isOptional() {
          return false;
      }
  }

像魅力一样工作

于 2016-04-22T14:29:19.223 回答