@ Singleton,@ Startup,@ PostConstruct不适用于EJB3.1和Glassfishv3.0.1

Mar*_*rio 6 java ejb timer glassfish java-ee

我有这个设置的问题,我甚至无法查看日志.

这是我的@Singleton @StartupEJB:

@Singleton
@Startup
@DependsOn("SchedulerEJB")
public class SchedulerStartUp {

    private static Logger log = Logger.getLogger(SchedulerStartUp.class);

    @EJB
    SchedulerEJB schedEJB;  

    @PostConstruct
    public void atStartup() {
       log.info("startUp")
       System.out.println("startUp");

       schedEJB.cancelTimer("EBlastScheduler");
       schedEJB.createTimer("*/1", "*", "*");
    }
}
Run Code Online (Sandbox Code Playgroud)

的SchedulerEJB:

 @Stateless
 public class SchedulerEJB {

    @Resource
    TimerService timerService;         

    public cancelTimer(String timerInfo){/*...*/}

    public createTimer(String sec, String min, String hour) {/*...*/}

    @Timeout
    public void execute(Timer timer) {/*...*/}
 }
Run Code Online (Sandbox Code Playgroud)

Maven pom:

 //Been Using Glassfishv3.0.1 and EJB3.1 with a dependency of:
 <dependency>
     <groupId>javax</groupId>
     <artifactId>javaee-api</artifactId>
     <version>6.0</version>
     <scope>provided</scope>
 </dependency>
Run Code Online (Sandbox Code Playgroud)

Mik*_*unu 6

您有无效的bean类型作为@DependsOn的属性.DependsOn用于表示两个Singleton会话bean之间的依赖关系,而不是Singleton和Stateless之间的依赖关系.您应该将SchedulerEJB更改为Singleton或删除依赖项.

如果您决定将SchedulerEJB更改为Singleton,那么也不需要@DepensOn,因为(来自EJB 3.1规范):

请注意,如果一个Singleton只需要从其PostConstruct方法调用另一个Singleton,则不需要显式的排序元数据.在这种情况下,第一个Singleton只会使用ejb引用来调用目标Singleton.在那里,ejb引用的获取(通过注入或查找)并不一定意味着实际创建相应的Singleton bean实例.

  • 谢谢,现在清楚了!其他人阅读此:“永远不要像我所做的那样导入错误的库,我导入了 com.google.inject.Singleton 而不是 javax.ejb.Singleton”再次感谢! (2认同)