EJB无状态 - 私有成员初始化

时间:2011-10-21 10:03:33

标签: initialization ejb schedule stateless

我是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 ...实现此目的的最佳方法是什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:10)

你在这里混合了一些东西。

  1. @PostActivate 注释将用于有状态会话Bean(SFSB),并在单例上使用它。我想你的意思是 @PostConstruct 方法,它适用于生命周期由容器管理的每个bean。

  2. 您正在使用EJB中的构造函数。 你无法做到

    ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");
    

    因为它只创建了这个类的一个实例。它不是EJB - 容器没有创建它,所以这个类还没有任何EJB性质。 这就是依赖注入的全部内容 - 您只需定义所需内容,容器负责为您提供适当的资源实例。

  3. 无状态Bean(SLSB)无意保持状态。 SFSB是。即使你要在一个SLSB方法中设置消息(即在一些ScheduleEJB#setMessage(String)方法中),也要记住 EJB是汇集的。您无法保证下次调用ScheduleEJB上的方法时,您将进入同一个实例。

  4. 在你的情况下,只需将@Schedule方法添加到你的单例类就可以了。您可以在@PostConstruct方法中定义您选择的变量。您可以确定每个JVM只有一个Singleton实例,因此您的变量将在同一类的Schedule annotated方法中可见。

    HTH。