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 |
|---|---|---|---|
|
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. |
|
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 |
|
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. |
|
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
-
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
-
Si se especifica schedule-at y auto-close-by-age está desactivado (0s) como opción, se utilizará el tiempo de schedule-at
-
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
-
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
|
| 2 | getName
|
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 |
|
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 |
|
Long |
Long.MAX_VALUE |
Propiedad que define el tamaño máximo del bulk. Se define por configuración de bulk. |