/* * Copyright 2013 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. * You may obtain a copy of the License at * * 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.impl; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import org.jbpm.executor.AsynchronousJobListener; import org.jbpm.executor.ExecutorNotStartedException; import org.jbpm.executor.ExecutorServiceFactory; import org.jbpm.executor.RequeueAware; import org.jbpm.executor.impl.event.ExecutorEventSupport; import org.kie.api.executor.CommandContext; import org.kie.api.executor.ErrorInfo; import org.kie.api.executor.Executor; import org.kie.api.executor.ExecutorAdminService; import org.kie.api.executor.ExecutorQueryService; import org.kie.api.executor.RequestInfo; import org.kie.api.executor.STATUS; import org.kie.api.runtime.query.QueryContext; import org.kie.internal.executor.api.ExecutorService; /** * Entry point of the executor component. Application should always talk * via this service to ensure all internals are properly initialized * */ public class ExecutorServiceImpl implements ExecutorService, RequeueAware { private TimeUnit timeunit = TimeUnit.valueOf(System.getProperty("org.kie.executor.timeunit", "SECONDS")); private long maxRunningTime = Long.parseLong(System.getProperty("org.kie.executor.running.max", "600")); private Executor executor; private boolean executorStarted = false; private ExecutorQueryService queryService; private ExecutorAdminService adminService; private ExecutorEventSupport eventSupport = new ExecutorEventSupport(); public ExecutorServiceImpl(){ } public ExecutorServiceImpl(Executor executor) { } public ExecutorEventSupport getEventSupport() { return this.eventSupport; } public void setEventSupport(ExecutorEventSupport eventSupport) { this.eventSupport = eventSupport; } public Executor getExecutor() { return executor; } public void setExecutor(Executor executor) { this.executor = executor; } public ExecutorQueryService getQueryService() { return queryService; } public void setQueryService(ExecutorQueryService queryService) { this.queryService = queryService; } public ExecutorAdminService getAdminService() { return adminService; } public void setAdminService(ExecutorAdminService adminService) { this.adminService = adminService; } public List<RequestInfo> getFutureQueuedRequests() { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getFutureQueuedRequests(); } public List<RequestInfo> getQueuedRequests() { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getQueuedRequests(); } public List<RequestInfo> getCompletedRequests() { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getCompletedRequests(); } public List<RequestInfo> getInErrorRequests() { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getInErrorRequests(); } public List<RequestInfo> getCancelledRequests() { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getCancelledRequests(); } public List<ErrorInfo> getAllErrors() { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getAllErrors(); } public List<RequestInfo> getAllRequests() { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getAllRequests(); } public List<RequestInfo> getRequestsByStatus(List<STATUS> statuses) { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getRequestsByStatus(statuses); } public int clearAllRequests() { return adminService.clearAllRequests(); } public int clearAllErrors() { return adminService.clearAllErrors(); } public Long scheduleRequest(String commandName, CommandContext ctx) { return executor.scheduleRequest(commandName, ctx); } public void cancelRequest(Long requestId) { executor.cancelRequest(requestId); } public void init() { if (!executorStarted) { if (maxRunningTime > -1) { requeue(maxRunningTime); } try { executor.init(); this.executorStarted = true; } catch (ExecutorNotStartedException e) { this.executorStarted = false; } } } public void destroy() { if (executorStarted) { ExecutorServiceFactory.resetExecutorService(this); this.executorStarted = false; executor.destroy(); } } public boolean isActive() { return executorStarted; } public int getInterval() { return executor.getInterval(); } public void setInterval(int waitTime) { executor.setInterval(waitTime); } public int getRetries() { return executor.getRetries(); } public void setRetries(int defaultNroOfRetries) { executor.setRetries(defaultNroOfRetries); } public int getThreadPoolSize() { return executor.getThreadPoolSize(); } public void setThreadPoolSize(int nroOfThreads) { executor.setThreadPoolSize(nroOfThreads); } public TimeUnit getTimeunit() { return executor.getTimeunit(); } public void setTimeunit(TimeUnit timeunit) { executor.setTimeunit(timeunit); } public List<RequestInfo> getPendingRequests() { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getPendingRequests(); } public List<RequestInfo> getPendingRequestById(Long id) { return queryService.getPendingRequestById(id); } public Long scheduleRequest(String commandId, Date date, CommandContext ctx) { return executor.scheduleRequest(commandId, date, ctx); } public List<RequestInfo> getRunningRequests() { return ((org.kie.internal.executor.api.ExecutorQueryService)queryService).getRunningRequests(); } public RequestInfo getRequestById(Long requestId) { return queryService.getRequestById(requestId); } public List<ErrorInfo> getErrorsByRequestId(Long requestId) { return queryService.getErrorsByRequestId(requestId); } @Override public List<RequestInfo> getRequestsByBusinessKey(String businessKey, QueryContext queryContext) { return queryService.getRequestByBusinessKey(businessKey, queryContext); } @Override public List<RequestInfo> getRequestsByCommand(String command, QueryContext queryContext) { return queryService.getRequestByCommand(command, queryContext); } @Override public void requeue(Long olderThan) { if (adminService instanceof RequeueAware) { if (olderThan == null) { olderThan = maxRunningTime; } ((RequeueAware) adminService).requeue(timeunit.convert(olderThan, TimeUnit.MILLISECONDS)); } } @Override public void requeueById(Long requestId) { if (adminService instanceof RequeueAware) { ((RequeueAware) adminService).requeueById(requestId); } } @Override public List<RequestInfo> getQueuedRequests(QueryContext queryContext) { return queryService.getQueuedRequests(queryContext); } @Override public List<RequestInfo> getCompletedRequests(QueryContext queryContext) { return queryService.getCompletedRequests(queryContext); } @Override public List<RequestInfo> getInErrorRequests(QueryContext queryContext) { return queryService.getInErrorRequests(queryContext); } @Override public List<RequestInfo> getCancelledRequests(QueryContext queryContext) { return queryService.getCancelledRequests(queryContext); } @Override public List<ErrorInfo> getAllErrors(QueryContext queryContext) { return queryService.getAllErrors(queryContext); } @Override public List<RequestInfo> getAllRequests(QueryContext queryContext) { return queryService.getAllRequests(queryContext); } @Override public List<RequestInfo> getRequestsByStatus(List<STATUS> statuses, QueryContext queryContext) { return queryService.getRequestsByStatus(statuses, queryContext); } @Override public List<RequestInfo> getPendingRequests(QueryContext queryContext) { return queryService.getPendingRequests(queryContext); } @Override public List<RequestInfo> getRunningRequests(QueryContext queryContext) { return queryService.getRunningRequests(queryContext); } @Override public List<RequestInfo> getFutureQueuedRequests(QueryContext queryContext) { return queryService.getFutureQueuedRequests(queryContext); } public void addAsyncJobListener(AsynchronousJobListener listener) { this.eventSupport.addEventListener(listener); } public void removeAsyncJobListener(AsynchronousJobListener listener) { this.eventSupport.removeEventListener(listener); } public List<AsynchronousJobListener> getAsyncJobListeners() { return this.eventSupport.getEventListeners(); } @Override public List<RequestInfo> getRequestsByBusinessKey(String businessKey, List<STATUS> statuses, QueryContext queryContext) { return queryService.getRequestsByBusinessKey(businessKey, statuses, queryContext); } @Override public List<RequestInfo> getRequestsByCommand(String command, List<STATUS> statuses, QueryContext queryContext) { return queryService.getRequestsByCommand(command, statuses, queryContext); } @Override public List<RequestInfo> getRequestsByDeployment(String deploymentId, List<STATUS> statuses, QueryContext queryContext) { return queryService.getRequestsByDeployment(deploymentId, statuses, queryContext); } @Override public List<RequestInfo> getRequestsByProcessInstance(Long processInstanceId, List<STATUS> statuses, QueryContext queryContext) { return queryService.getRequestsByProcessInstance(processInstanceId, statuses, queryContext); } @Override public void updateRequestData(Long requestId, Map<String, Object> data) { executor.updateRequestData(requestId, data); } }