当我的骆驼服务在jboss保险丝上启动时,它正在读取这样的属性:
import org.apache.camel.PropertyInject;
@PropertyInject("my.value")
private String myValue;
我想在骆驼服务旁边部署一个小型EJB,以便在启动时更新此属性,就像这样:
@Singleton
@Startup
public class PropertyOverrideEjb {
@PostConstruct
public void init() {
// TODO:: update some runtime properties
}
}
到目前为止,我已经尝试在init()方法中做几件事:
final String myVal = System.getProperty("my.value");
System.out.println("#### it is:: " + myVal);
但是sysout显示为null。然后,我尝试使用属性文件名作为标题来读取它,例如:
final String myVal = System.getProperty("property_filename_in_jboss_my.value");
System.out.println("#### it is:: " + myVal);
但是我也看到一个空响应。
然后我看了Camel notes,看到了这个注释块:
自Camel 2.5起可用 可以在运行时使用JVM系统属性来覆盖属性值,而无需重新启动应用程序以获取更改。也可以通过在命令行中创建一个JVM System属性来实现此目的,该属性与其用新值替换的属性同名。
示例:
javaPropertiesComponent pc = context.getComponent(“ properties”,PropertiesComponent.class); pc.setCache(false); System.setProperty(“ cool.end”,“ mock:override”); System.setProperty(“ cool.result”,“ override”); context.addRoutes(new RouteBuilder(){@Override public void configure()抛出异常{from(“ direct:start”)。to(“ properties:cool.end”); from(“ direct:foo”)。to( “ properties:mock:{{cool.result}}”);}}); context.start(); getMockEndpoint(“ mock:override”)。expectedMessageCount(2); template.sendBody(“ direct:start”,“ Hello World”); template.sendBody(“ direct:foo”,“ Hello Foo”); System.clearProperty(“ cool.end”); System.clearProperty(“ cool.result”); assertMockEndpointsSatisfied();
但是,他们提出的解决方案似乎并不完整,因为我不确定如何将CamelContext注入到 not 部分的EJB中。同样可部署。