我是EJB的新手,我正面临着我的第一个问题。我正在尝试使用无状态EJB中包含的@Schedule方法。我希望这个方法使用一个私有成员变量,该变量将在创建bean时设置:
这是一个简短的例子:
@Singleton
@LocalBean
@Startup
public class Starter {
@PostActivate
private void postActivate() {
ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");
}
}
计划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);
}
}
问题是我的“message”变量在printMsg()方法中打印时始终为null ...实现此目的的最佳方法是什么?
感谢您的帮助!
答案 0 :(得分:10)
你在这里混合了一些东西。
@PostActivate 注释将用于有状态会话Bean(SFSB),并在单例上使用它。我想你的意思是 @PostConstruct 方法,它适用于生命周期由容器管理的每个bean。
您正在使用EJB中的构造函数。 你无法做到:
ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");
因为它只创建了这个类的一个实例。它不是EJB - 容器没有创建它,所以这个类还没有任何EJB性质。 这就是依赖注入的全部内容 - 您只需定义所需内容,容器负责为您提供适当的资源实例。
无状态Bean(SLSB)无意保持状态。 SFSB是。即使你要在一个SLSB方法中设置消息(即在一些ScheduleEJB#setMessage(String)方法中),也要记住 EJB是汇集的。您无法保证下次调用ScheduleEJB上的方法时,您将进入同一个实例。
在你的情况下,只需将@Schedule方法添加到你的单例类就可以了。您可以在@PostConstruct方法中定义您选择的变量。您可以确定每个JVM只有一个Singleton实例,因此您的变量将在同一类的Schedule annotated方法中可见。
HTH。