【问题标题】:@Singleton, @Startup, @PostConstruct doesn't work on EJB3.1 and Glassfishv3.0.1@Singleton、@Startup、@PostConstruct 不适用于 EJB3.1 和 Glassfishv3.0.1
【发布时间】:2012-01-24 02:27:46
【问题描述】:

我的设置有问题,我什至无法查看日志。

这是我的@Singleton@Startup EJB:

@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", "*", "*");
    }
}

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) {/*...*/}
 }

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>

【问题讨论】:

  • 你能调试一下吗?另外,我在使用公共日志时遇到了问题,我最终使用了 slf4j LoggerFactory.getLogger(SchedulerStartUp.class)
  • 日志在部署应用程序时运行良好,似乎只有在这种情况下使用时才会发生:(
  • 遗憾的是没有时间这样做:(,现在想了很多事情......帮助:((
  • 请将“@EJB”受让人更改为接口(带有“@Remote”/“@Local”的接口)而不是 EJB 本身。当依赖项不使用@Singleton 时,请删除“@DependsOn”,谢谢。

标签: java jakarta-ee timer glassfish ejb


【解决方案1】:

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

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

请注意,如果一个 Singleton 只需要调用另一个 Singleton 从它的 PostConstruct 方法来看,没有明确的排序元数据 必需的。在这种情况下,第一个 Singleton 将仅使用 ejb 引用来调用目标单例。在那里,收购 ejb 引用(通过注入或查找)不 必然暗示对应Singleton的实际创建 bean 实例。

【讨论】:

  • 但我需要它是@Stateless,有什么解决方法吗?也许我应该完全删除“@DependsOn”?但是我的“@EJB”会起作用吗? :(
  • '@EJB' 不起作用,有什么方法可以初始化上面名为 'SchedulerEJB' 的 bean?
  • 我没有遇到过这样的情况,我会从单例中调用无状态 bean,但我认为删除 @DependsOn 应该可以工作,假设代码的其他部分没有任何隐藏需要为什么 SchedulerEJB 应该之前被初始化。 Container 应该保证在没有任何添加的情况下,您当前的代码有可用的实例。
  • 谢谢,现在清楚了!其他人读到:“永远不要像我一样导入错误的库,我导入的是 com.google.inject.Singleton 而不是 javax.ejb.Singleton”再次感谢!
  • 我知道这是一个老问题,在 Jboss 7.x 上,我只是使用 @DependsOn 从单例 bean 引用无状态 bean:我认为它不符合 EJB3,但它有效。来源这张票:bugzilla.redhat.com/show_bug.cgi?id=958217
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 2017-01-31
  • 2012-10-19
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
相关资源
最近更新 更多