2017-07-29 42 views
0

我有一个包含war的应用程序 - 一个servlet和ejb。在EJB中的预定计时器良好实践模式和EE应用程序的纯CDI

我只需要ejb为@ javax.ejb.Schedule。应该每分钟运行一次,它所要做的就是发射一个将被战争应用拦截的CDI事件。

事实证明,这不起作用,显然,只有当类共享相同的类加载器时,CDI事件才会连接。 EJB和WAR是不同的包 - 不同的类加载器。

所以我想出了这个模式(在它的最基本的形式):

@javax.enterprise.context.ApplicationScoped 
public class TimerMockUp { 

@Resource(mappedName="java:jboss/ee/concurrency/executor/cacheService") Executor ex; 
@Inject Event<SomeEvent> evt; 

@PostConstruct 
private void initTimer(){ 
    ex.execute(()->{ 
     try{ 
      while(true){ 
       evt.fire(new SomeEvent()); 
       Thread.sleep(4000); 
      } 
     } catch (Exception ex){ 

     } 
    }); 
} 

什么是您对此有何看法?你认为这在长期内会是可靠的吗?还有什么其他的选择来实现同样的目标?

+0

只是因为我有兴趣为纯EJB-3.X人。我想这是一个ejb-3.x应用程序。为什么你需要部署一个耳朵,不能把所有东西都放入战争? – aschoerk

+0

最初的意图是只有WAR,但是对于Timer的需求则来自...... EJB领域。但随后发生了与CDI事件的混战。 – hrs

+1

你知道吗,你可以把你的EJB放到WAR中,或者你在使用2.x版本吗?请参阅:https://docs.oracle.com/cd/E19798-01/821-1841/gippi/index.html – aschoerk

回答

0

不确定您的注入事件的要求是什么,但运行增量计时器的标准方法是使用带有@Schedule注释的EJB计时器。

例如:

@Singleton 
@Startup 
public class TimerBean { 

    @Schedule(hour = "*", minute = "*", second = "*/5", persistent = false) 
    public void doEvery5Sec() { 
     // do something... 
    } 
} 
+0

是的,那是真的。但是这个EJB无法将CDI事件发送给另一个模块中的Observer,这正是我所需要的。 – hrs

相关问题