¿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
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 ...
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.
- 1. Glassfish 3.1 CREDENTIAL_ERROR en Eclipse
- 2. Error de Netbeans con glassfish server 3.1?
- 3. Deshabilitar todas las planificaciones en Glassfish 3.1
- 4. ¿Qué son los inicializadores de dominio GlassFish 3.1.x?
- 5. Glassfish 3.1 principal predeterminado para la asignación de roles
- 6. Deshabilitar Temporizador EJB (GlassFish 3.1, Java EE 6)
- 7. Obtención de fuentes para trabajar en Rails 3.1?
- 8. ¿Cómo despliega un WAR que está dentro de un EAR como el contexto raíz (/) en Glassfish?
- 9. Glassfish 3.1: No se puede encontrar en 'Ver punto final' después de implementar un servicio web
- 10. GlassFish 3.1, ¿cómo implementar un EAR con WAR en la raíz del servidor?
- 11. Cómo notificar a todos (el mismo) beans Singleton en un cluster Glassfish 3.1?
- 12. ¿Cómo se configura el reino de archivos de seguridad glassfish 3.1 usando Netbeans 7.1?
- 13. GlassFish en Eclipse se queja "GlassFish v3 requiere un JDK 1.6 y no un JRE"
- 14. Glassfish 3 tiene dos configuraciones
- 15. ¿Cómo integrar OpenID en GlassFish?
- 16. Seleccionar un idioma incrustado
- 17. ¿Hay alguna manera de establecer parámetros de contexto programáticamente en embarcadero incrustado?
- 18. Problema de espacio PermGen con Glassfish/Hibernate
- 19. Obtención de una instancia dentro de un módulo de Guice
- 20. GlassFish v3 y glassfish-maven-plugin (Mac)
- 21. alojar una aplicación en glassfish
- 22. ¿Cómo puedo combinar @Asynchronous y Weld/CDI Events y @Observes (durante = TransactionPhase.AFTER_COMPLETION) en Glassfish 3.1
- 23. Obtención de un seguimiento de pila de SBT con Scala
- 24. Ruta a un archivo de recursos incrustado
- 25. Impresión silenciosa de un PDF incrustado
- 26. agarre variable global de un iframe incrustado
- 27. Glassfish Logging
- 28. ¿Cómo actualizar un documento incrustado dentro de un documento incrustado en mangosta?
- 29. Obtención de un estado de objeto
- 30. Obtención de texto de un QListView