Diseño en línea de Activiti: ¿cómo diseñar y asociar formularios en Activiti6.0?
Enlace web
,
Activiti6 y activiti5 están integrados de la misma manera.
1. ¿Por qué integración?
Activiti versión 5.10 integra el módulo ActivitiModeler independiente original en ActivitiExplorer, que es fácil de usar. El modelo de proceso diseñado por Modeler se puede implementar directamente en el motor o el proceso implementado se puede convertir en un modelo para editarlo en Modeler.
También existe esta demanda en aplicaciones prácticas. Integre Modeler en el sistema empresarial y puede ser utilizado por administradores o existir como parte de la plataforma BPM. Lamentablemente, el gobierno no proporciona documentación sobre cómo integrar Modeler.
2. Trabajo de integración
2.1 Descargar el código fuente
Primero, necesitas descargar el código fuente de Github:
2.2 Copie el archivo
Todos los archivos copiados están en el directorio activiti-webapp-explorer2.
En src/main/resources, apunte al directorio raíz del código fuente del proyecto, asegurándose de que esté ubicado en el directorio raíz de la clase después de la compilación.
Coloque la API, el editor, el administrador de recursos y las bibliotecas en src/main/webapp en el directorio webapp del proyecto (en el mismo nivel que el directorio WEB-INF).
2.3 Agregar dependencias
123456789101112131415161718192021222324
ltdependency gt_ _ ltgroupid gt lt/groupid gt;_ _ ltartifactid gtactive browserlt/artifact id gt ;_ _ltversiongt5.14lt; /version gt;_ _ltExclusionsgt_ _ _ _ltExclusionsgt_ _ _ _ _ _ ltartifactid gtvaadin lt/artifact id gt;_ _ _ _ _ ltgroupid gt lt/groupid gt;_ _ _ _ lt/exclusion gt;_ _ _ _ ltexcludegt_ _ _ _ _ _ ltartifactid gtdcharts-widget lt;/id de artefacto gt;_ _ _ _ _ _ ltgroupid gt lt/groupid gt;_ _ _ _ _ _ _ _ lt /exclusionsgt;_ _lt/exclusionsgt.
lt/dependency >
2.4 Agregar clase Java
Agregue una clase y guárdela en el proyecto, registre algunas rutas restantes.
1234567891011121314151617181920212223242526272829
Embalaje; importar; importar; importar;
publicflorerrestapplication(){ _ _ super(); _/* * _ * crea un rootrestlet que recibirá todas las llamadas entrantes. _ */_ @ Override _ publicsynchronizedRestletcreateInboundRoot(){ _ _ enrutador enrutador = nuevo enrutador (obtener contexto()); __(enrutador __(enrutador) jsonpfilter = newJsonpFilter(obtener contexto()); );__(router);_ _ returnjsonpFilter_}
}
Configuración 2.5
Agregue la siguiente configuración al archivo:
12345678910111213141516
lt! - Adaptador Restlet, utilizado para exponer la funcionalidad del modelo a través de REST-gt; ltservlet gt_ _ ltservlet-name gt; RestletServlet lt/servlet-name gt; -nombre de clase de aplicación- > gt;
lt! -CatchallServiceRequests- gt; ltservlet-mapping gt_ _ ltservlet-name gt; RestletServlet lt/servlet-name gt; _ _ lturl-pattern gt/service/* lt; p>
Controlador 2.6
Utilice SpringMVC para crear un paquete simple; también se pueden utilizar otras implementaciones de MVC.
1234567891011121314151617181920212223242526272829303132333435363738 39404142434445464748495051525354556575859606162 021131 141151161171181191201211221236 5438 02412512612712812913013113213313413513613713813965 438 04014114214314414514614714 8149150 15115215315465438 055156157158159160161162163
Embalaje;
Importar;Importar;
Importar;Importar; p >
importar; importar; importar; >
/* * *Controlador del modelo de proceso* * @ autor Henry Yan */@ Controlador @ solicitud de mapeo(valor = "/workflow/Model ")PubliclyClassModelController {
protectedLoggerlogger =(get class() );
@ auto cableado _ RepositoryServicerepositoryService;
/* * _ * lista de modelos _ */_ @ solicitud de mapeo (valor = " lista ")_ publicmodeadviewmodelist(){ _ _ modeland view MAV = newmodelandview(" flujo de trabajo/lista de modelos ");
list();__("list", list);_ _ returnmav_}
/* * _ * Crear modelo _ */_ @ solicitud de mapeo (valor = " Create ")_ public void Create( @ solicitud de parámetro ("nombre") nombre de cadena, @ solicitud de parámetro ("clave") clave de cadena, @ solicitud de parámetro ("descripción") descripción de cadena, _ _ _ _ _ HttpServletRequestrequest, respuesta de respuesta de servlet http){ _ _ intentar { _ _ _ ObjectMapperobjectMapper = nuevo mapeador de objetos(); _ _ _ ObjectNodeeditorNode =(); _ _ _("id", "canvas"); () ;___("namespace","#");_ _ _ _ _ _("stencils et",stencils etnode);_ _ _ modelo datos del modelo =();
objectnodemodeobjectnode =( ) ;_ _ _(_nombre, título);___(_REVISION,1);_ _ _descripción=(descripción);_ _ _(_descripción, descripción);___(());___(nombre);___( (Clave punto));
(datos del modelo);___((), ().getBytes(" utf-8 "));
(() "/servicio/editor ? id = " ()); _ _ } catch (excepción uno) { _ _ _ _ _ _("Error al crear el modelo: ", __}_}
/* * _ *Proceso de implementación basado en model_ */_ @ mapeo de solicitud(valor = "Implementar/{ ModelID } ")_ Public String Deploy(@ variable de ruta(" ModelID ")Cadena ModelID, atributos de redirección){ _ _ Pruebe { _ _ Modelo datos =(ModelID)_ _ ObjectNodemodelNode =(nodo de objeto)nuevo asignador de objetos(). readTree((()));_ _ _ byte[]bpmn bytes = null;
BpmnModelmodel = newBpmnJsonConverter(). converttobpmnmmodel(modelNode); convertToXML(modelo);
StringprocessName=() ".;___Deploymentdeployment=().Name(()).addString(processName, newString(bpmnBytes)).
implementar();_ _ _ _ _ _("Mensaje", "Implementación exitosa, ID de implementación = " ()) _ _} catch (excepción e) {_ _("El proceso de implementación falló según el modelo: modelId= { }", modelId, e); _ } _ _ return " redirección:/workflow/model/list "; _}
/* * _ *Exportar modelo _ */_ @RequestMapping archivo xml ( valor = " Exportar/{ modelid } ")_ publicvidexport(@ variable de ruta(" modelid ")cadena modelid, respuesta del servlet http){ _ datos del modelo = (modelid). _ _ _ BpmnJsonConverterjsonConverter = newBpmnJsonConverter(); _ _ _ JsonNodeeditorNode = nuevo asignador de objetos(). readTree((()));_ _ _ BpmnModelbpmnModel =(nodo editor);_ _ _ bpmnxmlconverterexmlconverter = newpmnxmlconverter();_ _ _ byte[]bpmn bytes =(modelo bpmn);
bytearrayiputstream en = newbytearrayiputstream(bpmn bytes); ___(en, ()); ___Stringfilename=(). getId() " "; ___("Disposición de contenido", "Adjunto; nombre de archivo = " nombre de archivo); ___(); : modelId ={}", modelId, e);__}_}
} lt/pre gt;
###2.7 Precauciones
Si se usa Es un motor proxy Spring y hay archivos en el proyecto (ya sea el directorio principal/recursos o el directorio prueba/recursos). De lo contrario, cuando se abra la página del editor Modeler, los datos leídos devolverán **204 **Código de estado.
ltpreclass="brush:xml " > ltproperty name = " nombre del motor de proceso " value = " test " gt; lt/property gt;
Motor predeterminado El el nombre es el predeterminado. () Al realizar la consulta, primero recupere los recursos/principales y luego recupere el archivo de suma de prueba/recursos. Por lo tanto, cuando main/resources no logra monitorear el archivo especificado, el motor será tratado como el objeto de motor de la aplicación web, lo que dará como resultado dos motores y, por lo tanto, el nombre del motor se cambiará al no predeterminado "predeterminado". ".
##3. Solución al problema de los caracteres chinos confusos
Agregar parámetros a los parámetros de JVM:
gt-=UTF-8-=UTF-8. p>
* *Referencia* *: [El proceso diseñado en activiti modeler no se puede implementar cuando contiene un número impar de caracteres chinos] (
##4. Captura de pantalla del efecto
ActivitiModeler se ha integrado en la última versión de kft-activiti-demo (1.7.0), puedes acceder a él online o descargarlo para aprender a configurarlo
Inicia sesión [<. /p>
! Captura de pantalla del efecto](/files/2013/03/)! [Captura de pantalla del efecto en kft-activiti-demo](/files/2013/03/) lt;/model gt;
¿Cómo usar Activiti6? ¿Diseñar y asociar formularios en 0? Agregue una tarea de usuario vinculada y luego podrá agregar un formulario inmediatamente, así como scripts, estilos y WebAPI. Después de eliminar la tarea de usuario, puede dejarla como está. para cuidar la versión anterior del formulario de definición de proceso, y no se puede eliminar. Si se modifica la tarea de usuario del enlace, por ejemplo, se agregan dos campos al enlace A y dos campos se reducen al enlace b. luego debe volver a crear el formulario y el script para los dos enlaces A y b, estilo y WebAPI, porque el formulario cambió, el negocio cambió y el SQL (tabla) también cambió
<. p>Descargue el epub "Activiti in Action" en línea para leer el texto completo, descargue el disco de red del libro electrónico Baidu Netdisk Cloud Resource "Activiti in Action" (Yan) para leerlo en línea de forma gratuitaEnlace: p>
Código de extracción: xdni
Título: Activiti en acción
Valoración: 7,2
Autor: Yan
Editorial: _ Daodangai
Año de publicación: 2015-1-1
Número de páginas: 508
Introducción al contenido:
Práctica de Activiti se basa en la práctica, no solo permite que los lectores sepan qué es, sino que también comprende completamente la arquitectura, las funciones, el uso, las técnicas y las mejores prácticas de Activiti. Tiene suficiente amplitud y, para que los lectores sepan por qué, es suficiente tener una entrada. -Comprensión profunda de la implementación del código fuente de Activiti, los patrones de diseño y PVM.
"Activiti en la práctica" consta de cuatro partes: Capítulo de preparación (Capítulo 0 ~ 2) Presenta los conceptos, características y aplicaciones. arquitectura y construcción y configuración del entorno de desarrollo, el capítulo básico (Capítulos 3 ~ 4) primero explica el uso detallado de las dos herramientas de diseño de procesos ActivitiModeler y ActivitiDesigner, y luego explica en detalle la especificación BPMN2.0; Práctica (5); ~14) explica sistemáticamente el uso, las técnicas y las mejores prácticas de Activiti, incluida la definición de procesos, instancias de procesos, tareas, subprocesos, instancias múltiples, eventos y oyentes. El capítulo avanzado (15 ~ 21) explica que Activiti no es solo un motor, sino que en realidad es una plataforma BPM que integra varios servicios y middleware como WebService, motor de reglas, JPA y ESB. Finalmente, se analizan sus patrones de diseño y PVM a través del código fuente.
Acerca del autor:
El ingeniero y arquitecto senior de desarrollo de software Yan (Coffee Rabbit) ha contribuido con una gran cantidad de código a Activiti y ha trabajado mucho para promover Activiti en China. Tiene gran prestigio y popularidad en la sociedad y es conocido como la persona número uno en el campo de las actividades chinas. Durante muchos años, he estado involucrado en el desarrollo y diseño de arquitectura de OA, ERP y otros sistemas, y he estado prestando atención e investigando en profundidad los motores de flujo de trabajo. Actualmente trabajo como arquitecto en Maxiao Automobile Company, responsable de la construcción de la plataforma de flujo de trabajo interno de la empresa.