Documentation for a newer release is available. View Latest

Finalización automática de un Bulk

La finalización automática puede basarse en el tiempo (intervalos programados o periódicos), o podría basarse en las características del Bulk, como el número de elementos o el tamaño total estimado del archivo de salida. El método de finalización se define en el momento en que se crea el Bulk por primera vez. Actualmente, admitimos tres tipos de finalización automática:

  • periodic (p. ej., 20 segundos después de que se crea el bulk)

  • scheduled time (p. ej., a medianoche)

  • auto close triggers (p. ej., componentFullnessAutoCloseTrigger — finalizar el bulk al alcanzar el número máximo de componentes)

Config Type Default Comment

scheduled-auto-close.auto-close-by-age

Duration

0

Valor de duración que define cuándo se programará la finalización automática del bulk con la ayuda del Scheduler. Los valores pueden ser cualquiera de los soportados por la clase java.time.Duration; si queremos excluir esta opción de la función, debemos especificar 0s como valor.

scheduled-auto-close.schedule-at

String

" " Cadena vacía

Se introduce una expresión CRON como valor, que se analiza y en base a la cual se programa el cierre automático del bulk. Si queremos desactivar esta función, debemos especificar "" como valor

auto-close-triggers

List<String>

[] Arreglo vacío

auto-close-triggers especifica una lista de disparadores que envían el bulk al estado finalizado después de que se han cumplido ciertos criterios. Los valores pueden ser el nombre en cadena de una implementación concreta de la interfaz AutoCloseTrigger. Si queremos excluir esta opción de la función, debemos especificar [] como valor.

finalise-on-auto-close

boolean

true

Valor booleano que describe si el bulk debe finalizarse después de cerrarse automáticamente por cualquier trigger (AutoClose); valor predeterminado true.

Ejemplo:

scheduled-auto-close = {
    auto-close-by-age = 20s
    schedule-at = "*/10 * * ? * *"
}

Importante: scheduled-auto-close.auto-close-by-age, scheduled-auto-close.schedule-at y auto-close-triggers se configuran a nivel de bulk y forman parte de la configuración general de ese bulk Ejemplo de configuración:

ipf.bulker {
  configurations = [
    {
      name = "pain.001.001.09"
      file-name-prefix = "bulk-"
      file-path = "/tmp/bulks"
      component-hierarchy {
        component-parser-name = "xml"
        marker = "Document"
        children = [
          {
            marker = "CstmrCdtTrfInitn.PmtInf"
            children = [
              {
                before-elements = ["SplmtryData"]
                marker = "CdtTrfTxInf"
              }
            ]
          }
        ]
      }
      auto-close-triggers = ["customAutoCloseTrigger"]
      maximum-component-size = 50
      scheduled-auto-close = {
        auto-close-by-age = 30s
        schedule-at = "*/10 * * ? * *"
      }
      finalise-on-auto-close = true
    }
]
}

Elección de qué tiempo usar

  1. Si se especifica auto-close-by-age y schedule-at está desactivado (cadena vacía "") como opción, se utilizará el tiempo de auto-close-by-age

  2. Si se especifica schedule-at y auto-close-by-age está desactivado (0s) como opción, se utilizará el tiempo de schedule-at

  3. Si se especifican ambos valores para la programación, se utilizará el valor más cercano al momento de creación del bulk para el auto close scheduler

  4. Si queremos desactivar el cierre automático del bulk, es necesario configurar auto-close-by-age = 0s y schedule-at = ""

@RequiredArgsConstructor
@Value
public class ScheduleAutoClose {

    Duration autoCloseByAge;
    String scheduleAtCron;

    @SneakyThrows
    public Instant scheduleAt(Instant createdAt) {
        if (autoCloseByAge == null && (scheduleAtCron == null || scheduleAtCron.isEmpty())) {
            throw new IllegalStateException("At least one of autoCloseByAge or scheduleAtCron must be set");
        }

        if (autoCloseByAge == null) {
            CronExpression cronExpression = new CronExpression(scheduleAtCron);
            return Objects.requireNonNull(
                            cronExpression.getNextValidTimeAfter(
                                    Date.from(createdAt.atZone(ZoneId.systemDefault()).toInstant())))
                    .toInstant();
        }

        if (scheduleAtCron == null || scheduleAtCron.isEmpty()) {
            return createdAt.plus(autoCloseByAge);
        }

        CronExpression cronExpression = new CronExpression(scheduleAtCron);
        Instant cronInstant = Objects.requireNonNull(
                cronExpression.getNextValidTimeAfter(
                                Date.from(convertToTimeZonedInstant(createdAt)))
                        .toInstant());
        Instant byAge = createdAt.plus(autoCloseByAge);
            return cronInstant.isBefore(byAge) ? cronInstant : byAge;
    }

    private Instant convertToTimeZonedInstant(Instant createdAt) {
        TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
        return Date.from(createdAt).toInstant();
    }
}

La interfaz ClientComponent se define como sigue.

public interface AutoCloseTrigger {
    boolean isTriggered(AutoCloseContext context); (1)
    String getName(); (2)
}
1 isTriggered
  • Define la condición tras la cual el bulk se envía al estado finalizado

2 getName
  • Nombre del trigger

Auto Close Triggers del núcleo

Bulk Component Fullness Auto Close

Un bulk está compuesto por varios componentes del mismo o diferente tipo; en nuestro caso, el tipo de componente no importa. Cuando el bulk alcanza un cierto número de componentes (los child bulks se tratan como componentes individuales), pasa automáticamente al estado de finalización y no se pueden agregar otros componentes porque el bulk está cerrado.

NOTA: 'maximum-component-size' se configura a nivel de bulk y forma parte de la configuración general de ese bulk.

Config

Type

Default value

Comment

maximum-component-size

Long

Long.MAX_VALUE

Propiedad que define el número máximo de componentes que puede contener un bulk. Se define por configuración de bulk.

Bulk Size Fullness Auto Close

Un bulk está compuesto por varios componentes del mismo o diferente tipo; en nuestro caso, el tipo de componente no importa. Cuando el bulk alcanza un cierto número de componentes, pasa automáticamente al estado de finalización y no se pueden agregar otros componentes porque el bulk está cerrado.

NOTA: 'maximum-bulk-size' se configura a nivel de bulk y forma parte de la configuración general de ese bulk.

Config

Type

Default Value

Comment

maximum-bulk-size

Long

Long.MAX_VALUE

Propiedad que define el tamaño máximo del bulk. Se define por configuración de bulk.