簡體   English   中英

部署Java EE應用程序后執行任務

[英]Executing task after deployment of Java EE application

我有一個Java EE應用程序,它應該在部署后與外部系統一起啟動同步過程。

我怎么能實現這個要求?

下面列出了幾種在JavaEE應用程序中獲取生命周期回調的流行方法。

創建一個javax.servlet.ServletContextListener實現

如果你有一個Web組件添加到您的.ear文件(嵌入式的.war)或您的部署是一個.war本身可以將添加ServletContextListener到你web.xml ,並在服務器啟動或關閉得到一個回調。

例:

package com.stackoverflow.question

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;

public class MyServletContextListener implements ServletContextListener{

   @Override
   public void contextInitialized(ServletContextEvent contextEvent) {
        /* Do Startup stuff. */
   }

   @Override
   public void contextDestroyed(ServletContextEvent contextEvent) {
        /* Do Shutdown stuff. */
   }

}

然后將此配置添加到web.xml部署描述符。
$WAR_ROOT/WEB-INF/web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee">

    <listener>
      <listener-class>com.stackoverflow.question.MyServletContextListener</listener-class>
    </listener>

</web-app>

創建EJB 3.1 @Startup Bean

此方法使用EJB 3.1單例從服務器獲取啟動和關閉回調。

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Startup;
import javax.ejb.Singleton;

@Singleton
@Startup
public class LifecycleBean {

  @PostConstruct
  public void init() {
    /* Startup stuff here. */
  }

  @PreDestroy
  public void destroy() {
    /* Shutdown stuff here */
  }

}

我測試了使用@Startup@PostConstruct注釋的建議解決方案。 事實證明,在使用@PostConstruct注釋的所有方法完成之前,Glassfish不會完成應用程序的部署。 所以在我的情況下,部署需要幾分鍾到一個小時。

但我想出了一種不同的方式來實現我想要的東西。 最好的解決方案似乎是一個定時器回調方法,它在執行后取消它的定時器。

@Stateless
public class SynchronisationService {
    @Schedule(hour = "*", minute = "*", persistent = false)
    protected void init(Timer timer)
    {
       doTheSync();

       timer.cancel();
    }
 }

如果重新啟動應用程序服務器,則使用非持久性計時器可以重新創建計時器。

您可以使用@Startup@PostConstruct注釋在應用程序啟動時執行任務。

例如,使用ServletContextListener或在啟動時初始化的servlet。 當然,如果您在群集中多次部署應用程序,並且只希望此過程運行一次,則會變得更加困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM