Chrisrod's Weblog

octubre 6, 2008

Instanciacion de WorkFlows del jBPM mediante Web Services

Filed under: JBPM — chrisrod @ 7:44 pm

Como mucho de ustedes sabran, los Servicios Web son un conjunto de protocolos y estandares que permiten intercambiar datos entre aplicaciones, es de esta manera que de forma estandar podemos realizar la interconexion de diferentes equipos sin tener que preocuparnos de su tecnologia o su procedencia.

En pocas palabras, la definicion de “Web Services” segun la Wikipedia es la siguiente:

Un servicio web (en inglés Web service) es un conjunto de protocolos y estándares que sirven para intercambiar datos entre aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de programación diferentes, y ejecutadas sobre cualquier plataforma, pueden utilizar los servicios web para intercambiar datos en redes de ordenadores como Internet. La interoperabilidad se consigue mediante la adopción de estandares abiertos. Las organizaciones OASIS y W3C son los comités responsables de la arquitectura y reglamentación de los servicios Web. Para mejorar la interoperabilidad entre distintas implementaciones de servicios Web se ha creado el organismo WS-I, encargado de desarrollar diversos perfiles para definir de manera más exhaustiva estos estándares.

 

Una ves dado el breve marco teorico, procedere a explicar la solucion de un problema que me tuvo pensando e investigando por mucho tiempo (al rededor de un mes aproximadamente), mediante el cual es posible instanciar flujos del jBPM desde una aplicacion externa simplemente utlizando Web Services.

Los IDEs que utilice para estas tareas fueron: NetBeans 6.1 (mi preferido) y Eclipse (al cual le estoy empezando a hallar el gustito).

Utilice Eclipse para la elaboracion de mi flujo jBPM y utilice NetBeans 6.1 para la elaboracion del EJB Module el cual sera el que alvergara el Web Services que escuchara nuestros requerimientos.

Este pequeño tutorial se enfocara principalmente en la elaboracion del EJB Module con el cual crearemos el Web Service que podra instanciar flujos de una manera externa al jBPM.

Creacion del EJB Module

En el NetBeans crea un nuevo proyecto de la categoria enterprise tal como se aprecia en la figura:

Dibujo

Figura 01. Creacion del EJB Module

Sigue los mismos pasos descritos en el libro “Building SOA-Based Composite Applications Using NetBeans IDE 6” acerca de la creacion de un “EJB Module”. Este libro es muy bueno si uno quiere meterse en el mundo de SOA tal como lo comente hace un tiempo atras en este mismo Blog.

Pienso que dos partes son muy importantes para que este Servicio Web funcione correctamente:

01) La configuracion correcta de los archivos xml: jbpm.cfg.xml y hibernate.cfg.xml

02) El codigo que instanciara remotamente el flujo

Empecemos por lo primero, es decir los archivos xml.

Los archivos XML

Tu archivo jbpm.cfg.xml debe tener la siguiente estructura:

<jbpm-configuration>

  <jbpm-context>
    <service name=»persistence»>
       <factory>
          <bean class=»org.jbpm.persistence.db.DbPersistenceServiceFactory»>
             <field name=»isTransactionEnabled»><false/></field>
          </bean>
       </factory>
    </service>
    <service name=»tx» factory=»org.jbpm.tx.TxServiceFactory» />
    <service name=»message» factory=»org.jbpm.msg.db.DbMessageServiceFactory» />
    <service name=»scheduler» factory=»org.jbpm.scheduler.db.DbSchedulerServiceFactory» />
    <service name=»logging» factory=»org.jbpm.logging.db.DbLoggingServiceFactory» />
    <service name=»authentication» factory=»org.jbpm.security.authentication.DefaultAuthenticationServiceFactory» />
  </jbpm-context>

</jbpm-configuration>

 y el archivo hibernate.cfg.xml la siguiente:

<?xml version=»1.0″ encoding=»UTF-8″?>
<!DOCTYPE hibernate-configuration PUBLIC «-//Hibernate/Hibernate Configuration DTD 3.0//EN»
                                         «http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd«>
<hibernate-configuration>
 <session-factory name=»Acceso»>
  <property name=»show_sql»>false</property>
  <property name=»connection.datasource»>java:/dvdDatasource</property>
  <property name=»transaction.factory_class»>org.hibernate.transaction.JTATransactionFactory</property>
  <property name=»transaction.manager_lookup_class»>org.hibernate.transaction.JBossTransactionManagerLookup</property>
  <property name=»cache.provider_class»>org.hibernate.cache.HashtableCacheProvider</property>
  <property name=»hbm2ddl.auto»>create-drop</property>
  <!–property name=»transaction.flush_before_completion»>true</property
 ############################################
 # mapping files with external dependencies #
 ############################################
 following mapping file has a dependendy on  
 ‘bsh-{version}.jar’.                        
 uncomment this if you don’t have bsh on your
 classpath.  you won’t be able to use the    
 script element in process definition files   –>
  <mapping resource=»org/jbpm/graph/action/Script.hbm.xml»/>
  <!– following mapping files have a dependendy on 
 ‘jbpm-identity.jar’, mapping files           
 of the pluggable jbpm identity component.    
 Uncomment the following 3 lines if you       
 want to use the jBPM identity mgmgt          
 component.                                   
 identity mappings (begin) ===
    <mapping resource=»org/jbpm/identity/User.hbm.xml»/>
    <mapping resource=»org/jbpm/identity/Group.hbm.xml»/>
    <mapping resource=»org/jbpm/identity/Membership.hbm.xml»/>
    ==== identity mappings (end)
 following mapping files have a dependendy on 
 the JCR API                                  
 jcr mappings (begin) ===
    <mapping resource=»org/jbpm/context/exe/variableinstance/JcrNodeInstance.hbm.xml»/>
    ==== jcr mappings (end)
 ######################
 # jbpm mapping files #
 ######################
 hql queries and type defs –>
  <mapping resource=»org/jbpm/db/hibernate.queries.hbm.xml»/>
  <!– graph.action mapping files –>
  <mapping resource=»org/jbpm/graph/action/MailAction.hbm.xml»/>
  <!– graph.def mapping files –>
  <mapping resource=»org/jbpm/graph/def/ProcessDefinition.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/def/Node.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/def/Transition.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/def/Event.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/def/Action.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/def/SuperState.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/def/ExceptionHandler.hbm.xml»/>
  <mapping resource=»org/jbpm/instantiation/Delegation.hbm.xml»/>
  <!– graph.node mapping files –>
  <mapping resource=»org/jbpm/graph/node/StartState.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/node/EndState.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/node/ProcessState.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/node/Decision.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/node/Fork.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/node/Join.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/node/MailNode.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/node/State.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/node/TaskNode.hbm.xml»/>
  <!– context.def mapping files –>
  <mapping resource=»org/jbpm/context/def/ContextDefinition.hbm.xml»/>
  <mapping resource=»org/jbpm/context/def/VariableAccess.hbm.xml»/>
  <!– taskmgmt.def mapping files –>
  <mapping resource=»org/jbpm/taskmgmt/def/TaskMgmtDefinition.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/def/Swimlane.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/def/Task.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/def/TaskController.hbm.xml»/>
  <!– module.def mapping files –>
  <mapping resource=»org/jbpm/module/def/ModuleDefinition.hbm.xml»/>
  <!– bytes mapping files –>
  <mapping resource=»org/jbpm/bytes/ByteArray.hbm.xml»/>
  <!– file.def mapping files –>
  <mapping resource=»org/jbpm/file/def/FileDefinition.hbm.xml»/>
  <!– scheduler.def mapping files –>
  <mapping resource=»org/jbpm/scheduler/def/CreateTimerAction.hbm.xml»/>
  <mapping resource=»org/jbpm/scheduler/def/CancelTimerAction.hbm.xml»/>
  <!– graph.exe mapping files –>
  <mapping resource=»org/jbpm/graph/exe/Comment.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/exe/ProcessInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/exe/Token.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/exe/RuntimeAction.hbm.xml»/>
  <!– module.exe mapping files –>
  <mapping resource=»org/jbpm/module/exe/ModuleInstance.hbm.xml»/>
  <!– context.exe mapping files –>
  <mapping resource=»org/jbpm/context/exe/ContextInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/TokenVariableMap.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/VariableInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/variableinstance/ByteArrayInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/variableinstance/DateInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/variableinstance/DoubleInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/variableinstance/HibernateLongInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/variableinstance/HibernateStringInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/variableinstance/LongInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/variableinstance/NullInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/context/exe/variableinstance/ StringInstance.hbm.xml»/>
  <!– job mapping files –>
  <mapping resource=»org/jbpm/job/Job.hbm.xml»/>
  <mapping resource=»org/jbpm/job/Timer.hbm.xml»/>
  <mapping resource=»org/jbpm/job/ExecuteNodeJob.hbm.xml»/>
  <mapping resource=»org/jbpm/job/ExecuteActionJob.hbm.xml»/>
  <!– taskmgmt.exe mapping files –>
  <mapping resource=»org/jbpm/taskmgmt/exe/TaskMgmtInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/exe/TaskInstance.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/exe/PooledActor.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/exe/SwimlaneInstance.hbm.xml»/>
  <!– logging mapping files –>
  <mapping resource=»org/jbpm/logging/log/ProcessLog.hbm.xml»/>
  <mapping resource=»org/jbpm/logging/log/MessageLog.hbm.xml»/>
  <mapping resource=»org/jbpm/logging/log/CompositeLog.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/log/ActionLog.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/log/NodeLog.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/log/ProcessInstanceCreateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/log/ProcessInstanceEndLog.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/log/ProcessStateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/log/SignalLog.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/log/TokenCreateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/log/TokenEndLog.hbm.xml»/>
  <mapping resource=»org/jbpm/graph/log/TransitionLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/VariableLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/VariableCreateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/VariableDeleteLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/VariableUpdateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/variableinstance/ByteArrayUpdateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/variableinstance/DateUpdateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/variableinstance/DoubleUpdateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/variableinstance/HibernateLongUpdateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/variableinstance/HibernateStringUpdateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/variableinstance/LongUpdateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/context/log/variableinstance/StringUpdateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/log/TaskLog.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/log/TaskCreateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/log/TaskAssignLog.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/log/TaskEndLog.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/log/SwimlaneLog.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/log/SwimlaneCreateLog.hbm.xml»/>
  <mapping resource=»org/jbpm/taskmgmt/log/SwimlaneAssignLog.hbm.xml»/>
 </session-factory>
</hibernate-configuration>

 

Ambos archivos debes localizarlos en el directorio “Source Packages” de tu EJB Module

Dibujo

Figura 02. Ubicacion de los archivos xml

El Codigo

El codigo que permitira que tu Servicio Web instancie un flujo remotamente es el siguiente:

Dibujo

Figura 03. Codigo que instancia flujos remotamente

 

Para concluir en el anterior codigo utilice el exelente Tutorial “jbpm3.2.2-handsontutorial” el cual te lo puedes descargar de la Wiki de jBoss, el cual es tremendamente recomendable si quieres entender la logica de funcionamiento de jBPM.

Y listo, deploya este EJB Module en tu servidor jBoss, y testea el Servicio Web con cualquier programa que realice esto, el que YO utlizo es: “SOAP UI” el cual tambien te lo puedes descargar de la red

El resultado que obtuve fue el siguiente:

Dibujo

Figura 04. Web Service deployado (http://127.0.0.1:8080/jbossws/services)

Dibujo

Figura 05. Resultado del Servicio Web consumido

 

Espero que les haya servido

 

Christian

 

 

 

 

3 comentarios »

  1. Hola Christian,

    Creo que he dado en tu blog con el ejemplo de jBPM que estaba buscando relativo a la invocación desde web services, pero los links de las imágenes donde se indica el código no se visualizan, están perdidos.

    ¿Podrías, por favor, incluirlos a adjuntar un ejemplo del código?

    Mi caso es similar, sólo que intento acceder a nodos del tipo state para invocar desde sistemas externos.

    Un saludo y gracias previas.

    Comentario por Ocatrapse — enero 27, 2009 @ 2:25 pm | Responder

  2. prueba. Creo que el último no llegó. Era para pedir que incorporaras las imágenes con el código que no se pueden ver.

    Un saludo.

    Comentario por ocatrapse — enero 27, 2009 @ 4:21 pm | Responder

    • Hola ocatrapse, actualmente necesito modelar el mismo requerimiento tuyo en jbpm-4.2, necesito desde un webservice externo seguir con el flujo de una instancia que permanece en un nodo state

      pudiste solucionar el inconveniente??? tienes algún ejemplo que me pueda guiar???

      Gracias

      Comentario por cmjh — febrero 15, 2010 @ 12:39 pm | Responder


RSS feed for comments on this post. TrackBack URI

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: