2

我是 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);
     }
 }

问题是我的“消息”变量在 printMsg() 方法中打印时始终为空......实现这一目标的最佳方法是什么?

谢谢你的帮助 !

4

1 回答 1

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 上的方法时会到达同一个实例。

在您的情况下,将 @Schedule 方法添加到您的单例类中将是最简单的解决方案。您可以在 @PostConstruct 方法中定义您选择的变量。您可以确定每个 JVM 只有一个 Singleton 实例,因此您的变量将在同一个类的 Schedule 注释方法中可见。

HTH。

于 2011-10-21T14:15:48.690 回答