Jugando con jBPM #9 – Cambiando de DataSource

La idea del siguiente post es mostrar como cambiamos de fuente de datos de la configuración por defecto de jBPM. Esta tarea es bastante sencilla pero hay que tener un par de cosas en cuenta. Sino podemos pasar un rato largo sin saber que nos esta faltando.

Una de estas cosas básicas a tener en cuenta es que jBPM por defecto utiliza una fuente de datos llamada JbpmDS (por defecto), por lo tanto, la fuente de datos que vamos a crear va a llevar este nombre.

También tenemos que asegurarnos de que no tenemos otra fuente de datos con este nombre ya deployada, este comentario viene porque si estamos usando la suite jBPM, esta usa por defecto una base de datos hypersonic para funcionar. Y la configuración de esta fuente de datos que ya viene configurada en la suite se encuentra en /server/jbpm/deploy/jbpm-ds.xml.

En el caso de que estemos usando la suite jBPM deberemos hacer undeploy de este data source (podemos hacerlo  borrando el archivo o renombrándolo a jbpm-ds.xml.bak). Y luego hacer deploy de nuestra configuración de data source.

Teniendo estas cosas en claro vamos con los pasos necesarios para cambiar la fuente de datos.

1) Con JBoss Application Server abajo debemos agregar el JDBC driver correspondiente para el vendor de base de datos a la que nos queramos conectar. En este caso estoy usando postgreSQL 8.2 por eso el jar que agrego al directorio /server/jbpm/lib/ es: postgresql-8.2-508.jdbc3.jar que se puede descargar de la pagina oficial de postgreSQL. (http://jdbc.postgresql.org/download.html). Esto lamentablemente no lo podemos hacer cuando el server esta corriendo ya que este jar en el directorio lib no seria encontrado hasta que reiniciemos.

2) Buscamos en los ejemplos de JCA (Java Connector Architecture) un data source apropiado para el vendor que estamos usando. En este caso como el vendor es postgreSQL escogemos el archivo: server/docs/examples/jca/postgres-ds.xml. En este caso el directorio de inicio “server” hace referencia al directorio server de la distribución jBPM suite. En caso de que estemos usando un JBoss Application Server instalado por nosotros el directorio “server” vendría siendo la carpeta raíz del Application Server.

Si analizamos este archivo postgres-ds.xml vemos lo siguiente:

<datasources>
  <local-tx-datasource>
    <jndi-name>PostgresDS</jndi-name>
    <connection-url>jdbc:postgresql://[servername]:[port]/[database name]</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <user-name>x</user-name>
    <password>y</password>
        <!-- sql to call when connection is created.  Can be anything, select 1 is valid for PostgreSQL
        <new-connection-sql>select 1</new-connection-sql>
        -->

        <!-- sql to call on an existing pooled connection when it is obtained from pool.  Can be anything, select 1 is valid for PostgreSQL
        <check-valid-connection-sql>select 1</check-valid-connection-sql>
        -->

      <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
      <metadata>
         <type-mapping>PostgreSQL 7.2</type-mapping>
      </metadata>
  </local-tx-datasource>

</datasources>

Como podemos apreciar esto es un template que nosotros vamos a tener que completar con los datos de nuestra fuente de datos. (Recordar cambiar el nombre del data source a JbpmDS, case sensitive)

Algo que llama la atención en este archivo de template es la versión de type mapping que tiene asignada por defecto “PostgreSQL 7.2” y el comentario que aparece arriba de que nos fijemos en el archivo standardjbosscmp-jdbc.xml para ver los mapeos que podemos asignar acá. Este archivo (standardjbosscmp-jdbc.xml) se encuentra en el directorio server/jbpm/conf y en este caso si buscamos dentro de todo este archivo “PostgreSQL” vemos que tenemos 3 mapeos para este vendor de base de datos. Por eso en este caso vamos a cambiar el tipo de mapeo a “PostgreSQL 8.0” para adecuarnos a los mapeos correspondientes a la versión de base de datos que estamos utilizando.

3) Copiamos el archivo postgres-ds.xml al directorio deploy de nuestro JBoss AS y le cambiamos el nombre a jbpm-ds.xml (o a otro nombre que nos guste mas que cumpla con el formato *-ds.xml, para que el DataSource deployer lo reconozca y realise el deploy correspondiente). En este paso llenamos todos los datos correspondientes.

4) Una cosa muy importante a tener en cuenta es que si estamos cambiando de data source el dialecto que va a usar jBPM (en realidad hibernate) para comunicarse con la base de datos va a cambiar y por esto vamos a tener que cambiar las configuraciones de jBPM. Si estamos usando la Suite jBPM esto lo tenemos que hacer en:

server/jbpm/deploy/jbpm-console.war/WEB-INF/classes/hibernate.cfg.xml

como veran para esto (en la Suite jBPM) debemos descomprimir el archivo jbpm-console.war y convertirlo en un directorio (para hacer un exploded package), todo esto para editar ese archivo. En donde cambiamos la siguiente linea:

<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>

Por:

<!-- hibernate dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>

5) No hay que olvidar que antes de hacer deploys de nuestros procesos tenemos que tener creado el schema propio de jBPM, cosa que se puede hacer utilizando los scripts de creación de schemas que vienen con la suite jBPM.

6) Una vez que tenemos todo esto hecho , podemor arrancar el JBoss AS con ./run.sh -c jbpm en el directorio bin del mismo. Y comenzar a deployar nuestros procesos en este nuevo Data Source!

Cualquier comentario sera bienvenido!

9 thoughts on “Jugando con jBPM #9 – Cambiando de DataSource”

  1. Gracias por la info, coincidencialmente estaba buscando como usar postgresql con jbpm…. pero veo q pasaste del post #6 al #9 , no puedo ver el 7 ni el 8 puedo ver…

    Like

  2. Gracias por el comentario, te comento que si entras a https://salaboy.wordpress.com/category/jboss-jbpm/, podrás ver que ahí están todos los post que tienen que ver con jBPM, el problema de los números es debido a que estuve corrigiendo viejos posts y estos obtuvieron números mas altos, igualmente si entras a ese link que puse arriba veras todos los posts relacionados con jBPM (incluyendo el 7 y el 8), puede que estén en paginas anteriores.
    Gracias de nuevo!

    Like

  3. Gracias por la información, me sirvió para integrar mi jBPM 3.3.0GA con Oracle 10g.

    Con este post, e investigando un poco logré integrar mi jBPM en JBOSS con un repositorio externo de usuarios (tambien en Oracle) de la siguiente manera

    1) Cree tres vistas (JBPM_ID_USER2, JBPM_ID_GROUP2, JBPM_ID_MEMBERSHIP2) con los mismos campos y datos de las tablas originales de JBPM, pero agregandole los datos de mi aplicacion

    2) Alterar los mapeos de hibernate (‘hibernate.identity.hbm.xml’) en el jar “jbpm-identity.jar”, para que apunten a las vistas

    3) Alterar el jboss-service.xml (en el deploy de jbpm-service.sar) para que apunte a las vistas

    Mi pregunta es: ¿Había una forma mas ‘limpia’ de hacerlo?

    Like

  4. Buenisimo que hayas logrado integrar tu aplicacion con un esquema de usuario de tu aplicacion. En realidad si lo lograste adaptar, era porque tu esquema de usuarios se parecia al que propone jBPM.
    Lo mas limpio hubiera sido en vez de adaptar, crear tu propio esquema de usuarios y reemplazar jbpm-identity.jar que es un modulo hecho como para mostrar un esquema simple y no para ser usado en la vida real donde los esquemas de usuarios suelen ser mas complicados y por ahi no estar guardados en un esquema relacional.
    Creo que si ya lo adaptaste es lo mejor que puedes haber hecho. Por ahi habria que revisar como realizaste los mapeos de hibernate y como realizaste las adaptaciones. Pero si anda FELICITACIONES!
    Cualquier cosa espero tu comentario. No se si leiste mi post sobre identity component, por ahi puede llegar a aclararte algunas dudas sobre como reemplazar por completo jbpm-identity.
    Saludos!

    Like

  5. Hola, gracias por responder. Yo habia leido tu articulo acerca de jBPM Identity Component, pero como ando corto de tiempo lo que hice me pareció la solución más práctica, máxime teniendo en cuenta que no sé mucho de Hibernate. Si te interesa te podría enviar el procedimiento que hice.

    Tengo una pregunta. Sé como hacer test a definiciones de proceso que se crean en una JVM local (hay muchos ejemplos en la Web de esto). Pero me preguntaba si sería posible hacer test de una definición de proceso directamente en el JBoss, con la BD y la configuración que utiliza éste.. no se como sería, si subiendo al JBoss un servlet con el test, o mediante JNDI desde una JVM cliente. Cualquier cosa que me puedas orientar al respecto, te agradezco, ya que he hecho algunas pruebas fallidas, y ni siquiera se si esto es posible de llevar a cabo.

    Gracias.
    Luis Alfredo.

    Like

  6. Perfecto, si podrías enviarme lo que has hecho para revisarlo.
    En cuanto a tu pregunta, lo mas normal es hacer deploy de una definición de proceso mediante el metodo de la clase JbpmContext.deployProcessDefinition(), el cual manda a tu proceso a la base de datos. Luego en tu test creas una instancia a partir de esta definición usando otro metodo de JbpmContext.
    Para esto como podras imaginarte deberas crear un JbpmConfiguration y luego obtener un contexto a partir del mismo.

    Saludos! Espero que te sirva!

    Like

  7. Hola, voy a intentar tu propuesta y te comento

    Aqui va un instructivo, muy resumido
    (Se asume q el jbpm 3.3.0GA esta instalado en un JBoss 4.2.2GA). Cualquier punto en el que necesites mas detalle, me avisas

    OJO!! No se cambiaron las dependencias a la tabla JBPM_ID_PERMISSIONS,
    de pronto para algunas cosas que aun no se conocen sea necesario cambiar
    las dependencias a esta tabla

    (Sacamos una copia del usuario JBPM que se llame ‘JBPM2’, para no alterar el esquema original, esto se hace con import/export de Oracle)

    El esquema de la aplicacion externa es MIAP, tiene tres tablas que son USUARIOS (equivalente a JBPM_ID_USER), ROLES (equivalente a JBPM_ID_GROUP) y ROLES_USUARIOS (equivalente a JBPM_ID_MEMBERSHIP). Son equivalentes, pues a
    pesar de no tener los mismos campos, representan los mismos conceptos.
    – USUARIOS tiene los usuarios de la aplicacion
    – ROLES son agrupaciones de usuarios
    – ROLES_USUARIOS es la tabla con cruces de usuarios y roles

    * Poner a apuntar nuestro datasource de oracle
    al esquema JBPM2

    * ejecutar como usuario MIAP en Oracle

    grant select on usuarios to jbpm2;
    grant select on roles to jbpm2;
    grant select on roles_usuarios to jbpm2;

    * ejecutar como usuario SYSTEM en Oracle

    grant create view to jbpm2;

    * ejecutar como usuario JBPM2 en Oracle

    (Lo de los IDs + 1 millon es para no repetir IDs cuando la vista quede creada, se supone
    q esos IDs deben ser unicos)

    create or replace view jbpm_id_user2 as
    select u.usu_id id_, ‘U’ class_, u.login name_, u.email email_, u.password password_ from miap.usuarios u
    UNION
    select “ID_”+1000000,”CLASS_”,”NAME_”,”EMAIL_”,”PASSWORD_” from jbpm_id_user;

    create or replace view jbpm_id_group2 as
    select r.rol_id id_, ‘G’ class_, r.nombre name_, ‘miap’ type_, null parent_ from miap.roles r
    UNION
    select “ID_”+1000000,”CLASS_”,”NAME_”,”TYPE_”,”PARENT_” from jbpm_id_group;

    create or replace view jbpm_id_membership2 as
    select ru.rol_usu_id id_, ‘M’ class_, null name_, null role_, ru.usu_usu_id user_, ru.rol_rol_id group_ from miap.roles_usuarios ru
    UNION
    select
    “ID_”+1000000,”CLASS_”,”NAME_”,”ROLE_”,”USER_”+1000000,”GROUP_”+1000000 from jbpm_id_membership
    UNION
    select to_number (‘2’ || to_char(jg.id_ + 1000000) || to_char(u.usu_id)) id_, ‘M’ class_, null name_, null role_, u.usu_id user_, jg.id_ + 1000000 group_ from miap.usuarios u, jbpm_id_group jg where jg.name_=’user’;

    * Sacar copia de seguridad al archivo
    $JBOSS_HOME\server\default\deploy\jbpm\jbpm-enterprise-bundle.ear\jbpm-identity.jar

    * Cambiar el archivo ‘hibernate.identity.hbm.xml’ en el jar: Cambiar todas las ocurrencias de JBPM_ID_USER por JBPM_ID_USER2, las de JBPM_ID_GROUP por JBPM_ID_GROUP2 y las de JBPM_ID_MEMBERSHIP por JBPM_ID_MEMBERSHIP2

    ) Sacar copia de seguridad al archivo

    $JBOSS_HOME\server\default\deploy\jbpm\jbpm-service.sar\META-INF\jboss-service.xml

    ) Cambiar en ese archivo todas las ocurrencias de JBPM_ID_USER por JBPM_ID_USER2,
    las de JBPM_ID_GROUP por JBPM_ID_GROUP2 y las de JBPM_ID_MEMBERSHIP por JBPM_ID_MEMBERSHIP2

    Like

  8. Buenos dias:
    Llevo dos dias intentando buscar informacion relacionada con el despliegue de jbpm en OC4J (Oracle). Si fueras tan amable de echarme una mano al respecto te lo agradeceria.
    Un saludo y gracias de antemano.
    Claudia

    Like

  9. Saludos agradecido excelente tus articulo te felicito, queria avisarte tambien que el link de taskcontroller esta roto …

    Like

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.