假设我有EJB,它每小时都会执行一些操作。我正在使用jboss ejb @Schedule。另外,此计划仅需要在生产环境中使用,因此我为其添加了一个标志。
@Stateless
public class Remover {
private boolean testMode = false;
@Schedule(hour = "*/1", persistent = false)
protected void init() {
if (testMode) return;
doSomeCode();
}
}
现在,在我的测试中,我创建了一个嵌入式EJB容器,想直接调用doSomeCode(),但是init()也在运行,有时会破坏我的测试。
Map<String, String> props = new HashMap<>();
props.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.LocalInitialContextFactory");
EJBContainer cnt = EJBContainer.createEJBContainer(props);
Context ctx = cnt.getContext();
Remover r = (Remover) ctx.lookup("java:global/RemoveService/Remover");
r.doSomeCode();
因此,问题是,在创建EJBContainer时是否可以更改testMode变量。我发现可以通过在EJBContainer中添加新的道具并在变量中添加@Resource注释来更改它,但是没有运气,也许还需要另一个jndi名称。
props.put("java:comp/env/testMode", "true");
如果还有在测试时禁用@Schedule的方法,它也会有所帮助。
答案 0 :(得分:0)
您可以将服务器配置为使用表达式解析,从而允许您更改值。 http://wildscribe.github.io/WildFly/14.0/subsystem/ee/#attr-annotation-property-replacement
答案 1 :(得分:0)
这是一个部署描述符的示例,您可以在生产环境或开发环境中将变量和调度表达式添加到部署描述符中,并为另一个描述符设置默认值,或者在描述符中执行所有操作