Meh*_*hdi 2 schedule ejb initialization stateless
我是EJB的新手,我正面临着我的第一个问题.我正在尝试使用无状态EJB中包含的@Schedule方法.我希望这个方法使用一个私有成员变量,该变量将在创建bean时设置:
这是一个简短的例子:
@Singleton
@LocalBean
@Startup
public class Starter {
@PostActivate
private void postActivate() {
ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");
}
}
Run Code Online (Sandbox Code Playgroud)
和计划bean:
@Stateless
@LocalBean
public class ScheduleEJB {
private String message;
public ScheduleEJB() {
super();
}
public ScheduleEJB(String message) {
super();
this.message= message;
}
@Schedule(second="*/3", minute="*", hour="*", dayOfMonth="*", dayOfWeek="*", month="*", year="*")
private void printMsg() {
System.out.println("MESSAGE : " + message);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是我的"message"变量在printMsg()方法中打印时始终为null ...实现此目的的最佳方法是什么?
谢谢你的帮助 !
Pio*_*cki 10
你在这里混合了一些东西.
该@PostActivate注释是要在有状态会话Bean(SFSB)使用,你使用它的单.我想你的意思是@PostConstruct方法适用于生命周期由容器管理的每个bean.
您正在使用EJB中的构造函数.你做不到:
ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");
Run Code Online (Sandbox Code Playgroud)
因为它只创建了这个类的一个实例.它不是EJB - 容器没有创建它,所以这个类还没有任何EJB性质.这就是依赖注入的全部要点 - 您只需定义所需内容,容器负责为您提供适当的资源实例.
Stateless Bean(SLSB)并不打算持有该州.SFSB是.即使你要在一个SLSB方法中设置消息(即在一些ScheduleEJB #setMessage(String)方法中),也需要记住EJB是合并的.您无法保证下次调用ScheduleEJB上的方法时,您将进入同一个实例.
在你的情况下,只需将@Schedule方法添加到你的单例类就可以了.您可以在@PostConstruct方法中定义您选择的变量.您可以确定每个JVM只有一个Singleton实例,因此您的变量将在同一类的Schedule annotated方法中可见.
HTH.