Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Executing task after deployment of Java EE application

I have a Java EE application which should start a synchronization process with an external system once after its deployment.

How could I implement this requirement?

like image 568
Oliver Avatar asked Aug 16 '13 13:08

Oliver


People also ask

How are Java applications deployed?

To deploy your Java Web Start application, first compile the source code, package it as a JAR file, and sign the JAR file. Java Web Start applications are launched by using the Java Network Launch Protocol (JNLP). Hence, you must create a JNLP file to deploy your application.

What can Java EE do?

The Java EE platform is built on top of the Java SE platform. The Java EE platform provides an API and runtime environment for developing and running large-scale, multi-tiered, scalable, reliable, and secure network applications.

What is the deployment descriptor for enterprise application on Java EE platform?

A Java EE deployment descriptor is defined by a Java EE specification and can be used to configure deployment settings on any Java EE-compliant implementation. A runtime deployment descriptor is used to configure Java EE implementation-specific parameters.


2 Answers

Below are listed a couple of popular methods for getting lifecycle callbacks in JavaEE apps.

Create a javax.servlet.ServletContextListener implementation

If you have a web component to your .ear file (embedded .war) or your deployment is a .war by itself you can add a ServletContextListener to your web.xml and get a callback when the server starts or is shutting down.

Example:

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

}

and then add this configuration to your web.xml deployment descriptor.
$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>

Create an EJB 3.1 @Startup Bean

This method uses an EJB 3.1 singleton to get a startup and shutdown callback from the server.

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 */
  }

}
like image 113
Dev Avatar answered Oct 13 '22 00:10

Dev


I tested the suggested solution which uses the @Startup and @PostConstruct annotations. It turned out that Glassfish does not complete the deployment of an application until all methods annotated with @PostConstruct have finished. So in my case the deployment would take from several minutes up to an hour.

But I figured out a different way to achive what I want. The best solution seems to be a timer callback method which cancels its timer after its execution.

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

       timer.cancel();
    }
 }

Using a non-persistent timer allows the timer to be re-created if the application server is restarted.

like image 32
Oliver Avatar answered Oct 12 '22 22:10

Oliver