Workflows On Rails

Preview:

DESCRIPTION

Visión sobre los flujos de trabajo (workflows) desde el framework de desarrollo Ruby On Rails. Presentación realizada en las terceras conferencias hispanas de ruby on rails.

Citation preview

Diego Moreno Naharro

Universidad Politécnica de Madrid

Departamento de Ingeniería de Sistemas Telemáticos

dmoreno@dit.upm.es

¿Flujos de trabajo? ¿Qué son?

¿Para qué sirven?

Alternativas en Rails

Ejemplo de aplicación

Un flujo de trabajo es una herramienta que gestiona tareas: Orden correlativo

Asignación

Seguimiento

Sincronización

Paso de información

1 2 5

4

3

Publicación de un Post. Blog

Revisión adminCrear Post Publicación

Borrado

Aprobado

Rechazado

Publicación de un Post. Blog

Edición de documentos. Caso Alfresco

Usuario UsuarioRevisores Revisores

Revisión previa

Creación PublicaciónRevisiónEdición

Descarte

Publicación de un Post. Blog

Edición de documentos. Caso Alfresco

Gestión de incidencias. Call Center

ClasificaciónCreación Problema

Solución

Asignación¿Incidencias

similares?

Publicación de un Post. Blog

Edición de documentos. Caso Alfresco

Orquestación de servicios. Yahoo Pipes

Gestión de incidencias. Call Center

Publicación de un Post. Blog

Edición de documentos. Caso Alfresco

Orquestación de servicios. Yahoo Pipes

Gestión de incidencias. Call Center

Conclusión: Herramienta que aumenta la productividad a través de Mejora de la coordinación entre personas Automatización de tareas

Máquina de estados

Act as state machine plugin

Tiene varios forks

Workflow plugin

Motor de flujos de trabajo (WorkFlow Engines)

OpenWFEru

Borrador

En revisión

Rechazado

Publicado

Intentar publicar

mejorar

aprobar

rechazar

Crear post

Estados

class Post < ActiveRecord::Base

acts_as_state_machine :initial => :borrador

state :borrador

state :en_revision

state :rechazado

state :publicado

……

end

Borrador

En revisión

Rechazado

Publicado

Intentar publicar

mejorar

aprobar

rechazar

Crear post

Estados

Eventos

event :intentar_publicar do

transitions :to => :borrador, :from => :en_revision

end

event :mejorar do

transitions :to => :en_revision, :from => :borrador

end

Borrador

En revisión

Rechazado

Publicado

Intentar publicar

mejorar

aprobar

rechazar

Crear post

Estados

Eventos

¡Funciona!

>> pt = Post.create(:title => „prueba‟, :body => @body)

>> pt.status

=> “borrador”

>> pt.publicado?

=> false

>> pt.intentar_publicar!

=> true>> pt.status

=> “en_revision”

Callbacks sobre estados

Enter, after, exit

state :en_revision,

:enter => :check_title,

:after => Proc.new {|post| post.format_body },

:exit => :tag_post

Callbacks sobre estados

Enter, after, exit

Guarding transitions sobre eventos

event :aprobar do

transitions :to => :publicado, :from => :en_revision,

:guard => Proc.new {|post| post.right_formated?}

end

Mismos conceptos, distinta sintaxis

Estados, eventos, callbacks & guards

Nuevos métodos de acceso:

Ej. listar de eventos de cada estado

Motor de flujos de trabajo open source

Historia

Empezó como OpenWFEja en 2001

Paso a OpenWFEru en 2006 (John Mettraux)

Disponible como plugin y gema

Nombre de batalla: ruote

Subproyecto: ruote-web

Programar lo menos posible

Elección de ruby

Definición de procesos fuera del programa

Lenguaje de definición

Basado en XML

Más sencillo que XPDL y BPEL

*.xml || *.rb

ruote

ruote-web Ruby on Rails

Ruby

XML, Ruby

Motor

Interfaz web

Usuario

Workitems

Participantes Con Interacción humana

Usuarios y roles.

Sin interacción humana (automáticas) Escribir a archivo, envíar un correo, llamada SOAP,

mensaje twitter, envío AtomPub.

participante participante

participante

participante

Empleado Encargado Empleado

Jefe

class VacationRequest0 < OpenWFE::ProcessDefinition

set :v => "employee", :value => "${f:launcher}"

set :f => "from_date", :value => ""

set :f => "to_date", :value => ""

set :f => "reason", :value => ""

sequence do

participant :employee

set :f => "granted", :value => "false"

set :f => "boss_should_have_a_look", :value => "false"

participant :assistant

Petición de vacaciones

Empleado Encargado Empleado

Jefe

participant :boss, :if => "${f:boss_should_have_a_look}"

participant :employee

end

end

Petición de vacaciones

Empleado Encargado Empleado

Jefe

<process-definition name="vacation_request">

<sequence>

<set variable="employee" value="${f:launcher}" />

<set field="from_date" value="" />

<set field="to_date" value="" />

<set field="reason" value="" />

<participant ref="employee" />

<set field="granted" value="false" />

<set field="boss_should_have_a_look" value="false" />

<participant ref="assistant" />

Petición de vacaciones

Empleado Encargado Empleado

Jefe

<if test="${f:boss_should_have_a_look}">

<participant ref="boss" />

</if>

<participant ref="employee" />

</sequence>

</process-definition>

Petición de vacaciones

Expresiones 4 expresiones básicas: process-definition, participant,

secuence, concurrence. Bucles: while, loop. Llamadas a subprocesos: subprocess. Control de hilos: sleep, wait.

Lenguaje conciso Sin ruido de “posición de caja y flecha” Cumple los principales patrones de los flujos de

trabajo http://www.workflowpatterns.com

Hace su trabajo

Ofrece un API para niveles superiores

Flujos

Workflowengine

Interfaz web

class CustomParticipant <

OpenWFE::LocalParticipant

def initialize

super()

end

# This is the method called by

# the OpenWFEru engine to hand

# a workitem to this

# participant.

def consume(workitem)

# Tu código

end

end

TwitterSOAP

Custom

Es una librería JavaScript

fluo-can: dibuja definiciones de procesos

fluo-tred: edición online de definiciones de procesos

Una opción más además de: XML y Ruby.

Usa la gema Sinatra

Recursos: processes / errors / workitems

Interfaz:

Lanzar proceso: POST /processes

Cancelar proceso: DELETE /processes/id

UsuarioAplicación

Web

Motor de

workflow

Sencilla demostración de lo que se puede hacer con ruote Demo online: http://difference.openwfe.org:3000/

Permite: Gestión de usuarios Subir y lanzar procesos Uso de formularios para pasar de tarea Edición parcial de procesos al vuelo

Carencias: Sin interfaz REST Filosofía Rails 1.2

Mejoras:

RESTFul

RESTFul Authtentication

Interfaz REST para el motor (XML/JSON/Atom)

Mejoras en la edición al vuelo

OpenID y OAuth

Primera beta: noviembre 2008

Ruote

Ruote-web

Ruote-fluo

Fluo-can

Fluo-tred

Ruote-rest

Ruote-web2

Plataforma de colaboración para desarrolladores RESTFul

“cajitas propias”: Correo electrónico, notificaciones, eventos

Extensión del lenguaje para generación dinámica de formularios

Representación Atom de los recursos

Cliente Flex

Futuro: Internacionalización, editor gráfico de flujos

¡Demo! http://demo:3000

?? || ##

¡Gracias!