Jednoduchý EJB3 klient v JBoss AS

V tomto mini-tutoriálu chci ukázat postup, jak vytvořit jednoduchý session EJB3 bean a klienta k němu jako J2SE aplikaci.

Session Bean

Pomocí vašeho vývojového prostředí založte nový projekt s podporou J2EE a vložte do něj nový session bean, rozhraní a implementace je velmi jednoduchá:

package com.zapletalovi.tests;
 
public interface ExampleTimer {
    void scheduleTimer(long milliseconds);
}

Příklad jsem vzal z vynikajícího repozitáře příkladů z JBosse, který doporučuji zkouknout. Je tam spoustu zajímavých informací a hlavně funkčních příkladů.

Ještě než se pustíme do implementace, je nutné v souboru jmx-console-users.properties v dané doméně (například JBOSS_HOME\server\default\conf\props) nastavit heslo pro uživatele admin, budete jej potřebovat při vytváření runtime JBoss konfigurace v IDE.

package com.zapletalovi.tests;
 
import javax.annotation.Resource;
import javax.ejb.*;
import java.util.Date;
 
@Stateless
@Remote(ExampleTimer.class)
@Local(ExampleTimer.class)
public class ExampleTimerBean implements ExampleTimer {
    private
    @Resource
    SessionContext ctx;
 
    public void scheduleTimer(long milliseconds) {
        ctx.getTimerService().createTimer(new Date(new Date().getTime() + milliseconds), "Hello World");
    }
 
    @Timeout
    public void timeoutHandler(Timer timer) {
        System.out.println("---------------------");
        System.out.println("* Received Timer event: " + timer.getInfo());
        System.out.println("---------------------");
 
        timer.cancel();
    }
}

Pro úspěšné zkompilování je nutné J2EE API a přidání podpory pro AS. Projekt sestavte a dejte si pozor, aby adresáře, které z IDE „vypadnou“ měly „příponu“ .ear respektive .jar (pro J2EE aplikaci a pro EJB). JBoss to vyžaduje, například IntelliJ IDEA adresáře vytváří jako „MyBeanEJB“, pro spuštění pod JBossem potřebujeme „MyBean.EJB“. Druhou možností (například u Netbeans) je deployment archívů, což je malinko pomalejší.

Spusťte JBoss AS a proveďte deployment J2EE aplikace. Nyní naprogramujeme J2SE klienta, vytvořte nový modul nebo projekt:

package cz.zapletalovi.tests;
 
import com.zapletalovi.tests.ExampleTimer;
 
import javax.ejb.EJBAccessException;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Properties;
 
public class ExampleTimerClient {
    public static void main(String[] args) throws Exception {
        Properties env = new Properties();
        env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        env.setProperty(Context.PROVIDER_URL, "jnp://localhost:1099");
        InitialContext ctx = new InitialContext(env);
        ExampleTimer timer = (ExampleTimer) ctx.lookup("ExampleTimerBean/remote");
 
        try {
            System.out.println("Starting timer bean...");
            timer.scheduleTimer(10000); // 10 sekund
            System.out.println("Started...");
        }
        catch (EJBAccessException ex) {
            System.out.println("Saw expected SecurityException: " + ex.getMessage());
        }
    }
}

Aby se projekt spustil, potřebujeme:

Spustíme klienta a je to. Jedná se o jednoduchý session bean s podporou časovače.