
org.jbpm.executor.commands.LogCleanupCommand Maven / Gradle / Ivy
/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jbpm.executor.commands;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.persistence.EntityManagerFactory;
import org.jbpm.executor.impl.jpa.ExecutorJPAAuditService;
import org.jbpm.process.core.timer.DateTimeUtils;
import org.jbpm.runtime.manager.impl.jpa.EntityManagerFactoryManager;
import org.kie.api.executor.Command;
import org.kie.api.executor.CommandContext;
import org.kie.api.executor.ExecutionResults;
import org.kie.api.executor.Reoccurring;
import org.kie.api.executor.STATUS;
import org.kie.api.runtime.process.ProcessInstance;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Log clean up command that aims at doing house keeping of audit/log tables used in jBPM:
*
* - process related audit logs (process instance, node instance, variables)
* - task related audit logs (audit task, task events)
* - executor related data (requests and errors)
*
* Command by default is auto configured to run once a day from the time it was initially scheduled though it can be reconfigured
* in terms of frequency when it is executed and if it shall run multiple times at all.
* Following is a complete list of accepted parameters:
*
* - SkipProcessLog - indicates if clean up of process logs should be omitted (true|false)
* - SkipTaskLog - indicates if clean up of task logs should be omitted (true|false)
* - SkipExecutorLog - indicates if clean up of executor logs should be omitted (true|false)
* - DateFormat - date format for further date related params - if not given yyyy-MM-dd is used (pattern of SimpleDateFormat class)
* - EmfName - name of entity manager factory to be used for queries (valid persistence unit name)
* - SingleRun - indicates if execution should be single run only (true|false)
* - NextRun - provides next execution time (valid time expression e.g. 1d, 5h, etc)
* - OlderThan - indicates what logs should be deleted - older than given date
* - OlderThanPeriod - indicated what logs should be deleted older than given time expression (valid time expression e.g. 1d, 5h, etc)
* - ForProcess - indicates logs to be deleted only for given process definition
* - ForDeployment - indicates logs to be deleted that are from given deployment id
*
*/
public class LogCleanupCommand implements Command, Reoccurring {
private static final Logger logger = LoggerFactory.getLogger(LogCleanupCommand.class);
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
private long nextScheduleTimeAdd = 24 * 60 * 60 * 1000; // one day in milliseconds
@Override
public Date getScheduleTime() {
if (nextScheduleTimeAdd < 0) {
return null;
}
long current = System.currentTimeMillis();
Date nextSchedule = new Date(current + nextScheduleTimeAdd);
logger.debug("Next schedule for job {} is set to {}", this.getClass().getSimpleName(), nextSchedule);
return nextSchedule;
}
@Override
public ExecutionResults execute(CommandContext ctx) throws Exception {
boolean skipProcessLog = ctx.getData().containsKey("SkipProcessLog")?Boolean.parseBoolean((String)ctx.getData("SkipProcessLog")):false;
boolean skipTaskLog = ctx.getData().containsKey("SkipTaskLog")?Boolean.parseBoolean((String)ctx.getData("SkipTaskLog")):false;;
boolean skipExecutorLog = ctx.getData().containsKey("SkipExecutorLog")?Boolean.parseBoolean((String)ctx.getData("SkipExecutorLog")):false;;
SimpleDateFormat formatToUse = DATE_FORMAT;
String dataFormat = (String) ctx.getData("DateFormat");
if (dataFormat != null) {
formatToUse = new SimpleDateFormat(dataFormat);
}
ExecutionResults executionResults = new ExecutionResults();
String emfName = (String)ctx.getData("EmfName");
if (emfName == null) {
emfName = "org.jbpm.domain";
}
String singleRun = (String)ctx.getData("SingleRun");
if ("true".equalsIgnoreCase(singleRun)) {
// disable rescheduling
this.nextScheduleTimeAdd = -1;
}
String nextRun = (String)ctx.getData("NextRun");
if (nextRun != null) {
nextScheduleTimeAdd = DateTimeUtils.parseDateAsDuration(nextRun);
}
// get hold of persistence and create instance of audit service
EntityManagerFactory emf = EntityManagerFactoryManager.get().getOrCreate(emfName);
ExecutorJPAAuditService auditLogService = new ExecutorJPAAuditService(emf);
// collect parameters
String olderThan = (String)ctx.getData("OlderThan");
String olderThanPeriod = (String)ctx.getData("OlderThanPeriod");
String forProcess = (String)ctx.getData("ForProcess");
String forDeployment = (String)ctx.getData("ForDeployment");
if (olderThanPeriod != null) {
long olderThanDuration = DateTimeUtils.parseDateAsDuration(olderThanPeriod);
Date olderThanDate = new Date(System.currentTimeMillis() - olderThanDuration);
olderThan = formatToUse.format(olderThanDate);
}
if (!skipProcessLog) {
// process tables
long piLogsRemoved = 0l;
piLogsRemoved = auditLogService.processInstanceLogDelete()
.processId(forProcess)
.status(ProcessInstance.STATE_COMPLETED, ProcessInstance.STATE_ABORTED)
.endDateRangeEnd(olderThan==null?null:formatToUse.parse(olderThan))
.externalId(forDeployment)
.build()
.execute();
logger.info("ProcessInstanceLogRemoved {}", piLogsRemoved);
executionResults.setData("ProcessInstanceLogRemoved", piLogsRemoved);
long niLogsRemoved = 0l;
niLogsRemoved = auditLogService.nodeInstanceLogDelete()
.processId(forProcess)
.dateRangeEnd(olderThan==null?null:formatToUse.parse(olderThan))
.externalId(forDeployment)
.build()
.execute();
logger.info("NodeInstanceLogRemoved {}", niLogsRemoved);
executionResults.setData("NodeInstanceLogRemoved", niLogsRemoved);
long viLogsRemoved = 0l;
viLogsRemoved = auditLogService.variableInstanceLogDelete()
.processId(forProcess)
.dateRangeEnd(olderThan==null?null:formatToUse.parse(olderThan))
.externalId(forDeployment)
.build()
.execute();
logger.info("VariableInstanceLogRemoved {}", viLogsRemoved);
executionResults.setData("VariableInstanceLogRemoved", viLogsRemoved);
}
if (!skipTaskLog) {
// task tables
long taLogsRemoved = 0l;
taLogsRemoved = auditLogService.auditTaskDelete()
.processId(forProcess)
.dateRangeEnd(olderThan==null?null:formatToUse.parse(olderThan))
.deploymentId(forDeployment)
.build()
.execute();
logger.info("TaskAuditLogRemoved {}", taLogsRemoved);
executionResults.setData("TaskAuditLogRemoved", taLogsRemoved);
long teLogsRemoved = 0l;
teLogsRemoved = auditLogService.taskEventInstanceLogDelete()
.dateRangeEnd(olderThan==null?null:formatToUse.parse(olderThan))
.build()
.execute();
logger.info("TaskEventLogRemoved {}", teLogsRemoved);
executionResults.setData("TaskEventLogRemoved", teLogsRemoved);
}
if (!skipExecutorLog) {
// executor tables
long errorInfoLogsRemoved = 0l;
errorInfoLogsRemoved = auditLogService.errorInfoLogDeleteBuilder()
.dateRangeEnd(olderThan==null?null:formatToUse.parse(olderThan))
.build()
.execute();
logger.info("ErrorInfoLogsRemoved {}", errorInfoLogsRemoved);
executionResults.setData("ErrorInfoLogsRemoved", errorInfoLogsRemoved);
long requestInfoLogsRemoved = 0l;
requestInfoLogsRemoved = auditLogService.requestInfoLogDeleteBuilder()
.dateRangeEnd(olderThan==null?null:formatToUse.parse(olderThan))
.status(STATUS.CANCELLED, STATUS.DONE, STATUS.ERROR)
.build()
.execute();
logger.info("RequestInfoLogsRemoved {}", requestInfoLogsRemoved);
executionResults.setData("RequestInfoLogsRemoved", requestInfoLogsRemoved);
}
// bam tables
long bamLogsRemoved = 0l;
executionResults.setData("BAMLogRemoved", bamLogsRemoved);
return executionResults;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy