Desarrollo de BPM juvenil elegante y de moda en Camunda

imagen

El desarrollo de BPM no es f谩cil. Esto se debe al hecho de que el proceso debe ser legible y comprensible para el cliente, y no solo correcto desde un punto de vista t茅cnico.

No todas las herramientas para desarrollar procesos comerciales le permiten encontrar un compromiso entre una descripci贸n clara y la funcionalidad t茅cnica. Muchas herramientas avanzadas de desarrollo y descripciones de procesos a menudo tienen un inconveniente m谩s: son tan geniales, poderosas y complejas que, mientras se realizaban, las tecnolog铆as dieron un gran paso adelante y el desarrollo con dicha herramienta se volvi贸 irrelevante.

2018 cambi贸 fundamentalmente nuestro enfoque para el desarrollo de procesos comerciales. A continuaci贸n se muestra c贸mo ha evolucionado este enfoque y c贸mo hemos cambiado.

En lugar de un pr贸logo


Nuestro departamento se dedica al desarrollo de procesos comerciales, desde el m谩s peque帽o y m谩s peque帽o hasta el m谩s grande y extremadamente rentable. Hasta hace poco, utilizamos un producto de IBM para el desarrollo, lo que nos permite lanzar r谩pidamente un proceso comercial en producci贸n.

IBM BPM es una plataforma poderosa que incluye un amplio conjunto de caracter铆sticas, como una descripci贸n de los procesos en s铆, formularios de IU y m贸dulos de integraci贸n. Adem谩s, esta plataforma tiene un umbral de entrada bastante bajo, que permite a los desarrolladores novatos sumergirse de inmediato en el proyecto. Pero este producto tambi茅n tiene inconvenientes que, si no inhiben el desarrollo, ciertamente no contribuyen a la velocidad y la calidad:

  • No hay control de versiones sensatas. IBM BPM simplemente no proporciona la capacidad de almacenar adecuadamente los procesos (c贸digo) en el repositorio y utiliza su propio repositorio, que no conoce un concepto como la fusi贸n, por ejemplo.
  • Desarrollando en Java 6. Quiz谩s en el momento de escribir esto, ya es posible desarrollar en Java 7, pero en 2019 esto es un poco de comodidad.
  • IBM BPM est谩 girando sobre WebSphere, como resultado, los desarrolladores deben ser pacientes con cada actualizaci贸n de su m贸dulo. Adem谩s, este es un dolor de cabeza adicional para los administradores que peri贸dicamente tienen que revivir a este monstruo si se cuelga.
  • El desarrollo de m贸dulos de integraci贸n en el entorno de Integration Designer, que de hecho no est谩 oculto para el mejor Eclipse.
  • No hay capacidad de prueba de unidad normal.
  • El alto costo de la plataforma.

Estas deficiencias, adem谩s de los inconvenientes puramente t茅cnicos del desarrollo, han creado otro problema, que es quiz谩s mucho m谩s grave que todo lo anterior. En los d铆as de Java 12, Kotlin, microservicios y otras tendencias y piezas de moda, todos estos matices desmotivan mucho al equipo. Es dif铆cil experimentar la alegr铆a de desarrollar en el Dise帽ador de integraci贸n para Java 6 en 2019.

imagen

Con todas estas limitaciones, es dif铆cil mantenerse a flote. Hace poco menos de un a帽o, hubo una oferta para probar el motor Camunda para describir los procesos comerciales. Para empezar, se seleccion贸 un proceso no muy grande pero bastante importante para registrar terminales para personas jur铆dicas.

Como lo reescribimos por completo, casi no hab铆a c贸digo antiguo, pr谩cticamente no pod铆amos limitarnos a nada y, por lo tanto, elegimos Kotlin como el lenguaje de desarrollo. Fue interesante probar este nuevo lenguaje, que se escuch贸 principalmente por cr铆ticas positivas. En algunos otros proyectos en nuestro departamento hubo una exitosa experiencia de implementaci贸n. La pila final result贸 as铆: Camunda, Spring Boot 2, Kotlin, Postgre.

驴Qu茅 es la camunda?


imagen

Camunda es una plataforma de modelado de procesos empresariales de c贸digo abierto que est谩 escrita en Java y utiliza Java como lenguaje de desarrollo. Es un conjunto de bibliotecas que le permiten realizar los procesos descritos. Para integrar Camunda en un proyecto, solo agregue algunas dependencias. Para almacenar procesos, puede elegir DBMS en memoria o persistentes, dependiendo de las tareas. Elegimos Postgre, porque la historia es importante para nosotros para "debriefing". Por defecto, la plataforma se implementa en H2.

El desarrollo consta de dos partes: crear un proceso de flujo en una utilidad especial de Camunda Modeler y escribir c贸digo Java que procesa los pasos del proceso descritos en el diagrama. Para llamar al c贸digo java desde el proceso, es suficiente implementar la interfaz JavaDelegate, generar este Bean (puede especificar el retraso por el nombre completo, pero a trav茅s del Bean es m谩s conveniente y flexible) en el contexto y especificar su identificaci贸n en el paso del proceso deseado. En Kotlin, el delegado se ve a煤n m谩s sucinto. La l贸gica de los delegados es bastante simple: restaron algo del contexto, realizaron algunas acciones y lo volvieron a poner en contexto.

imagen
Ventana emergente de Camunda Modeler

Ejemplo de delegado de Java:


import org.camunda.bpm.engine.delegate.DelegateExecution; import org.camunda.bpm.engine.delegate.JavaDelegate; public class JavaExampleDelegate implements JavaDelegate { @Override public void execute(DelegateExecution execution) { String someVar = (String) execution.getVariable("someVariable"); // some actions execution.setVariable("otherVariable", "otherValue"); } } 

Ejemplo de delegado de Kotlin:


 import org.camunda.bpm.engine.delegate.DelegateExecution import org.camunda.bpm.engine.delegate.JavaDelegate class KotlinExampleDelegate: JavaDelegate { override fun execute(execution: DelegateExecution) { val someVar = execution.getVariable("someVariable") //some code execution.setVariable("otherVariable", "someValue") } } 

En el delegado, puede describir la l贸gica empresarial, la integraci贸n y todo lo que su coraz贸n desea.

Intentamos crear una capa en forma de un componente comercial con l贸gica, y utilizamos el delegado solo como un enlace al flujo del proceso para que el c贸digo y el proceso se mezclen lo menos posible.

En la mayor铆a de los casos, este enfoque es conveniente y funciona con 茅xito. La interacci贸n con el proceso se produce a trav茅s de DelegateExecution, que permite, por ejemplo, trabajar con contexto, incidentes, etc.

驴Es eso lo que quer铆amos?


Al principio, al elegir una herramienta, busc谩bamos una soluci贸n con las siguientes caracter铆sticas:

  • Recuperaci贸n del proceso exactamente desde el lugar donde ocurri贸 la falla, y es deseable que est茅 listo para usar.
  • Alguna GUI donde puedes ver qu茅 pasa con el proceso en general.
  • La capacidad de escribir pruebas unitarias no solo para la l贸gica y la integraci贸n, sino tambi茅n para el proceso en s铆.
  • Java 8 y superior.
  • Comunidad desarrollada

Camunda est谩 bien con recuperaci贸n y an谩lisis de errores.

Una traza bien legible, la capacidad de establecer el n煤mero de intentos de dar un paso antes de caer, un controlador personalizado al caer, por ejemplo, si durante una ca铆da queremos cambiar el estado de alguna entidad a Error. Esto 煤ltimo es f谩cil de hacer simplemente implementando DefaultIncidentHandler. Es cierto, hay un momento divertido cuando este controlador funciona: el c贸digo de recuperaci贸n de error se activa cada vez que ingresa el paso del proceso. No puedo decir que esto sea una superbacteria o un problema. Por el contrario, solo necesita recordar y considerar esto al desarrollar.

Lo resolvimos as铆:

 override fun resolveIncident(context: IncidentContext) { val incidentList = Context.getCommandContext().incidentManager.findIncidentByConfiguration(context.configuration) if (incidentList.isNotEmpty()) { //      } } 

Camunda tiene una GUI y no est谩 mal.

Pero si desea un poco m谩s, por ejemplo, la migraci贸n de instancias entre versiones de proceso, entonces tendr谩 que trabajar duro. La interfaz de usuario predeterminada solo tiene una funcionalidad m铆nima, pero hay una API de Rest muy poderosa que le permite crear su propio panel de administraci贸n, genial y sofisticado.

Fuimos a lo largo del camino de nuestro panel de administraci贸n. Nuestro arquitecto de procesos de negocios en poco tiempo lo vio inactivo, incluidas las funciones de ver el historial de procesos ya completados, la migraci贸n entre versiones, etc.

Camunda's Rest es realmente poderoso y le permite hacer casi cualquier cosa con los procesos. Por ejemplo, puede iniciar un proceso usando / process-definition / key / aProcessDefinitionKey / start con una solicitud tan simple:

 { "variables": { "aVariable" : { "value" : "aStringValue", "type": "String" }, "anotherVariable" : { "value" : true, "type": "Boolean" } }, "businessKey" : "myBusinessKey" } 

El ejemplo est谩 tomado de la documentaci贸n oficial, que contiene una descripci贸n extensa de los diversos casos de uso de esta API.

Para las pruebas unitarias, usamos el Junit habitual. Adem谩s, hay una biblioteca bastante interesante para probar el proceso en s铆 mismo: 'org.camunda.bpm.extension', nombre: 'camunda-bpm-afirmar'. Con 茅l, puede describir pruebas para verificar el proceso de flujo.

Esto es bastante conveniente, ya que a menudo es m谩s dif铆cil buscar problemas con errores en el flujo que en el c贸digo. Dichas pruebas protegen, por ejemplo, de la refactorizaci贸n inexacta y realmente nos ayudaron varias veces.

La necesidad de Java 8 ha desaparecido parcialmente, ya que el uso de Kotlin en muchos procesos elimin贸 la necesidad del G8. Kotlin encaja muy bien con el proyecto y le permite centrarse solo en escribir la l贸gica empresarial. Es dif铆cil de creer, pero b谩sicamente todo lo que Kotlin dice sobre la frescura es cierto. Las entidades con una gran cantidad de campos, que son conocidas por casi todas las aplicaciones con integraciones, ahora no parecen tan aterradoras, y las asignaciones entre entidades se han vuelto mucho m谩s legibles. A menudo criticado, la seguridad nula realmente funciona y ayuda en la mayor铆a de los casos.

La comunidad en Camunda est谩 bastante desarrollada. Esto se evidencia por el hecho de que constantemente aparecen nuevas bibliotecas en GitHub para pruebas y m茅tricas.

Es bueno que Camunda se integre perfectamente con Spring. Agregue las dependencias necesarias, un par de anotaciones y un par de beans de configuraci贸n; de hecho, 隆eso es toda la integraci贸n! Como resultado, escribimos una aplicaci贸n de primavera regular a la que todos est谩n acostumbrados, agregando el flujo de un proceso comercial. La interacci贸n se lleva a cabo a trav茅s de la API de Java, que le permite manipular procesos desde el c贸digo de Java.

Por ejemplo, puede iniciar el proceso con solo un comando:

 runtimeService.startProcessInstanceByKey( "MyTestProcess", "MyBusinessKey", mapOf( "key1" to "value1", "key2" to "value2", ) ) 

Aqu铆 MyTestProcess es el Id-shnik del proceso, no la instancia. MyBusinessKey es una clave 煤nica para una instancia de proceso en ejecuci贸n. Usualmente usamos alg煤n valor comercial para este campo, para una navegaci贸n m谩s r谩pida entre instancias y b煤squeda.

De la misma manera, puede despertar un proceso "somnoliento".

Los inconvenientes notables o cualquier problema que encontramos, especialmente no se pueden recordar. Como resultado, durante un per铆odo de tiempo bastante corto, result贸 ser un proceso completamente funcional y ponerlo en producci贸n de manera segura. Se est谩n implementando otros procesos en la plataforma y con bastante 茅xito. Ahora en Camunda hemos lanzado unas 15 aplicaciones en las que giran alrededor de 100 mil procesos a la vez.

imagen

En lugar de un ep铆logo


Aqu铆 hay algunos recursos que han sido 煤tiles para implementar la pila descrita anteriormente. Le recomiendo que los lea si est谩 interesado en obtener informaci贸n adicional sobre el tema.

Source: https://habr.com/ru/post/455860/


All Articles