【问题标题】:EJB stateless - Private members initialisationEJB 无状态 - 私有成员初始化
【发布时间】:2011-12-12 11:14:18
【问题描述】:

我是 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() 方法中打印时始终为空......实现这一点的最佳方法是什么?

感谢您的帮助!

【问题讨论】:

  • 您能解释一下为什么您不使用单个 Singleton EJB 而不是两个类吗?您可以使用 PostConstruct 方法初始化您的变量,并在同一个 Singleton 类中定义您的调度程序。

标签: initialization ejb schedule stateless


【解决方案1】:

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

  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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-20
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多