gpt4 book ai didi

initialization - EJB 无状态 - 私有(private)成员初始化

转载 作者:行者123 更新时间:2023-12-03 22:43:00 24 4
gpt4 key购买 nike

我是 EJB 的新手,我遇到了我的第一个问题。我正在尝试使用无状态 EJB 中包含的 @Schedule 方法。我希望此方法使用将在创建 bean 时设置的私有(private)成员变量:

这是一个简短的例子:

@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() 方法中打印时,我的“消息”变量始终为空...实现此目的的最佳方法是什么?

感谢您的帮助!

最佳答案

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

  1. @PostActivate 注释将用于有状态 session Bean (SFSB),您可以在单例上使用它。我猜你指的是 @PostConstruct 方法,它适用于生命周期由容器管理的每个 bean。

  2. 您正在使用 EJB 中的构造函数。 你不能做:

    ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");

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

  3. 无状态 Bean (SLSB) 并非旨在保持状态。SFSB 是。即使您在一个 SLSB 方法(即在某些 ScheduleEJB#setMessage(String) 方法)中设置消息,您也需要记住 EJB 是池化的。您无法保证下次调用 ScheduleEJB 上的方法时会到达同一实例。

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

HTH.

关于initialization - EJB 无状态 - 私有(private)成员初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7847853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com