lunes, 31 de mayo de 2010

Un ejemplo rápido de JMS

Para este ejemplo estoy usando Netbeans version 6.9, un servidor Glassfish V3, JDK1.6 y Ubuntu 9.10
En este ejemplo vamos a mostrar como hacer funcionar Java Message Service desde Glassfish y un aplicativo java.

Luego se tiene que iniciar el servidor Glassfish
Posteriormente, se tiene que abrir el administrador de Glassfish V3

Una vez hecho esto, damos click sobre JMS Resources y nos mostrará dos opciones:
Connection Factories y Destination Resources

Damos click sobre Conection Factories y creamos una Conexion. Esta conexión nos permitira el conectarnos a un queue o un topic. Damos click sobre Nuevo
Entonces, le damos el nombre jms/queueFactory y como ResourceType, seleccionamos javax.jms.QueueConnectionFactory y guardamos esta configuración
Luego tenemos que crear un Destination Resource
Damos click sobre Destination Resources y luego click en Nuevo
Le damos el nombre jms/queue, en el Physical Destination Name colocamos something y como tipo de recurso seleccionamos javax.jms.Queue, es decir:




Luego, creamos una aplicación JavaEE y le llamamos PracticaJMS
El presente ejercicio consiste en crear un servlet que cree un mensaje y que luego este servlet sea consumido por otro servlet e imprima el mensaje original.
En el módulo web creamos un nuevo Servlet llamado Generador

y en ese Servlet colocamos el siguiente código:
Generador.java
//Variables de instancia
@Resource(mappedName = "jms/queueFactory")
javax.jms.QueueConnectionFactory queueConnectionFactory;
@Resource(mappedName = "jms/queue")
javax.jms.Queue queue;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
String text = "Esta es una prueba!!!";
try {
Connection connection = queueConnectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
TextMessage message = session.createTextMessage(text);
MessageProducer producer = session.createProducer(queue);
producer.send(message);
producer.close();
session.close();
connection.close();
response.sendRedirect("Consumidor");
} catch (JMSException ex) {
ex.printStackTrace();
}
}



Luego creamos un nuevo Servlet llamado Consumidor



Con el siguiente código:



Consumidor.java
//Variables de instancia
@Resource(mappedName = "jms/queueFactory")
javax.jms.QueueConnectionFactory queueConnectionFactory;
@Resource(mappedName = "jms/queue")
javax.jms.Queue queue;

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
List messages = new ArrayList();
String mensaje = "No hay mensaje";
try {
Connection connection = queueConnectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
QueueBrowser browser = session.createBrowser(queue);
Enumeration queueEnum = browser.getEnumeration();
while (queueEnum.hasMoreElements()) {
Object obj = queueEnum.nextElement();
if (obj instanceof TextMessage) {
mensaje = ((TextMessage) obj).getText();
}
}
browser.close();
session.close();
connection.close();
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Consumidor</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>" + mensaje + "</h1>");
out.println("</body>");
out.println("</html>");
} catch (JMSException ex) {
ex.printStackTrace();
} finally {
out.close();
}
}

Finalmente ejecutamos Generador y obtendremos la salida:

miércoles, 12 de mayo de 2010

JBPM Instalación y un ejemplo básico

Para este ejemplo estoy utilizando: Windows XP, Eclipse Ganymede y un servidor JBoss 5.0
Primeramente si no tenemos descargado JBoss tenemos que descargarlo de:http://www.jboss.org/jbossas/downloads/

Una vez descargado JBoss, descargamos el JBPM Installer(jbpm-installer-3.2.6.GA.jar) de: http://sourceforge.net/projects/jbpm/files/



Ejecutamos el instalador desde un terminal como:java -jar jbpm-installer-3.2.6.GA.jar

Ingresamos el path donde instalaremos JBPM
Seleccionamos la versión de JBoss con la cual trabajará, para este caso es version 5


Luego comienza el proceso de instalación


Una vez hecho esto, abrimos Eclipse

Y vamos a software update para actualizar la versión actual. Para esto vamos a Help/Software Updates
Luego seleccionamos Eclipse project Updates

Instalamos todos los componentes



Luego, tenemos que descargar el plugin del Designer de JBPM para Eclipse, para este caso descargamos un archivo zip llamado jbpm-jpdl-designer-site-3.1.6.zip de http://sourceforge.net/projects/jbpm/files/




Una vez instalado este plugin, reiniciamos Eclipse. También aqui debemos hacer un paso importante, para evitar un problema de referencia a una libreria desde Eclipse. Tenemos que copiar la libreria activation.jar a /lib.


Luego desde Eclipse creamos un Process Project bajo la categoría JBoss jBPM
Le damos el nombre al proyecto
Luego buscamos el lugar donde tengamos instalamos el runtime del JBPM jbpm-3.2.6.GA que lo instalamos al principio de este tutorial

Luego creamos un Process Definition, bajo la categoria JBoss jBPM


Le damos un nombre y seleccionamos donde se guardará

Entonces se nos abrirá el Designer

y ahi modelamos un proceso de la siguiente manera:


El archivo gpd.xml(que tiene información sobre el dibujo) debe quedar:
<? xml version = "1.0" encoding = "UTF-8"?>
<process-diagram name="simple" width="469" height="438">
<node name="start" x="150" y="25" width="140" height="40">
<transition name="to_state"/>
</ node>
<node name="first" x="150" y="125" width="140" height="40">
<transition name="to_end"/>
</ node>
<node name="end" x="150" y="225" width="140" height="40"/>
</ process-diagram>

El archivo processdefinition.xml(Que tiene la definición del flujo y clases handler que se utilizaran en cada estado) debe quedar como:
<?xml version="1.0" encoding="UTF-8"?>
<process-definition xmlns="urn:jbpm.org:jpdl-3.2"
name="Proceso1">
<start-state name="start">
<transition name="to_state" to="first">
<action name="action" class="com.sample.action.MessageActionHandler">
<message>Vamos al primer Estado</message>
</action>
</transition>
</start-state>
<state name="first">
<transition name="to_end" to="end">
<action name="action" class="com.sample.action.MessageActionHandler">
<message>Vamos al estado Final</message>
</action>
</transition>
</state>
<end-state name="end"></end-state>
</process-definition>

La clase MessageActionHandler(Que es la clase handler) tiene el siguiente código

package com.sample.action;

import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;

public class MessageActionHandler implements ActionHandler {

private static final long serialVersionUID = 1L;

/**
* The message member gets its value from the configuration in the
* processdefinition. The value is injected directly by the engine.
*/
String message;

/**
* A message process variable is assigned the value of the message
* member. The process variable is created if it doesn't exist yet.
*/
public void execute(ExecutionContext context) throws Exception {
context.getContextInstance().setVariable("message", message);
}

}
Finalmente el test case para probar todo lo anterior, llamado SimpleProcessTest tiene el siguiente código:
package com.sample;

import java.io.File;
import java.io.FileInputStream;

import junit.framework.TestCase;

import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;

public class SimpleProcessTest extends TestCase {

public void testSimpleProcess() throws Exception {
FileInputStream fis = new FileInputStream(
"src/main/jpdl/simple/Proceso1/processdefinition.xml");
ProcessDefinition processDefinition = ProcessDefinition
.parseXmlInputStream(fis);
ProcessInstance instance = new ProcessInstance(processDefinition);
assertEquals("start state",
instance.getRootToken().getNode().getName(), "start");
System.out.println(instance.getRootToken().getNode().getName());
System.out.println(instance.getContextInstance().getVariable("message"));
instance.signal();
assertEquals("first state",
instance.getRootToken().getNode().getName(), "first");
System.out.println(instance.getRootToken().getNode().getName());
System.out.println(instance.getContextInstance().getVariable("message"));
instance.signal();
assertEquals("Instance is in end state", instance.getRootToken()
.getNode().getName(), "end");
System.out.println(instance.getRootToken().getNode().getName());
System.out.println(instance.getContextInstance().getVariable("message"));
assertTrue("Instance has ended", instance.hasEnded());
}
}

Lo cual genera la siguiente salida


lunes, 3 de mayo de 2010

Animación de Controles con JavaFX

Para este ejemplo estoy usando JDK1.6, Netbeans 6.8, Ubuntu 9.10



Primeramente creamos una aplicacion JavaFX

Y la llamamos EjemploAnimacion



Una vez que se nos abre copiamos el siguiente código fuente

package javafxapplication3;

import javafx.animation.KeyFrame;
import javafx.animation.Interpolator;
import javafx.animation.Timeline;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.stage.Stage;
import javafx.scene.control.Label;
import javafx.scene.control.TextBox;
import javafx.scene.layout.HBox;

var xRotar: Number = 0;
var anim = Timeline {
keyFrames: [
KeyFrame {
time: bind 2000ms
values: [
xRotar => 360 tween Interpolator.LINEAR,
]
}
]
};

Stage {
title: "Animación de Controles"
visible: true
scene: Scene {
width: 400
height: 500
content: [hBoxNombre,hBoxEmail, wsButton
]
}
def lblNombre = Label {
text: "Nombre:"
}
def txtNombre = TextBox {
columns: 12
selectOnFocus: true
}
def hBoxNombre = HBox {
layoutY: 10
content: [lblNombre, txtNombre]
rotate: bind xRotar
}
def lblEmail = Label {
text: "Email:"
}
def txtEmail = TextBox {
columns: 12
selectOnFocus: true
}
def hBoxEmail = HBox {
layoutY: 40
spacing: 10
rotate: bind xRotar
content: [lblEmail, txtEmail]
}
def wsButton = Button {
text: "Animar"
layoutY: 80
action: function (): Void {
anim.playFromStart();
}
}
}

Notas:
anim: Es usado para definir en el tiempo la respectiva animacion, para nuestro caso se ejecutará la animación por 2000 ms con una cuenta(interpolación) de 360

def: nos permite definir controles y asignarles variables fuera del Stage y luego estas variables son colocadas dentro del content del Stage

Finalmente ejecutamos el proyecto.
Damos click sobre el botón animar


En ese momento veremos el respectivo movimiento de los controles