2015-06-03 30 views
1

我的目標是設置一個在啓動時開始運行的預定作業。在EJB 3.0上模擬@Startup(WebLogic 11gR1)

在EJB 3.1,我可以這樣做:

@Startup 
@Stateless 
public class SchedulePoller { 

    @Resource 
    TimerService timerService; 

    @PostConstruct 
    public void defineScheduler() { 
     timerService.createTimer(60000, 60000, null); 
    } 

    @Timeout 
    public void checkSchedule(Timer timer) { 
     System.out.println("time: " + new Date()); 
    } 
} 

現在我的問題是,@Startup不可用在EJB 3.0,這是支持的WebLogic 11gR1中(10.3.5)的最新版本。這意味着Bean沒有構建,因此不會調用defineScheduler方法。

我已閱讀,一個可能的解決方案是定義一個HttpServlet,注射用豆我,覆蓋init方法和web.xml文件放在<load-on-startup>。 我不能使用這個方法,因爲我的項目是一個EJB模塊,我沒有web上下文。

到目前爲止我唯一想到的其他解決方案是將Bean更改爲@MessageDriven,並在啓動後在隊列中放置消息,但這需要在每次部署時採取額外的操作。

有什麼方法可以複製@Startup註釋?最佳選擇是在啓動時自動啓動Bean,但我也可以考慮將腳本添加到StartWebLogic.cmd或任何其他「自動」方式。

謝謝。

回答

2

不,EJB 3.0沒有其他選擇。你說你的項目是一個EJB模塊,但我的建議仍然是創建另一個WAR模塊來驅動你的啓動。我會使用一個ServletContextListener而不是一個load-on-startup servlet,因爲你實際上並不想在WAR中擁有一個端點,你只是想(b)將它用於應用程序啓動通知。

1

我不得不創建一個擴展名爲「動態Web模塊」的另一個項目,只是爲了這個信息編輯web.xml

<listener> 
    <listener-class>it.project.scheduler.InitServletContainer</listener-class> 
</listener> 

在我現有的項目,我添加偵聽implentation

public class InitServletContainer implements ServletContextListener { 

    @EJB 
    private transient SchedulePollerLocal schedulerBean; 

    @Override 
    public void contextInitialized(ServletContextEvent arg0) { 
     schedulerBean.defineScheduler(); 
    } 

} 

最後,我不得不將這個項目添加到EAR