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

发布于 2024-12-11 17:03:45 字数 880 浏览 0 评论 0原文

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

感谢您的帮助 !

I'm new to EJB and I'm facing my first problem. I'm trying to use an @Schedule method contained in a Stateless EJB. I'd like this method to use a private member variable which would be set at bean creation:

Here's a short example:

@Singleton
@LocalBean
@Startup
public class Starter {

     @PostActivate
     private void postActivate() {

         ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");

     }

}

And the schedule 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);
     }
 }

The problem is that my "message" variable is always null when printed in the printMsg() method... What's the best way to achieve this?

Thanks for your help !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

黑凤梨 2024-12-18 17:03:45

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

  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。

You're mixing few things here.

  1. The @PostActivate annotation is to be used on Stateful Session Beans (SFSB), and you use it on the singleton. I guess that you mean the @PostConstruct method which applies to every bean which lifecycle is managed by the container.

  2. You're using a constructor from your EJB. You cannot do:

    ScheduleEJB scheduleEjb = new ScheduleEJB("Hello");
    

    as it creates just an instance of this class. It's not an EJB - the container didn't create it, so this class does not have any EJB nature yet.
    That's the whole point of dependency injection - you just define what you want and the container is responsible for providing you with an appropriate instance of the resource.

  3. The Stateless Bean (SLSB) is not intented to hold the state. The SFSB is. Even if you would set the message in one SLSB method (i.e. in some ScheduleEJB#setMessage(String) method) than you need to remember that the EJB's are pooled. You don't have any guarantee that the next time you invoke a method on the ScheduleEJB you will get to the same instance.

In your case it would be the easies solution just to add the @Schedule method to your singleton class. Than you can define the variable of your choice in the @PostConstruct method. You can be sure that there is only one Singleton instance per JVM, so your variable will be visible in the Schedule annotated method of the same class.

HTH.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文