2011-03-03 11 views
5

¿Alguien ahora es una forma de obtener el contexto del servidor usando la API incrustable (usando org.glassfish.embeddable.GlassFish, no javax.ejb.embeddable.EJBContainer)? Sería posible si hay una forma de obtener EJBContainer de Glassfish en ejecución, pero no puedo encontrar ni siquiera la lista de servicios disponibles para la búsqueda.Obtención de contexto de un Glassfish incrustado 3.1

Respuesta

1

Aquí hay una solución: podemos obtener InitialContext como un cliente externo. Para obtener la explicación completa, marque EJB_FAQ. De esta manera, al menos, se podrían probar EJB remotos:

Así el ejemplo completo se verá así:

//Start GF 
GlassFishRuntime gfRuntime = GlassFishRuntime.bootstrap(); 
GlassFish gf = gfRuntime.newGlassFish(); 
gf.start(); 
//Deploy application with EJBs 
Deployer deployer = gf.getService(Deployer.class); 
String deployedApp = deployer.deploy(new File(...), "--force=true"); 
//Create InitialContext 
Properties props = new Properties(); 
props.setProperty("java.naming.factory.initial", 
    "com.sun.enterprise.naming.SerialInitContextFactory"); 
props.setProperty("java.naming.factory.url.pkgs", 
    "com.sun.enterprise.naming"); 
props.setProperty("java.naming.factory.state", 
    "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 
props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost"); 
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 
InitialContext ic = new InitialContext(props); 
//Lookup EJBs 
ic.lookup(...) 
//Stop GF 
gf.stop(); 
gfRuntime.shutdown(); 
//CORBA stuck thread, have to kill it manually 
System.exit(0); 

Nota hay un System.exit (0) al final - com.sun.corba.ee. impl.javax.rmi.CORBA.Util.KeepAlive hilo está funcionando incluso después de la parada del servidor de prevenir JVM se detenga ...

0

por lo que yo sé, puede inicializar la clase InitialContext para obtener un contexto, que puede además ser utilizado para realizar la búsqueda. Esto se probó y se encontró que funciona en el contexto de buscar un EJB, implementado en el contenedor incrustado. El EJB no estaba configurado para permitir el acceso a roles específicos, en cuyo caso la clase com.sun.appserv.security.ProgrammaticLogin (no expuesta a través de la API EJB incrustable) podría ayudar; esto no se probó, pero es la forma recomendada de inicializar el Principal para el subproceso que accede a un EJB.

Un ejemplo más o menos completa que va desde Maven y utiliza la dependencia Glassfish incrustado en un POM (no se reproduce aquí, por razones de brevedad) siguiente:

La interfaz EJB:

public interface EchoManager 
{ 
    String echo(String message); 
} 

El bean de sesión:

@Local(EchoManager.class) 
@Stateless 
@EJB(name="java:global/glassfish-ejb-validation/EchoManager",beanInterface=EchoManager.class) 
public class EchoManagerBean implements EchoManager 
{ 

    public String echo(String message) 
    { 
     return message; 
    } 

} 

La prueba de unidad:

public class EchoManagerTest 
{ 

    @Rule 
    public TestName testMethod = new TestName(); 

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

    @Test 
    public void testEchoWithGlassfishRuntime() throws Exception 
    { 
     logger.info("Starting execution of test" + testMethod.getMethodName()); 

     GlassFish glassFish = null; 
     Deployer deployer = null; 
     String appName = null; 
     try 
     { 
      //Setup 
      BootstrapProperties bootstrapProps = new BootstrapProperties(); 
      GlassFishRuntime glassFishRuntime = GlassFishRuntime.bootstrap(bootstrapProps); 

      GlassFishProperties gfProps = new GlassFishProperties(); 

      glassFish = glassFishRuntime.newGlassFish(gfProps); 
      glassFish.start(); 

      deployer = glassFish.getDeployer(); 
      ScatteredArchive archive = new ScatteredArchive("glassfish-ejb-validation", Type.JAR); 
      archive.addClassPath(new File("target", "classes")); 
      archive.addClassPath(new File("target", "test-classes")); 

      appName = deployer.deploy(archive.toURI(), "--force=true"); 

      // Setup the context 
      InitialContext context = new InitialContext(); 

      //Execute (after lookup the EJB from the context) 
      EchoManager manager = (EchoManager) context.lookup("java:global/glassfish-ejb-validation/EchoManager"); 
      String echo = manager.echo("Hello World"); 

      //Verify 
      assertEquals("Hello World", echo); 
     } 
     finally 
     { 
      if(deployer != null && appName != null) 
      { 
       deployer.undeploy(appName); 
      } 
      if(glassFish != null) 
      { 
       glassFish.stop(); 
       glassFish.dispose(); 
      } 
      logger.info("Ending execution of test" + testMethod.getMethodName()); 
     } 
    } 
} 

Tenga en cuenta que el EJB se instala con un nombre JNDI portátil explícita (a través de la @EJB anotación), ya que tengo otras pruebas que utilizan la API de EJB integrable pública en otras pruebas, y es más o menos difícil especificar un nombre de aplicación en tales pruebas; cada ejecución de prueba puede dar como resultado un nombre JNDI diferente para el EJB, por lo que es necesario especificar un nombre JNDI explícito.

Cuestiones relacionadas