gpt4 book ai didi

java - @Resource 没有设置 javax.ejb.TimerService

转载 作者:行者123 更新时间:2023-11-29 05:37:44 24 4
gpt4 key购买 nike

我在尝试创建计时器时收到 NullPointerException。显然 TimerService 没有设置,但我的问题是,为什么?据我所知,我正在遵循我们应用程序中另一个类使用的确切模式,该模式确实有效。

注意:我是 EJB 的新手,所以解释很有帮助

@Stateless
public class MyClass implements SomeInterface
{
private static final Logger ourLogger = new Logger(MyClass.class);

private volatile Timer timer = null;
private volatile static MyClass instance = null;

@javax.annotation.Resource
TimerService timerService;


@Override
public synchronized void myMethod()
{
resetTimer();
//do other stuff
}


/**
* Creates the timer.
*/
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private synchronized void resetTimer()
{
if (timer != null)
{
timer.cancel();
timer = null;
}
//NullPointerException on next line:
timer = timerService.createTimer(30000, "My Note");
}

public static MyClass getInstance()
{//MDB calls this, then runs instance.myMethod
if (instance == null)
{
instance = new MyClass ();
}

return instance;
}


@Timeout
public synchronized void timeout()
{
//Do some stuff
instance = null;
}

}

最佳答案

您发布的其他代码在使用此代码的错误列表中添加了另一件事(我在对您的问题的第一条评论中开始。)

您正在尝试在 SLSB 中实现单例设计模式。这在很多层面上都是错误的。

如果您需要单例 - 只需使用 @Singleton EJB。如果您按照发布的方式进行操作 - 您基本上不是在实例化 EJB,而是在实例化一些常规的 Java 类。难怪为什么没有发生注入(inject)——容器对您在方法中创建的实例一无所知。

如果您想要一个 EJB - 只需给它一个默认构造函数并通过 @EJB 在您的 MDB 中使用它。然后容器将实例化它并赋予它 EJB 特性(包括所有那些管理生命周期、池化、依赖注入(inject)等)

总而言之,您可以在您发布的代码中找到错误列表:

  • 您在无状态 EJB 中持有一个状态,
  • 您正在pooled-by-specification EJB 中实现单例模式,
  • 您正在同步已经线程安全(也符合规范) EJB,
  • 您正在将 @TransactionAttribute 添加到私有(private)方法;我什至不确定这是否有意义。 @TransactionAttribute 是您正在定义业务方法的标志。同时此方法是私有(private)的,这意味着它不能成为业务接口(interface)的一部分,因此它不是业务方法。

希望对您有所帮助!

关于java - @Resource 没有设置 javax.ejb.TimerService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18880511/

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