<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Workflow's World &#187; Ejemplo</title>
	<atom:link href="http://www.workflowsworld.com/tag/ejemplo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.workflowsworld.com</link>
	<description>Sigue el camino marcado...</description>
	<lastBuildDate>Mon, 31 May 2010 16:00:55 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>jBPM + Reflection</title>
		<link>http://www.workflowsworld.com/2009/02/jbpm-reflection/</link>
		<comments>http://www.workflowsworld.com/2009/02/jbpm-reflection/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 13:04:48 +0000</pubDate>
		<dc:creator>CarlosSM</dc:creator>
				<category><![CDATA[jBPM]]></category>
		<category><![CDATA[Descarga]]></category>
		<category><![CDATA[Ejemplo]]></category>
		<category><![CDATA[Reflection]]></category>

		<guid isPermaLink="false">http://www.workflowsworld.com/?p=168</guid>
		<description><![CDATA[hello
]]></description>
			<content:encoded><![CDATA[<p>hello</p>
]]></content:encoded>
			<wfw:commentRss>http://www.workflowsworld.com/2009/02/jbpm-reflection/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tomando decisiones en jBPM</title>
		<link>http://www.workflowsworld.com/2009/02/tomando-decisiones-en-jbpm/</link>
		<comments>http://www.workflowsworld.com/2009/02/tomando-decisiones-en-jbpm/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 11:20:03 +0000</pubDate>
		<dc:creator>CarlosSM</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Básico]]></category>
		<category><![CDATA[Ejemplo]]></category>
		<category><![CDATA[jBPM]]></category>

		<guid isPermaLink="false">http://www.workflowsworld.com/?p=126</guid>
		<description><![CDATA[Voy a publicar un ejemplo para ver como funcionan los nodos de decisión.
La estructura va a ser igual que en el ejemplo anterior&#8230; de hecho he copiado el ejemplo anterior y le he cambiado el workflow y un par de cosas en la clase Start.java.

Vamos a definir un workflow que decida por ti si ir [...]]]></description>
			<content:encoded><![CDATA[<p>Voy a publicar un ejemplo para ver como funcionan los nodos de decisión.</p>
<p>La estructura va a ser igual que en el ejemplo anterior&#8230; de hecho he copiado el ejemplo anterior y le he cambiado el workflow y un par de cosas en la clase Start.java.</p>
<p><img class="aligncenter size-full wp-image-128" title="basico2" src="http://www.workflowsworld.com/wp-content/uploads/2009/02/basico2.jpg" alt="basico2" width="238" height="266" /></p>
<p>Vamos a definir un workflow que decida por ti si ir al cine o ver la televisión en casa (muy util como podeis ver).</p>
<p>Empezaremos tirando un dado y dependiendo del resultado, si es mayor que 3 nos quedaremos en casa viendo la televisión y en caso contrario nos iremos al cine.</p>
<p>El nodo &#8220;Tirar dado&#8221; será el que nos simule el dado y su salida le permitira al workflow decidir mediante una expresión que veremos más adelante.</p>
<p><img class="aligncenter size-full wp-image-127" title="basicodecision" src="http://www.workflowsworld.com/wp-content/uploads/2009/02/basicodecision.jpg" alt="basicodecision" width="439" height="464" />El codigo fuente para este workflow es el siguiente:</p>
<blockquote><p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;</p>
<p>&lt;process-definition  xmlns=&#8221;urn:jbpm.org:jpdl-3.3&#8243;  name=&#8221;Decision&#8221;&gt;</p>
<p>&lt;start-state name=&#8221;Inicio&#8221;&gt;<br />
&lt;transition to=&#8221;Tirar dado&#8221;&gt;&lt;/transition&gt;<br />
&lt;/start-state&gt;</p>
<p>&lt;node name=&#8221;Tirar dado&#8221;&gt;<br />
<strong>&lt;action name=&#8221;Tirar Dado&#8221; class=&#8221;basico.action.MessageActionHandler&#8221;&gt;</strong><br />
&lt;dado&gt;<br />
0<br />
&lt;/dado&gt;<br />
&lt;message&gt;<br />
Tirando el dado<br />
&lt;/message&gt;<br />
&lt;/action&gt;<br />
&lt;transition to=&#8221;decision&#8221;&gt;&lt;/transition&gt;<br />
&lt;/node&gt;</p>
<p>&lt;decision name=&#8221;decision&#8221; <strong>expression=&#8221;#{ (contextInstance.variables['dado'] gt 3 ? &#8216;to Ver Television&#8217; : &#8216;to Ir al Cine&#8217;) }&#8221;</strong>&gt;<br />
&lt;transition to=&#8221;Ver Television&#8221; name=&#8221;to Ver Television&#8221;&gt;&lt;/transition&gt;<br />
&lt;transition to=&#8221;Ir al Cine&#8221; name=&#8221;to Ir al Cine&#8221;&gt;&lt;/transition&gt;<br />
&lt;/decision&gt;</p>
<p>&lt;node name=&#8221;Ver Television&#8221;&gt;<br />
&lt;action name=&#8221;Ver Television&#8221; class=&#8221;basico.action.MessageActionHandler&#8221;&gt;<br />
&lt;message&gt;Veo Television&lt;/message&gt;<br />
&lt;/action&gt;<br />
&lt;transition to=&#8221;end-state1&#8243;&gt;&lt;/transition&gt;<br />
&lt;/node&gt;</p>
<p>&lt;node name=&#8221;Ir al Cine&#8221;&gt;<br />
&lt;action name=&#8221;Ir al Cine&#8221; class=&#8221;basico.action.MessageActionHandler&#8221;&gt;<br />
&lt;message&gt;Voy al cine&lt;/message&gt;<br />
&lt;/action&gt;<br />
&lt;transition to=&#8221;end-state1&#8243;&gt;&lt;/transition&gt;<br />
&lt;/node&gt;</p>
<p>&lt;end-state name=&#8221;end-state1&#8243;&gt;&lt;/end-state&gt;</p>
<p>&lt;/process-definition&gt;</p></blockquote>
<p>Las dos cosas importantes de este ejemplo básico las he puesto en negrita. En primer lugar definimos donde se encuentra la función que va a hacer de dado : <strong> class=&#8221;basico.action.MessageActionHandler&#8221;</strong>.</p>
<p>Aquí pongo la clase:</p>
<blockquote><p>package basico.action;</p>
<p>import org.jbpm.graph.def.ActionHandler;<br />
import org.jbpm.graph.exe.ExecutionContext;</p>
<p>public class MessageActionHandler implements ActionHandler {</p>
<p>private static final long serialVersionUID = 1L;</p>
<p>String message;<br />
int dado;</p>
<p>public void execute(ExecutionContext context) throws Exception {<br />
context.getContextInstance().setVariable(&#8220;message&#8221;, message);<br />
System.out.println(message);<br />
if (<strong>context.getNode().getName().equals(&#8220;Tirar dado&#8221;)</strong>)<br />
{<br />
dado = random(1,6);<br />
System.out.println(&#8220;El dado cae rodando por la mesa y sale un &#8220;+ dado);<br />
<strong>context.setVariable(&#8220;dado&#8221;, dado);</strong><br />
}</p>
<p>}<br />
private int random(int max,int min){<br />
return (int)(Math.random()*(max-min))+min;<br />
}</p></blockquote>
<p>Básicamente hay un handler para todas las acciones del workflow, para todos los nodos simplemente sacaremos por pantalla un mensaje con la funcionalidad del nodo, pero si estamos en el nodo &#8220;Tirar dado&#8221;, además aplicaremos una función random que nos simulará un dado de 6 caras.</p>
<p>El resultado lo guardamos en la variable dado, y ésta la guardaremos en el contexto del workflow para tenerla disponible posteriormente cuando evaluemos la expresión de la decisión.</p>
<p>Una vez tirado el dado, nos toca decidir :</p>
<blockquote><p>&lt;decision name=&#8221;decision&#8221; <strong>expression=&#8221;#{ (contextInstance.variables['dado'] gt 3 ? &#8216;to Ver Television&#8217; : &#8216;to Ir al Cine&#8217;) }&#8221;</strong>&gt;</p></blockquote>
<p>El lenguaje utilizado en &#8220;expression&#8221; se denomia Expression Lenguage y podeis encontrar una pequeña ayuda sobre este aqui :</p>
<p><a href="http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html">http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html</a></p>
<p>Para acceder a la variable dado, lo hacemos mediante la expresión <strong>contextInstance.variables['dado']</strong>. Es la forma más cómoda que he encotrado, sin embargo si a alguien se le ocurre otras maneras, por favor, escribidlas en un comentario <img src='http://www.workflowsworld.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Finalmente el resultado de todo esto es lo siguiente :</p>
<blockquote><p>Tirando el dado<br />
El dado cae rodando por la mesa y sale un 3<br />
Voy al cine</p></blockquote>
<blockquote><p>Tirando el dado<br />
El dado cae rodando por la mesa y sale un 5<br />
Veo Television</p></blockquote>
<p>Ahora os podeis bajar el código del ejemplo <a href="http://www.workflowsworld.com/descargas/">aqui</a></p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6118847205948522";
/* 468x15, creado 10/02/09 */
google_ad_slot = "3489477131";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.workflowsworld.com/2009/02/tomando-decisiones-en-jbpm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejemplo Básico jBPM (y II)</title>
		<link>http://www.workflowsworld.com/2009/01/ejemplo-basico-jbpm-y-ii/</link>
		<comments>http://www.workflowsworld.com/2009/01/ejemplo-basico-jbpm-y-ii/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 09:23:45 +0000</pubDate>
		<dc:creator>CarlosSM</dc:creator>
				<category><![CDATA[jBPM]]></category>
		<category><![CDATA[Básico]]></category>
		<category><![CDATA[Ejemplo]]></category>

		<guid isPermaLink="false">http://www.workflowsworld.com/?p=116</guid>
		<description><![CDATA[Para el ejemplo he utilizado lo mínimo , como veis no tengo ni ficheros de configuración , ni los de test ni nada&#8230; queda así mi estructura básica :
Como veis hay un paquete basico.init donde se va a iniciar la aplicación, un paquete basico.action donde está el handle de las acciones que definamos en los [...]]]></description>
			<content:encoded><![CDATA[<p>Para el ejemplo he utilizado lo mínimo , como veis no tengo ni ficheros de configuración , ni los de test ni nada&#8230; queda así mi estructura básica :</p>
<p><img class="aligncenter size-full wp-image-117" title="config" src="http://www.workflowsworld.com/wp-content/uploads/2009/01/config.jpg" alt="config" width="252" height="252" />Como veis hay un paquete basico.init donde se va a iniciar la aplicación, un paquete basico.action donde está el handle de las acciones que definamos en los workflows y un directorio almacen-jPDL donde voy a almacenar el/los workflow/s que vayamos haciendo.</p>
<p>Para crear un nuevo workflow&#8230; botón derecho sobre el directorio donde lo quereis crear y elegir New, Other,  process definition.</p>
<p><img class="aligncenter size-full wp-image-119" title="seleccprocessdefinition" src="http://www.workflowsworld.com/wp-content/uploads/2009/01/seleccprocessdefinition.gif" alt="seleccprocessdefinition" width="209" height="58" /></p>
<p>El workflow es muy simple, simplemente simulará el encendido de un botón y finalizará el workflow</p>
<p><img class="aligncenter size-full wp-image-118" title="wfboton" src="http://www.workflowsworld.com/wp-content/uploads/2009/01/wfboton.jpg" alt="wfboton" width="181" height="263" />Después de dibujarlo, hay que añadir las acciones&#8230; a mi me resulta más comodo hacerlo por código, modificar el xml directamente. El contenido es el siguiente :</p>
<blockquote><p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;</p>
<p>&lt;process-definition  xmlns=&#8221;urn:jbpm.org:jpdl-3.3&#8243;  name=&#8221;Boton&#8221;&gt;<br />
&lt;start-state name=&#8221;Inicio&#8221;&gt;<br />
&lt;transition to=&#8221;Boton ON&#8221; name=&#8221;Pulsa Boton&#8221;&gt;<br />
&lt;action name=&#8221;action&#8221; class=&#8221;basico.action.MessageActionHandler&#8221;&gt;<br />
&lt;message&gt;Pulsando Boton&lt;/message&gt;<br />
&lt;/action&gt;<br />
&lt;/transition&gt;<br />
&lt;/start-state&gt;<br />
&lt;node name=&#8221;Boton ON&#8221;&gt;<br />
&lt;action name=&#8221;action&#8221; class=&#8221;basico.action.MessageActionHandler&#8221;&gt;<br />
&lt;message&gt;Boton en posicion ON&lt;/message&gt;<br />
&lt;/action&gt;<br />
&lt;transition to=&#8221;Fin&#8221; name=&#8221;Fin&#8221;&gt;<br />
&lt;action name=&#8221;action&#8221; class=&#8221;basico.action.MessageActionHandler&#8221;&gt;<br />
&lt;message&gt;Proceso terminado&lt;/message&gt;<br />
&lt;/action&gt;<br />
&lt;/transition&gt;<br />
&lt;/node&gt;<br />
&lt;end-state name=&#8221;Fin&#8221;&gt;&lt;/end-state&gt;<br />
&lt;/process-definition&gt;</p></blockquote>
<p>La aplicación donde cargaremos y ejecutaremos el workflow es la siguiente :</p>
<blockquote><p>package basico.init;</p>
<p>import java.io.FileInputStream;<br />
import java.io.FileNotFoundException;</p>
<p>import org.jbpm.graph.def.ProcessDefinition;<br />
import org.jbpm.graph.exe.ProcessInstance;</p>
<p>public class Start {</p>
<p>public static void main(String[] args) throws FileNotFoundException {<br />
FileInputStream fis = new FileInputStream(&#8220;almacen-jPDL/Boton/processdefinition.xml&#8221;);<br />
ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(fis);<br />
ProcessInstance instance = new ProcessInstance(processDefinition);<br />
instance.signal(&#8220;Pulsa Boton&#8221;);<br />
instance.signal(&#8220;Fin&#8221;);<br />
}<br />
}</p></blockquote>
<p>Simplemente cargamos el fichero processdefinition.xml, parseamos el xml en la estructura ProcessDefinition y creamos una instancia del workflow. Con esto ya tendremos nuestro workflow preparado para recibir las ordenes.</p>
<p>La primera es &#8220;Pulsa Boton&#8221; que nos llevará al nodo Boton ON y ejecutará una acción&#8230; esta acción se define aqui :</p>
<blockquote><p>package basico.action;</p>
<p>import org.jbpm.graph.def.ActionHandler;<br />
import org.jbpm.graph.exe.ExecutionContext;</p>
<p>public class MessageActionHandler implements ActionHandler {</p>
<p>private static final long serialVersionUID = 1L;</p>
<p>String message;</p>
<p>public void execute(ExecutionContext context) throws Exception {<br />
context.getContextInstance().setVariable(&#8220;message&#8221;, message);<br />
System.out.println(message);<br />
}<br />
}</p></blockquote>
<p>El resultado final una vez ejecutado el workflow son los siguientes mensajes en la pantalla</p>
<blockquote><p>Pulsando Boton<br />
Boton en posicion ON<br />
Proceso terminado</p></blockquote>
<p>Fácil no?</p>
<p>Ahora os podeis bajar el código del ejemplo <a href="http://www.workflowsworld.com/descargas/">aquí</a></p>
<p><script type="text/javascript"><!--
google_ad_client = "pub-6118847205948522";
/* 468x15, creado 10/02/09 */
google_ad_slot = "3489477131";
google_ad_width = 468;
google_ad_height = 15;
//-->
</script><br />
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.workflowsworld.com/2009/01/ejemplo-basico-jbpm-y-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ejemplo Básico jBPM (I)</title>
		<link>http://www.workflowsworld.com/2009/01/ejemplo-basico-jbpm-i/</link>
		<comments>http://www.workflowsworld.com/2009/01/ejemplo-basico-jbpm-i/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 10:57:22 +0000</pubDate>
		<dc:creator>CarlosSM</dc:creator>
				<category><![CDATA[jBPM]]></category>
		<category><![CDATA[Ejemplo]]></category>
		<category><![CDATA[Iniciación]]></category>

		<guid isPermaLink="false">http://www.workflowsworld.com/?p=95</guid>
		<description><![CDATA[Algunas personas me han pedido que ponga algun ejemplo sencillo porque no les funciona el ejemplo básico que hay en el tutorial de jbpm.
Haré un ejemplo básico básico, de hecho, quitaré todo aquello que no se utilice, como ficheros de configuración, bases de datos&#8230; incluso se puede prescindir de la estructura inicial de ficheros que [...]]]></description>
			<content:encoded><![CDATA[<p>Algunas personas me han pedido que ponga algun ejemplo sencillo porque no les funciona el ejemplo básico que hay en el tutorial de jbpm.<br />
Haré un ejemplo básico básico, de hecho, quitaré todo aquello que no se utilice, como ficheros de configuración, bases de datos&#8230; incluso se puede prescindir de la estructura inicial de ficheros que propone jBPM.</p>
<p>Lo primero, vamos a iniciar el proyecto&#8230;</p>
<p style="text-align: center;"><img class="size-full wp-image-96 aligncenter" title="paso1" src="http://www.workflowsworld.com/wp-content/uploads/2009/01/paso1.gif" alt="paso1" width="485" height="489" /></p>
<p>Elegimos Process Project y procedemos a darle un nombre</p>
<p style="text-align: center;"><img class="size-full wp-image-97 aligncenter" title="paso2" src="http://www.workflowsworld.com/wp-content/uploads/2009/01/paso2.gif" alt="paso2" width="495" height="228" /></p>
<p>Nos pide configurar el JBoss jBPM Runtime&#8230; asi que buscamos el directorio donde nos hayamos instalado</p>
<p>el jBPM, sigo a partir del tutorial donde explico la instalacion del jBPM 3.3.0GA.</p>
<p><img class="aligncenter size-full wp-image-98" title="paso3" src="http://www.workflowsworld.com/wp-content/uploads/2009/01/paso3.gif" alt="paso3" width="689" height="690" /></p>
<p><img class="aligncenter size-full wp-image-99" title="paso4" src="http://www.workflowsworld.com/wp-content/uploads/2009/01/paso4.gif" alt="paso4" width="483" height="181" /></p>
<p>El nombre se lo poneis vosotros&#8230; que sea un nombre característico, porque ireis actualizando las librerias con nuevas versiones que si no vais con un poco de cuidado se lia bastante la cosa.</p>
<p><img class="aligncenter size-full wp-image-100" title="paso5" src="http://www.workflowsworld.com/wp-content/uploads/2009/01/paso5.gif" alt="paso5" width="480" height="108" /></p>
<p>A continuación elegis el Core jBPM al que le habeis dado nombre en el paso anterior y seleccionais el cuadro para que te genere el simple process definition, action handler y JUnit test. Generalmente es más fácil empezar con esto aunque para el ejemplo básico voy a crear el proyecto totalmente vacio.</p>
<p>Le dais a finalizar y ya teneis la estructura necesaria para empezar.</p>
<p>He encontrado también un video bastante majo para empezar, aunque es de una versión más antigua, os puede ayudar bastante. Aprovecha toda la estructura visual de eclipse&#8230; se configura todo por menus y tal&#8230; el mio será totalmente por código.</p>
<p><a href="http://docs.jboss.com/jbpm/v3/demos/movies/jbpm-overview.htm">Demo jBPM</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.workflowsworld.com/2009/01/ejemplo-basico-jbpm-i/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
