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: