老实说,我在这里遗漏了一些东西。我不知道如何创建 TimerService 对象的实例。它始终为空。我没有构造函数,因为它是一个接口(interface)。我不能使用创建方法。 @Resource 似乎没有给它分配任何东西。
我正在尝试设置一个简单的编程计时器,它每 X 分钟执行一次任务。超时持续时间可能因配置而异,配置可能会在整个运行时发生变化。我正在使用 WebLogic 12 Web 应用程序。
我目前拥有的:
import javax.annotation.Resource;
import javax.ejb.Singleton;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
@Singleton
public class TimerBean {
@Resource
protected TimerService timerService;
public TimerBean(){
System.out.println("TimerBean constructor " + timerService);
}
@Timeout
public void timeoutHandler(Timer timer){
String name = timer.getInfo().toString();
System.out.println("Timer ticked. Name=" + name);
}
public void startOrModifyTimer(long initialExpiration, long interval, String name) {
System.out.println("Start or modify " + timerService);
}
}
这个输出:
TimerBean constructor null
& 然后在服务器运行后,如果我调用启动或修改:
Start or modify null
编辑:
我通过制作 TimerBean @Singleton
& @Startup
并用 @PostConstruct
方法替换构造函数来让它工作。
然而,当我尝试使用它的方法时,它有一个实例化的 TimerService
对象,它给我 java.lang.IllegalArgumentException: Unknown bean state 0
其中有没有信息...
最佳答案
如果您正在尝试使用字段注入(inject),您将依赖框架在对象已经被实例化并设置字段后出现,因此它总是在构造函数。您可以在 @PostConstruct
方法中执行您需要的任何逻辑,或者,我强烈建议将 TimerService
作为构造函数参数而不是直接注入(inject)字段。
关于java - 定时器服务空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28880424/