No hace mucho desde el momento de escribir esta entrada empezé a pelearme con los EJB's. Para esto el buen Gus me mostró como hacer una poderosa Calculadora que exponía un método remoto suma, el cual, después de ser montado en Weblogic Server 8.1, podía ser invocado en un cliente Java remoto mediante los stubs del EJB y el contexto inicial de Weblogic proporcionado por BEA.
Cuando quize repetir el experimento en Geronimo 2.0 para conocer la especificacion EJB3, segui un procedimiento semejante para montar un EJB Calculadora en éste application server.
Genere un proyecto EAR en eclipse y un EJB Module asociado al EAR
Posteriormente definí la interfaces remota y local que exponen el método suma
package test.ejb3;
import javax.ejb.Remote;
@Remote
public interface CalculadoraRemote {
int suma(int a,int b);
}
package test.ejb3;
import javax.ejb.Local;
@Local
public interface CalculadoraLocal {
int suma(int a,int b);
}
Escribí un POJO que definía la implementacion del metodo con las Anotaciones Java adecuadas para el EJB, en este caso @Stateless para indicar que es un EJB de sesion sin estado.
package test.ejb3;
import javax.ejb.Stateless;
@Stateless(name="Calculadora")
public class CalculadoraBean implements CalculadoraLocal,CalculadoraRemote{
@Override
public int suma(int a, int b) {
return a+b;
}
}
Una vez hecho esto simplemente generé el EAR con el EJB, el cual pude montar sin problemas sobre el Geronimo.
Lo siguiente era hacer un cliente Java para probar el EJB. Al igual que el cliente utilizado para el EJB sobre weblogic, lo primero es construir el contexto JNDI inical, pero en este caso tendría que hacerse con un contexto de Open EJB, el cual es el proveedor de servicios EJB utilizado por gerónimo.
Una vez obtenido el contexto JNDI lo siguiente era obtener una referencia remota de la interfaz del EJB mediante su nombre JNDI asociado al EJB, es aqui donde empezaron los problemas debido a que el manejo de nombre JNDI mostrados la documentación es un poco extraña. De hecho después de mucho buscar en google, hacer pruebas y decir muchas maldiciones llegué a lo siguiente.
Para obtener la referencia remota se especifica el nombre JNDI de la siguiente forma
archivo_EJBJar.jar/ejbName/fullQualifiedName_interfaceRemote
Donde archivo_EJBJar.jar Es el nombre del archivo de modulo EJB dentro del EAR (lo que se me hizo una mamada).
ejbName Es el nombre asociado al EJB, este se puede definir en la anotacion @Stateless con el atributo name, o bien en el archivo ejb-jar.xml y openejb-jar.xml para el caso de la especificación 2.0 y anteriores de EJB.
fullQualifiedName_interfaceRemote Que es el nombre de la interface remota, incluyendo los paquetes.
Con lo que el cliente Java quedó de la siguiente manera, utilizando una clase de prueba de JUnit 4.0.
package test.test.ejb3;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.junit.Before;
import org.junit.Test;
import test.ejb3.CalculadoraRemote;
public class CalculadoraTest {
private InitialContext context;
@Before
public void setUp() throws Exception {
Properties properties = new Properties();
properties.put("java.naming.factory.initial",
"org.openejb.client.RemoteInitialContextFactory");
properties.put("java.naming.provider.url", "127.0.0.1:4201");
context = new InitialContext(properties);
}
@Test
public void testSuma() {
try {
Object calculadora = context.lookup(
"CalculadoraEJB3.jar/Calculadora/test.ejb3.CalculadoraRemote");
assertNotNull(calculadora);
assertTrue(calculadora instanceof CalculadoraRemote);
CalculadoraRemote calculadoraRemote = (CalculadoraRemote) calculadora;
assertEquals(5, calculadoraRemote.suma(2, 3));
} catch (NamingException e) {
e.printStackTrace();
fail(e.getMessage());
}
}
}
Algo curioso que me pasó es que cuando intenté realizar esto sin incluir al módulo EJB dentro del EAR, el formato del nombre anteriormente señalado no funcionó, quizá por que se requiera un formato diferente para el nombre JNDI, el dato no lo he encontrado, pero al menos será posible invocar al EJB remotamente con el procedimiento anterior.
¿Por que hacer este blog en vez de hechar la hueva?
La intención de este blog es compartir con la comunidad algunos problemas con los que me he topado cuando me ha tocado realizar algún proyecto o alguna misión especial asi como la forma en que lo solucioné. Asi mismo me gustaría compartir la preferencia que tengo por el Metal y la música oscura y uno que otro tema que mis colaboradores(as) quieran aportar
Suscribirse a:
Enviar comentarios (Atom)
1 comentario:
Ese don todo metalero y javajero jajaja.
Publicar un comentario