aprendizaje activiti

La exposición de los granos de configuración en las expresiones y secuencias de comandos

Configuración de frijol pública en las expresiones y secuencias de comandos

Por defecto, todos los granos que se especifican en la configuración activiti.cfg.xml o en su propio archivo de configuración de Spring están disponibles a expresiones y en los guiones. Si desea limitar la visibilidad de los granos en el archivo de configuración, puede configurar una propiedad llamada frijoles en la configuración de su motor de procesos. La propiedad frijoles en ProcessEngineConfiguration es un mapa. Cuando se especifica que la propiedad, sólo los granos que se especifican en ese mapa serán visibles a las expresiones y secuencias de comandos. Los granos expuestos serán expuestos con los nombres como se especifica en ese mapa.

Por defecto, la configuración o en su propio archivo de configuración de Spring especifican en el grano activiti.cfg.xml todas las expresiones y las secuencias de comandos están disponibles. Si desea limitar la visibilidad archivo de configuración de frijol, se puede configurar una propiedad llamada frijoles en la configuración del motor de procesos. ProcessEngineConfiguration granos de propiedad es un mapa. Cuando se especifica esta propiedad, la expresión de frijoles y peces especificado en el guión sólo es visible en el mapa. El grano se abrirá especifica el nombre de la cartografía en público.

Configuración de la caché de despliegue (configuración de la caché de despliegue)

Todo el proceso de definición se almacenan en caché (después de ser analizados) para evitar golpear la base de datos cada vez que se necesita una definición de proceso de datos y debido a la definición del proceso no cambia. Por defecto, no hay límite en esta caché. Para limitar el proceso de caché definición, añadir siguiente propiedad

Todo el proceso de definición se han encontrado con la base de datos de caché (después del análisis), con el fin de evitar la necesidad de cada definición de procesos, definición de procesos ya que los datos no cambia. Por defecto, esta caché es ilimitado. Para limitar la definición del proceso de almacenamiento en caché, agregue la siguiente configuración propertyexpose frijol en las expresiones y secuencias de comandos

<property name="processDefinitionCacheLimit" value="10" />

Al establecer esta propiedad intercambiará la caché HashMap defecto con un caché LRU que tiene el límite de hardware proporcionado. Por supuesto, el mejor valor de esta propiedad depende de la cantidad total de definiciones de procesos almacenados y el número de definiciones de procesos realmente utilizados en tiempo de ejecución por todas las instancias de proceso en tiempo de ejecución.

También puede inyectar su propia implementación de caché. Este debe ser un bean que implementa la interfaz org.activiti.engine.impl.persistence.deploy.DeploymentCache:

<property name="processDefinitionCache">

Hay una propiedad similar llamado knowledgeBaseCacheLimit y knowledgeBaseCache para la configuración de la caché de reglas. Esto sólo es necesario cuando se utiliza la tarea reglas en sus procesos.

Hashmap el modo de caché predeterminada, el tamaño de la memoria caché depende de la configuración y el número de procesos y el número del número total de hardware personalizados procesos realmente utilizados.
Podemos también inyectar su propia implementación de caché, hay que implementar la interfaz org.activiti.engine.impl.persistence.deploy.DeploymentCache
tener una propiedad similar llamado knowledgeBaseCacheLimit y knowledgeBaseCache, que se utiliza para configurar la regla de caché. Sólo cuando se utiliza una tarea regla en el proceso de hacerlo.

Inicio sesión

Todos los registros se encaminan a través SLF4J, y le permite seleccionar el registro que hemos elegido para conseguir.
Por defecto, no hay SFL4J vinculante frasco en dependencias activiti-motor con el fin de utilizar el marco lógico que elija, debe añadirlo a su proyecto. Si no se agrega ningún frasco de aplicación, SLF4J utilizará un NOP-logger, no registró ningún registro, sólo una advertencia no registra ningún registro.
activiti-ui y aplicaciones web activiti-descanso está configurado para usar Log4j vinculante. Cuando todas las pruebas activiti- * módulos funcionan, también usar Log4j.

Los controladores de eventos (controlador de eventos)

El mecanismo de eventos en el motor Activiti le permite recibir una notificación cuando se producen varios eventos dentro del motor. Echar un vistazo a todos los tipos de eventos admitidos para una visión general de los eventos disponibles.

Eventos del motor de mecanismo de tiviti permite que se le notifique cuando varios eventos ocurren en el motor. Ver todos los tipos de eventos admitidos, con el fin de obtener una visión general de los eventos disponibles.

Todos los eventos distribuidos son un subtipo de org.activiti.engine.delegate.event.ActivitiEvent. Las revelaciones de eventos (si está disponible) el tipo, executionID, processInstanceId y processDefinitionId

Todos los eventos se realizan subtipos de org.activiti.engine.delegate.event.ActivitiEvent. Este evento está abierto (si está disponible) Tipo executionID, processInstanceId y processDefinitionId

Un ejemplo de detector de eventos

public class MyEventListener implements ActivitiEventListener {

  @Override
  public void onEvent(ActivitiEvent event) {
    switch (event.getType()) {

      case JOB_EXECUTION_SUCCESS:
        System.out.println("A job well done!");
        break;

      case JOB_EXECUTION_FAILURE:
        System.out.println("A job has failed...");
        break;

      default:
        System.out.println("Event received: " + event.getType());
    }
  }

  @Override
  public boolean isFailOnException() {
    // The logic in the onEvent method of this listener is not critical, exceptions
    // can be ignored if logging fails...
    return false;
  }
}

Hay algunas implementaciones de bases proporcionadas por Activiti para facilitar casos de uso común de eventos-oyentes. Estos pueden ser utilizados como base de clase o como una implementación de ejemplo oyente:
org.activiti.engine.delegate.event.BaseEntityEventListener: Un evento de escucha de la base de la clase que se puede utilizar para detectar los eventos relacionados con la entidad, para un tipo específico de entidad o para todas las entidades. Se esconde el tipo de comprobación y ofrece 4 métodos que tienen que ser cambiados: onCreate (...), onUpdate (...) y onDelete (...) cuando se crea una entidad, actualizada o eliminada. Para todos los demás eventos entidad relacionada, la onEntityEvent (...) se llama.

Activiti ofrece algunos casos básicos de uso común para lograr la promoción del detector de eventos. Estos ejemplos se pueden utilizar como base o como oyentes se dan cuenta:
org.activiti.engine.delegate.event.BaseEntityEventListenerr: un detector de eventos de la clase base puede escuchar a un tipo particular de entidad o entidades a todas las entidades eventos relacionados. Oculta la comprobación de tipos, y proporciona cuatro métodos deben ser cubiertos: onCreate (...), onUpdate ( ...) y onDelete (...) cuando se crea una entidad, actualizada o eliminada. Para todos los otros eventos relacionados con la entidad serán llamados onEntityEvent (...).

Configurar detector de eventos de la siguiente manera:

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    ...
    <property name="eventListeners">
      <list>
         <bean class="org.activiti.engine.example.MyEventListener" />
      </list>
    </property>
</bean>

También se puede configurar para realizar un tipo de detectores de eventos:

<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
    ...
    <property name="typedEventListeners">
      <map>
        <entry key="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" >
          <list>
            <bean class="org.activiti.engine.example.MyJobEventListener" />
          </list>
        </entry>
      </map>
    </property>
</bean>

El código se puede añadir mediante la ejecución de monitor, interfaces API como sigue:

/**
 * Adds an event-listener which will be notified of ALL events by the dispatcher.
 * @param listenerToAdd the listener to add
 */
void addEventListener(ActivitiEventListener listenerToAdd);

/**
 * Adds an event-listener which will only be notified when an event occurs, which type is in the given types.
 * @param listenerToAdd the listener to add
 * @param types types of events the listener should be notified for
 */
void addEventListener(ActivitiEventListener listenerToAdd, ActivitiEventType... types);

/**
 * Removes the given listener from this dispatcher. The listener will no longer be notified,
 * regardless of the type(s) it was registered for in the first place.
 * @param listenerToRemove listener to remove
 */
 void removeEventListener(ActivitiEventListener listenerToRemove);

Es posible que se agregó a la pantalla de definición de procesos, configuración XML es el siguiente:

<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener class="org.activiti.engine.test.MyEventListener" entityType="task" />
    <activiti:eventListener delegateExpression="${testEventListener}" events="ENTITY_CREATED" entityType="task" />
  </extensionElements>

  ...

</process>

EntityType valores pueden ser: el apego, el comentario, la ejecución, la identidad-link, trabajo, de instancia de proceso, proceso de definición, la tarea.

Otra manera de tratar con eventos programados se tiran BPMN caso 1 . Recuerde, utilice sólo un tipo específico de tipos de eventos lanzados Activiti BPMN-eventos tiene sentido. Por ejemplo, cuando se elimina una instancia de proceso lanza evento BPMN dará lugar a un error. Los siguientes fragmentos de muestra en el código cómo lanzar en una instancia de proceso de señal, lanza una señal al flujo externo (global), lanza una instancia de proceso mensaje de evento, un evento de error es lanzada en la instancia de proceso. Propiedades throwEvent uso junto con una propiedad adicional, en lugar de utilizar la clase o delegateExpression, específico para el tipo de evento que se lance.

<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener throwEvent="signal" signalName="My signal" events="TASK_ASSIGNED" />
  </extensionElements>
</process>


<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener throwEvent="globalSignal" signalName="My signal" events="TASK_ASSIGNED" />
  </extensionElements>
</process>


<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener throwEvent="message" messageName="My message" events="TASK_ASSIGNED" />
  </extensionElements>
</process>

<process id="testEventListeners">
  <extensionElements>
    <activiti:eventListener throwEvent="error" errorCode="123" events="TASK_ASSIGNED" />
  </extensionElements>
</process>

Notas sobre los oyentes en un proceso de definición (definidos en el oyente proceso descrito)

1, Event-oyentes sólo puede declararse en el elemento de proceso, como un elemento hijo del extensionElements. Los oyentes no pueden ser definidos en las actividades individuales en el proceso.

2, las expresiones utilizadas en la delegateExpression no tienen acceso a la ejecución en el contexto, como otras expresiones (por ejemplo, en pasarelas) tienen. Sólo pueden hacer referencia a los granos definidos en la propiedad granos de la configuración del motor de proceso o cuando se utiliza de resorte (y la propiedad granos está ausente) a cualquier resorte-bean que implementa la interfaz oyente.

3, cuando se utiliza el atributo de clase de un oyente, sólo habrá una única instancia de esa clase creado. Asegúrese de que las implementaciones de escucha no se basan en miembros de la campos o garantizar un uso seguro de múltiples hilos / contextos.

4, cuando se utiliza un tipo de evento ilegal en el atributo de eventos o el valor throwEvent ilegal se utiliza, una excepción se inicia cuando el proceso de definición se despliega (no de manera efectiva el despliegue). Cuando se suministra un valor no válido para la clase o delegateExecution (ya sea una clase inexistente, una referencia frijol inexistente o un delegado no implementar interfaz de escucha), se produce una excepción cuando se inicia el proceso (o cuando el primer evento válido para ese proceso- definición es enviado al oyente). Asegúrese de que las clases referenciadas están en la ruta de clase y que la determinación de las expresiones de una instancia válida.

1, sólo como el detector de eventos una declaración extensionelement elemento secundario en los elementos del proceso. No se puede definir en un solo proceso de escucha de eventos.

2, y otras expresiones (por ejemplo, en una puerta de enlace) es diferente expresiones utilizados en el contexto de ejecución no delegateExpression acceso. Sólo pueden ser definidas en las propiedades de flujo de los granos en la configuración del motor de la haba, o en el uso de cualquier resorte de frijol de resorte (frijoles y el atributo está ausente), una referencia a las implementaciones oyente.

3, cuando el atributo de clase oyente, crea una instancia de la clase única. Asegúrese de que la aplicación no depende de que el oyente o asegurar que los miembros del campo de múltiples hilos / contexto seguro para su uso.

4, cuando el uso de eventos Tipo de evento ilegales en la propiedad o el valor de uso throwEvent ilegal, se producirá una excepción (fallo de implementar realmente) en la definición del proceso de implementación. Cuando una clase o el valor delegateExecution ilegal proporcionan (una categoría que no existe, no hay comisión de referencia o frijol no implementa la interfaz oyente) lanzará una excepción cuando este proceso se inicia (o cuando la primera definición del proceso de evento válido asignado para el oyente). Asegúrese de que la clase referenciada en la ruta de clases, y resuelve de expresión a una instancia válida.


  1. Esta es una característica experimental ↩︎

Publicado 16 artículos originales · ganado elogios 1 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/a0604030212/article/details/105158759
Recomendado
Clasificación