jBPM5: usando nuestra propia base de datos.

1
9628

jBPM5: usando nuestra propia base de datos.

0. Índice de contenidos.


1. Introducción

Después de haber realizado una revisión de jBPM5 y empezando a «cacharrear»
con los diferentes módulos de la suite, podemos tener problemas de persistencia y repositorio de contenidos puede que pierda la comunicación con el servidor de tareas,
por defecto, tanto la base de datos de tareas como la de procesos se almacenan en bases de datos h2.

En este tutorial vamos a ver cómo configurar la instalacción de demo que viene por defecto
con la distribución, en una base de datos MySQL; viendo alguna particularidad de la misma en relación a
lo que viene documentado en la guía oficial y la wiki; porque siguiendola paso a paso no funciona correctamente.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 15′ (2.4 GHz Intel Core i7, 8GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS X Lion 10.7.4
  • jBPM 5.4


3. Configuración.

Los pasos para realizar la configuración son los siguientes:

  • modificar los parámetros de persistencia del motor de procesos: que almacena las entidades de persistencia en relación a la trazabilidad y la información de métricas,
  • modificar los parámetros de persistencia del servidor de tareas: que almacena las entidades de persitencia relacionadas con el estado de las tareas, y
  • comprobar que disponemos de las tablas físicas con la nueva configuración.

No hay un motivo aparente para no usar una misma configuración de persistencia para ambos repositorios, si bien, vamos a seguir esta dualidad en este tutorial.


3.1. Creación de los usuarios de base de datos.

Para llevar a cabo todo el proceso necesitaremos de una instancia de MySQL local con dos usuarios distintos:

  • usuario: task y contraseña: task
  • usuario: jbpm5 y contraseña: jbpm5

Además crearemos dos esquemas de base de datos:

  • task: con privilegios suficientes para que el usuario task pueda crear tablas, y
  • jbpm5: con privilegios suficientes para que el usuario jbpm5 pueda crear tablas.


3.2. Modificación de la configuración de ant.


3.2.1. build.properties

Debemos comentar todo lo relativo a h2 y descomentar lo relacionado con mysql:

# data base related properties
db.driver.jar=${install.home}/db/driver/${db.driver.jar.name}
db.driver.module.dir=${jboss.home}/modules/${db.driver.module.prefix}/main/
# default is H2
#db.name=h2
#db.driver.jar.name=${db.name}.jar
#db.driver.download.url=http://repo1.maven.org/maven2/com/h2database/h2/${H2.version}/h2-${H2.version}.jar
#other options are mysql
db.name=mysql
db.driver.module.prefix=com/mysql
db.driver.jar.name=${db.name}-connector-java.jar
db.driver.download.url=https://repository.jboss.org/nexus/service/local/repositories/central/content/mysql/mysql-connector-java/5.1.18/mysql-connector-java-5.1.18.jar


3.2.2. build.xml

Debemos sustituir

<!-- Start Demo -->
<target name="start.demo" depends="start.h2,start.jboss,start.eclipse" />

<!-- Start Demo (Eclipse) -->
<target name="start.demo.eclipse" depends="start.h2,start.eclipse" />

<!-- Start Demo (No Eclipse)-->
<target name="start.demo.noeclipse" depends="start.h2,start.jboss" />

<!-- Stop Demo -->
<target name="stop.demo" depends="stop.h2,stop.jboss" />

Por lo siguiente:

<!-- Start Demo -->
<target name="start.demo" depends="start.h2,start.jboss,start.eclipse" />

<!-- Start Demo (DB) -->
<target name="start.demo.db" depends="start.jboss, start.eclipse" />

<!-- Start Demo (DB, No Eclipse) -->
<target name="start.demo.db.noeclipse" depends="start.jboss" />

<!-- Start Demo (Eclipse) -->
<target name="start.demo.eclipse" depends="start.h2,start.eclipse" />

<!-- Start Demo (No Eclipse)-->
<target name="start.demo.noeclipse" depends="start.h2,start.jboss" />

<!-- Stop Demo -->
<target name="stop.demo" depends="stop.h2,stop.jboss" />

<!-- Stop Demo (DB)-->
<target name="stop.demo.db" depends="stop.jboss" />

Y corregir las siguientes líneas para añadir la versión de JPA que tiene configurado por defecto la build:

En el goal:

<target name="install.jBPM-gwt-console.into.jboss7" depends="check.jboss.version" if="jboss.version.is.7">

La tarea de copy de la unidad de persistencia debe ser esta:

<copy tofile="${install.home}/target/jbpm-gwt-console-server-war/WEB-INF/classes/META-INF/persistence.xml" overwrite="true" 
  file="${install.home}/db/jbpm-persistence-${jpa.version}.xml" failonerror="false"/>

En el goal

<target name="install.ht.war.into.jboss7" if="jboss.version.is.7">

La tarea de copy de la unidad de persistencia debe ser esta:

<copy tofile="${install.home}/target/jbpm-human-task-war/WEB-INF/classes/META-INF/persistence.xml" overwrite="true" 
  file="${install.home}/db/task-persistence-${jpa.version}.xml" failonerror="false"/>

De otro modo no hará referencia a los ficheros de sustitución correctos y seguirá funcionando con h2.
En la wiki, está documentada la necesidad de modificar los ficheros persistence.xml que se incluyen en los war.
Con lo corregido no es necesario.


3.3. Modificación de las unidades de persistencia.

jBPM hace uso de JPA para la persistencia de entidades con lo que tendremos que modificar tanto el
dialecto como el driver de base de datos en los siguientes puntos:


3.3.1. standalone.xml.

Debemos disponer de la siguiente configuración a nivel de datasources:

<datasource jta="true" jndi-name="java:jboss/datasources/jbpmDS" pool-name="jbpmDS" enabled="true" use-java-context="true" use-ccm="true">
  <connection-url>jdbc:mysql://localhost:3306/jbpm5</connection-url>
  <driver>mysql</driver>
  <pool>
    <min-pool-size>1</min-pool-size>
    <max-pool-size>40</max-pool-size>
    <prefill>false</prefill>
    <use-strict-min>false</use-strict-min>
    <flush-strategy>FailingConnectionOnly</flush-strategy>
  </pool>
  <security>
    <user-name>jbpm5</user-name>
    <password>jbpm5</password>
  </security>
  <validation>
    <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
    <validate-on-match>false</validate-on-match>
    <background-validation>false</background-validation>
  </validation>
</datasource>
<datasource jta="true" jndi-name="java:jboss/datasources/taskDS" pool-name="taskDS" enabled="true" use-java-context="true" use-ccm="true">
  <connection-url>jdbc:mysql://localhost:3306/task</connection-url>
  <driver>mysql</driver>
  <pool>
    <min-pool-size>1</min-pool-size>
    <max-pool-size>40</max-pool-size>
    <prefill>false</prefill>
    <use-strict-min>false</use-strict-min>
    <flush-strategy>FailingConnectionOnly</flush-strategy>
  </pool>
  <security>
    <user-name>task</user-name>
    <password>task</password>
  </security>
  <validation>
    <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
    <validate-on-match>false</validate-on-match>
    <background-validation>false</background-validation>
  </validation>
</datasource>
<drivers>
  <driver name="mysql" module="com.mysql">
    <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
  </driver>
</drivers>

Si solo creamos la primera fuente de datos, podríamos optar por persistir toda la información en un solo esquema.


3.3.2. task-persistence-JPA2.xml y jbpm-persistence-JPA2.xml

Debemos modificar el dialecto de base de datos para que haga referencia a MySQL en ambos ficheros:

  
  <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>          

Pero además debemos trasladar aquí la configuración de los ficheros de persitencia que están empaquetados
en los war puesto que estos, que son los que se utilizan como fuente para la instalación están desactualizados.

Asegurad que el fichero task-persistence-JPA2.xml tenga el siguiente código de inicio:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence version="2.0"
   xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
        http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="org.jbpm.task" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>java:jboss/datasources/taskDS</non-jta-data-source> 

Asegurad que el fichero jbpm-persistence-JPA2.xml tenga el siguiente código de inicio:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
  xmlns="http://java.sun.com/xml/ns/persistence" 
  xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd">

  <persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>java:jboss/datasources/jbpmDS</jta-data-source>
    <mapping-file>META-INF/JBPMorm-JPA2.xml</mapping-file>
    <mapping-file>META-INF/ProcessInstanceInfoMapping-JPA2.xml</mapping-file>
    <mapping-file>META-INF/ExtraIndexes.hbm.xml</mapping-file>
    
    <class>org.drools.persistence.info.SessionInfo</class>
    <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
    <class>org.drools.persistence.info.WorkItemInfo</class>    
    <class>org.jbpm.process.audit.ProcessInstanceLog</class>
    <class>org.jbpm.process.audit.NodeInstanceLog</class>
    <class>org.jbpm.process.audit.VariableInstanceLog</class>


3.3.3. task-service/resources/META-INF/persistence.xml.

Debemos modificar la configuración de hibernate (implementación de JPA que se usa para la persistencia) para que
tenga la siguiente:

  
  <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
  <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>
  <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/task" />
  <property name="hibernate.connection.username" value="task"/>
  <property name="hibernate.connection.password" value="task"/>
  <property name="hibernate.hbm2ddl.auto" value="update" />


3.3.4. Reinicio.

Si hemos instalado ya alguna vez, necesitaremos ejecutar los comandos:

  
ant clean.demo; ant install.demo

y despúes probaremos a arrancar con el comando:

  
ant start.demo.db

En el directorio jboss-as-7.1.1.Final/standalone/log podemos encontrar el fichero de trazas donde comprobaremos el correcto funcionamiento.

Si todo va bien deberíamos tener la siguiente estructura creada en MySQL:


3.2.5. Unificándolo en una sola base de datos.

Ahora que hemos visto como mantenerlo separado, vamos a configurarlo para que solo persista en la base de datos de jbpm5.
Para ello, sólo debemos modificar la configuración del data source en el fichero task-persistence-JPA2.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence version="2.0"
   xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
        http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="org.jbpm.task" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>java:jboss/datasources/jbpmDS</non-jta-data-source> 

Debemos volver a instalar haciendo un clean y después reiniciar

  
ant clean.demo; ant install.demo
ant start.demo.db


4. Referencias.


5. Conclusiones.

Tenemos que dejar de usar la instalación de demo ya! y empezar a mavenizar nuestros proyectos para desplegar cada módulo de una manera más simple, coming soon… 😉

Un saludo.

Jose

jmsanchez@autentia.com

1 COMENTARIO

  1. Excelente tutorial. Me ha funcionado perfectamente la integracion con MySQL, se han creado las tablas correctamente.

    Sin embargo cuando ingreso al aplicativo http://localhost:8080/jbpm-console me saltan un sinfin de errores.

    He batallado muchisimo para que se desplieguen las aplicaciones de la suite jBPM en el AS7 utilizando el archivo build.

    Podrias publicar un post o indicarnos que cosas son las que tuviste que modificar para que te funcionara esta version de jBPM 5.4?

    He visto el tutorial de la revision de jBPM que publican ustedes mismos, pero en ese post utilizan la version 5.3. y yo necesito la version 5.4.

    Saludos y muchas gracias de antemano

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad