Arquivo

Archive for agosto \05\-03:00 2010

Inicializando EJB bean no WebSphere Application Server Enterprise 6.1

No projeto que trabalho atualmente existe várias tarefas/funcionalidades que necessitam ser agendada de acordo com as necessidades propostas. No entanto tínhamos uma dúvida… Como e quando agendar essas tarefas assim que a aplicação fosse inicializada? No inicio do desenvolvimento optamos por utilizar ServletContextListener, porém encontramos uma maneira mais prática de chamar um Bean assim que a aplicação fossse inicializada, que é o uso do startup beans que é fornecido pelo WebSphere Application Server Enterprise.

A aplicação é relativamente fácil:
-O bean deve ser um session bean EJB 2.0 com uma interface remota. Onde a interface home deve ser com.ibm.websphere.startupservice.AppStartUpHome.
-A interface do bean remoto deve ser ou extender com.ibm.websphere.startupservice.AppStartUp.
-Os métodos start() e stop() na interface AppStartUp podem ter qualquer atributo de transação exceto TX_MANDATORY.

Um exemplo de como ficaria a configuração do bean de inicialização no ejb-jar.xml do projeto:

<session id="Session_WASStartupBeanPos"></pre>
  <description><![CDATA[]]></description>
  <display-name>WASStartupBeanPos</display-name>
  <ejb-name>WASStartupBeanPos</ejb-name>

    <home>com.ibm.websphere.startupservice.AppStartUpHome</home>
    <remote>com.ibm.websphere.startupservice.AppStartUp</remote>
    <local-home>StartupBeanPosLocalHome</local-home>
    <local>WASStartupBeanPosLocal</local>
    <ejb-class>WASStartupBeanPos</ejb-class>

  <session-type>Stateless</session-type>
  <transaction-type>Container</transaction-type>
</session>

agora suas interfaces e implementações :

public interface WASStartupBeanPosLocal extends javax.ejb.EJBLocalObject {

}
public interface WASStartupBeanPosLocalHome extends javax.ejb.EJBLocalHome
{
   public static final String COMP_NAME="java:comp/env/ejb/WASStartupBeanPosLocal";
   public static final String JNDI_NAME="app/LocalWASStartupBeanPos";

   public WASStartupBeanPosLocal create() throws javax.ejb.CreateException;
}
public class WASStartupBeanPos extends BaseSessionBean implements SessionBean {

private static final Logger logger = Logger.getLogger(WASStartupBeanPos.class.getName());

public void ejbCreate() throws EJBException, RemoteException {
}

public boolean start() {
   logger.logp(Level.FINER, this.getClass().getName(), "start", "starting...");

   // aqui vai o código de inicialização

   logger.logp(Level.FINER, this.getClass().getName(), "start", "started.");
   return true;
}

public void stop() {
   logger.logp(Level.FINER, this.getClass().getName(), "stop", "stoping...");

   logger.logp(Level.FINER, this.getClass().getName(), "stop", "stoped.");
}

}

Após estes passos acima devemos apenas configurar o WebSphere para que ele aceite um o nosso bean de inicialização. Por default essa opção vem desebilitada, mas podemos abilita-la em: Application servers > server1 > Container Services  >Startup beans service ,veja a imagem abaixo: