Tutorial
Servidor de aplicaciones Jboss EAP 6.3.0
Mario Humberto Tiburcio Zúñiga
2015
Red Hat Jboss
Enterprise Application Platform
JBoss es un servidor de aplicaciones Java EE de código abierto implementado en Java puro. Al estar basado en Java, JBoss puede ser utilizado en cualquier sistema operativo para el que esté disponible la máquina virtual de Java. JBoss Inc., empresa fundada por Marc Fleury y que desarrolló inicialmente JBoss, fue adquirida por
Red Haten abril del 2006.
El proyecto se nutre de una red mundial de colaboradores. Los ingresos de la empresa están basados en un modelo de negocio de servicios. JBoss implementa todo el paquete de servicios de JEE [
Referencia Wikipedia].
En este pequeño tutorial se explica el procedimiento de instalación de Jboss en Ubuntu, incoporando algunas pautas para su configuración así como los códigos fuentes de ejemplos de programación de EJB Stateless, EJB Stateful y WebServices.
También se incorporan ejemplos de programas cliente en Java y Android que
consumen componentes EJB y WebServices montados en el servidor.
Instalación del servidor de aplicaciones Jboss EAP 6.3.0
1. Descargue el archivo jboss-eap-6.3.0.zip (http://jbossas.jboss.org/downloads) y desde terminal cópielo como root a un directorio de trabajo:
cp jboss-eap-6.3.0.zip /root/trabajo
2. Cámbiese al directorio de trabajo y descomprima el jboss-eap-6.3.0.zip:
cd /root/trabajo unzip jboss-eap-6.3.0.zip
Nota: Verifique que aparezca el directorio jboss-eap-6.3 3. Mueva el directorio jboss-eap-6.3 al directorio /usr/local:
mv jboss-eap-6.3 /usr/local
4. Modifique el archivo /etc/profile agregando la variable de ambiente JBOSS_HOME como se indica a continuación:
export JBOSS_HOME=/usr/local/jboss
4. Cámbiese al directorio /usr/local y cree un enlace simbólico de nombre jboss que apunte al directorio jboss-eap-6.3:
cd /usr/local
ln -s /usr/local/jboss-eap-6.3 /usr/local/jboss
5. Modifique el archivo de configuración standalone.xml para cambiar el puerto de escucha por defecto del JBoss:
Para editar el archivo teclee:
nano /usr/local/jboss-eap-6.3/standalone/configuration/standalone.xml
Modifique en el archivo la línea siguiente (el puerto por defecto es 8080):
<socket-binding name="http" port="8080"/>
De manera que quede por ejemplo así (el nuevo puerto es 8888):
<socket-binding name="http" port="8888"/>
Modifique también la dirección local 127.0.0.1 sustituyéndola por la IP o el nombre de la máquina donde se está instalando el Jboss.
6. Reinicie sesión y desde terminal con privilegios de root inicie el servicio Jboss con la orden siguiente:
$JBOSS_HOME/bin/standalone.sh
El servicio se habrá iniciado satisfactoriamente si aparece en la terminal un mensaje similar al siguiente:
22:26:31,125 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: JBoss EAP 6.3.0.GA (AS 7.4.0.Final-redhat-19) inició en 6605ms - Inició 151 de 189 servicios (56 servicios son perezosos, pasivos o por demanda)
Nota: Cuando se requiere parar el servicio de Jboss, sólo pulse CTRL-C en la terminal donde fue invocado.
7. Tecleé en un navegador el URL http://ipservidor:8888 y observe si se despliega una página similar a la siguiente:
8. Si se trata de acceder a Administration Console, será necesario crear una cuenta de administrador y una cuenta de usuario de la aplicación.
Para esto ejecute en terminal con privilegios de root el comando:
$JBOSS_HOME/bin/add-user.sh Deberá verse algo similar a lo siguiente:
¿Qué tipo de usuario desea agregar?
a) Usuario de administración (mgmt-users.properties) b) Usuario de la aplicación (application-users.properties) (a):
Nota: Debe escribir “a” para una cuenta de administrador o una “b” para una cuenta de usuario de la aplicación. Después sólo debe contestar adecuadamente a las preguntas que se le soliciten hasta que las cuentas se hayan creado.
9. Trate ahora de ingresar como administrador a la Consola de Administración del Jboss dando clic en el enlace Administration Console en la página de inicio mostrada en el paso 7. Tecleé el nombre de usuario y contraseña que se le soliciten. Si todo es correcto, se mostrará un despliegue similar al siguiente:
Pasos para hacer el deploy (montaje) de los EJB Stateless, EJB Stateful y WebServices en el servidor
de aplicaciones JBoss
1. Para compilar los componentes y clientes cuyo código se proporciona en este tutorial, asegúrese de incluir en la variable de ambiente CLASSPATH, las librerías indicadas en cada caso.
2. Cree un directorio de trabajo y copie ahí los códigos Java proporcionados y compílelos para obtener archivos class:
cd path_directorio_de_trabajo javac *.java
Nota importante:
Verifique que se hayan generado los archivos class.
3. Cree una carpeta con el nombre del package y copie ahí los archivos class:
mkdir nombre_package cp *.class nombre_package
4. Genere un archivo jar que contenga la estructura del directorio nombre_package con sus archivos “class”:
jar -cf archivo.jar nombre_package
5. Para hacer el deploy del componente o componentes incluidos en el archivo.jar, es necesario copiarlo al directorio correcto en el servidor de aplicaciones Jboss como se indica a
continuación:
cp archivo.jar $JBOSS_HOME/standalone/deployments
6. Si el deploy se realiza correctamente, esto se verificará en la terminal donde se arrancó el servidor Jboss. Tambien es posible hacer la verificación en la Consola de Administración del Jboss vía Web:
[Administration console]
|___ [Home]
|___ [>Create deployment]
Nota importante:
Los archivos con las librerías necesarias para realizar la compilación de los archivos Java, se pueden encontrar en el directorio de instalación de Jboss en la carpeta modules.
Códigos fuente
Ejemplo Enterprise Java Bean Stateless
Librerías para compilar:
jboss-ejb-api_3.1_spec-1.0.2.Final-redhat-2.jar
Archivo: CalculatorBean.java
package calculator;
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote(RemoteCalculator.class)
public class CalculatorBean implements RemoteCalculator { @Override
public int add(int a, int b) { return a + b;
}
@Override
public int subtract(int a, int b) { return a - b;
}
@Override
public int multiply(int a, int b) { return a * b;
} }
Archivo: RemoteCalculator.java package calculator;
import javax.ejb.Remote;
public interface RemoteCalculator { int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
}
Ejemplo Enterprise Java Bean Stateful
Librerías para compilar:
jboss-ejb-api_3.1_spec-1.0.2.Final-redhat-2.jar
Archivo: CirculoBean.java package figuras;
import javax.ejb.Remote;
import javax.ejb.Stateful;
@Stateful
@Remote(CirculoRemote.class) public class CirculoBean{
private double radio;
public void setRadio(double valor){
radio=valor;
}
public double getRadio(){
return radio;
}
public double area() {
return 3.1416*radio*radio;
}
public double perimetro() { return 2*3.1416*radio;
} }
Archivo: CirculoRemote package figuras;
import javax.ejb.Remote;
public interface CirculoRemote { void setRadio(double valor);
double getRadio();
double area();
double perimetro();
}
Ejemplo de Webservice basado en un EJB
Librerías para compilar:
jboss-jaxws-api_2.2_spec-2.0.2.Final-redhat-1.jar jboss-ejb-api_3.1_spec-1.0.2.Final-redhat-2.jar
Archivo: Calculator.java
package calculadoras;
import javax.jws.WebService;
import javax.jws.WebMethod;
import java.rmi.Remote;
import java.rmi.RemoteException;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style=Style.RPC)
public interface Calculator extends Remote {
@WebMethod int add(int x, int y);
@WebMethod int subtract(int x, int y);
@WebMethod int multiply(int x, int y);
@WebMethod int module(int x, int y);
@WebMethod int divide(int x, int y);
}
Archivo: CalculatorBean.java
package calculadoras;
import javax.ejb.Stateless;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@Stateless
@WebService(endpointInterface="calculadoras.Calculator") public class CalculatorBean
{
public int add(int x, int y) {
return x + y;
}
public int subtract(int x, int y) {
return x - y;
}
public int multiply(int x, int y) {
return x * y;
}
public int module(int x, int y) {
return x % y;
}
public int divide(int x, int y) {
return x / y;
} }
Ejemplo cliente Java de un Webservice
Librerías para compilar:
jboss-jaxrpc-api_1.1_spec-1.0.1.Final-redhat-3.jar y el jar con la interfaz “calculadoras.calculator”
Archivo: clienteCalculator.java import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.URL;
class clientCalculator {
public static void main(String args[ ]) throws Exception {
URL url = new URL("http://192.168.1.230:8888/ws003/CalculatorBean?wsdl");
// Qualified name of the service:
// 1st arg is the service URI
// 2nd is the service name published in the WSDL
QName qname = new QName("http://calculadoras/", "CalculatorBeanService");
System.out.println("QName");
// Create, in effect, a factory for the service.
Service service = Service.create(url, qname);
System.out.println("QName");
// Extract the endpoint interface, the service "port".
calculadoras.Calculator eif = service.getPort(calculadoras.Calculator.class);
System.out.println(eif.add(11,6));
System.out.println(eif.subtract(11,6));
System.out.println(eif.multiply(11,6));
System.out.println(eif.module(25,6));
} }
Ejemplo de cliente Java para EJB stateful
Librerías para compilar:
jboss-client.jar y el jar de la interfaz “figuras.CirculoRemote”
import java.io.*;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;
import figuras.CirculoRemote;
public class ClienteEJB3V2Stateful {
public static void main(String arg[]) {
System.out.println ("Yo soy un Cliente de un EJB3 Stateful");
final Hashtable jndiProperties=new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
try{
final Context ctx = new InitialContext(jndiProperties);
CirculoRemote frijol = (CirculoRemote) ctx.lookup("ejb:/ff//CirculoBean!
figuras.CirculoRemote?stateful");
System.out.println("lookup hecho ...<br>");
for(double r=1;r<=5;r+=0.5) {
frijol.setRadio(r);
System.out.print(String.format("| Radio: %6.2f ",r));
System.out.print(String.format("%11s %10.3f ","| Perimetro:",frijol.perimetro()));
System.out.println(String.format("%11s %10.3f |","| Area:",frijol.area()));
} ctx.close();
}
catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
} // service } // class
Ejemplo de cliente Java para EJB stateless
Librerías para compilar:
jboss-client.jar y el jar de la interfaz “calculator.RemoteCalculator”
import java.io.*;
import java.util.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.util.Properties;
import calculator.RemoteCalculator;
public class ClienteEJB3V2 {
public static void main(String arg[]) {
System.out.println ("Yo soy un cliente de un EJB3 Stateless");
final Hashtable jndiProperties=new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
try{
final Context ctx = new InitialContext(jndiProperties);
RemoteCalculator frijol = (RemoteCalculator) ctx.lookup("ejb:/calc//CalculatorBean!
calculator.RemoteCalculator");
System.out.println("Sumar :"+frijol.add(100,50));
System.out.println("Multiplicar:"+frijol.multiply(100,50));
System.out.println("Listo !!");
ctx.close();
}
catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
} // service } // class
Nota importante:
El archivo jboss-ejb-client.properties es requerido para ejecutar al cliente de EJB Stateful y Stateless) remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
remote.connections=default
remote.connection.default.host=192.168.1.230 remote.connection.default.port=4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connection.default.username=humberto
remote.connection.default.password=alfabeta123.
Cliente de Webservice desde Android
Librería para compilar:
ksoap2-android-assembly-2.5.8-jar-with-dependencies
package com.example.ejemplows001;
import android.widget.TextView;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.serialization.PropertyInfo;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
private static final String NAMESPACE = "http://calculadoras/";
private static String URL = "http://192.168.1.230:8888/ws006/CalculatorBean?wsdl";
private static final String METHOD_NAME1 = "subtract";
private static final String METHOD_NAME2 = "add";
private static final String METHOD_NAME3 = "multiply";
private static final String METHOD_NAME4 = "module";
private static final String METHOD_NAME5 = "divide";
private static final String SOAP_ACTION = "";
private TextView lblResult;
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lblResult = (TextView) findViewById(R.id.textView1);
lblResult.setText("WebService: \n"+URL+"\n\n");
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);
SoapObject request2 = new SoapObject(NAMESPACE, METHOD_NAME2);
SoapObject request3 = new SoapObject(NAMESPACE, METHOD_NAME3);
SoapObject request4 = new SoapObject(NAMESPACE, METHOD_NAME4);
SoapObject request5 = new SoapObject(NAMESPACE, METHOD_NAME5);
PropertyInfo propInfo0=new PropertyInfo();
propInfo0.name="arg0";
propInfo0.type=PropertyInfo.INTEGER_CLASS;
PropertyInfo propInfo1=new PropertyInfo();
propInfo1.name="arg1";
propInfo1.type=PropertyInfo.INTEGER_CLASS;
request.addProperty(propInfo0, 13);
request.addProperty(propInfo1, 3);
request2.addProperty(propInfo0, 13);
request2.addProperty(propInfo1, 3);
request3.addProperty(propInfo0, 13);
request3.addProperty(propInfo1, 3);
request4.addProperty(propInfo0, 13);
request4.addProperty(propInfo1, 3);
request5.addProperty(propInfo0, 13);
request5.addProperty(propInfo1, 3);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
envelope.setOutputSoapObject(request);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
lblResult.append("Resta: "+resultsRequestSOAP.toString());
}
catch (Exception e) {
lblResult.setText(e.getMessage());
}
envelope.setOutputSoapObject(request2);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
double mul=Double.parseDouble(resultsRequestSOAP.toString());
lblResult.append("\nSuma: "+mul);
}
catch (Exception e) {
lblResult.setText(e.getMessage());
}
envelope.setOutputSoapObject(request3);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
double mul=Double.parseDouble(resultsRequestSOAP.toString());
lblResult.append("\nProducto: "+mul);
}
catch (Exception e) {
lblResult.setText(e.getMessage());
}
envelope.setOutputSoapObject(request4);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
double mul=Double.parseDouble(resultsRequestSOAP.toString());
lblResult.append("\nModulo: "+mul);
}
catch (Exception e) {
lblResult.setText(e.getMessage());
}
envelope.setOutputSoapObject(request5);
try {
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
double mul=Double.parseDouble(resultsRequestSOAP.toString());
lblResult.append("\nCocient: "+mul);
}
catch (Exception e) {
lblResult.setText(e.getMessage());
} } }
Notas:
Jboss es una excelente alternativa a servidores de aplicaciones populares como Glassfish o TomcatEE dada su compatibilidad con el estándar JEE. Se sugiere probar proyectos con Servlets y JSPs en archivos WAR generados en estas plataformas, en la plataforma Jboss. Basta con copiar los archivos WAR en el directorio $JBOSS_HOME/standalone/deployments para montar (deploy) los proyectos.
=======================================================================