/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.synapse.task;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.util.Map;
import java.util.Properties;
@SuppressWarnings({"UnusedDeclaration"})
public class TaskScheduler {
private static final Log logger = LogFactory.getLog(TaskScheduler.class.getName());
/** This same task scheduler instance can be used by many startup controllers */
private static final Object lock = new Object();
private String name;
private TaskManager taskManager;
private boolean initialized = false;
public TaskScheduler(String name) {
this.name = name;
}
public void init(Properties properties, TaskManager taskManager) {
synchronized (lock) {
if (initialized) {
logger.debug("TaskScheduler already initialized.");
return;
}
initialized = false;
}
setTaskManager(taskManager, properties);
start();
}
private boolean setTaskManager(TaskManager taskManager, Properties properties) {
synchronized (lock) {
if (taskManager == null) {
logger.error("Task scheduler initialization failed. Task manager is invalid.");
return false;
}
this.taskManager = taskManager;
this.taskManager.setName(name);
if (!this.taskManager.isInitialized()) {
if (logger.isDebugEnabled()) {
logger.debug("Synapse Task Scheduler initializing task manager["
+ taskManager.getClass().getName() +"]: Properties" + properties);
}
this.taskManager.init(properties);
}
initialized = true;
return true;
}
}
public void start() {
synchronized (lock) {
if (!initialized) {
logger.error("Could not start task scheduler. Task scheduler not properly initialized.");
return;
}
taskManager.start();
}
}
public void pauseAll() {
synchronized (lock) {
if (!initialized) {
logger.error("Could not pause tasks. Task scheduler not properly initialized.");
return;
}
taskManager.pauseAll();
}
}
public void resumeAll() {
synchronized (lock) {
if (!initialized) {
logger.error("Could not resume tasks. Task scheduler not properly initialized.");
return;
}
taskManager.resumeAll();
}
}
public boolean scheduleTask(TaskDescription taskDescription, Map<String,
Object> resources, Class taskClass) {
synchronized (lock) {
if (!initialized) {
logger.error("Could not schedule task ["+ taskDescription.getName() + "]. Task scheduler not properly initialized.");
return false;
}
return taskManager.schedule(taskDescription);
}
}
public boolean scheduleTask(TaskDescription taskDescription, Map<String,
Object> resources, Class jobClass, Task task) {
if (taskDescription == null) {
return false;
}
synchronized (lock) {
if (!initialized) {
logger.error("Could not schedule task [" + taskDescription.getName() + "]. Task scheduler not properly initialized.");
return false;
}
return taskManager.schedule(taskDescription);
}
}
public boolean scheduleTask(TaskDescription taskDescription) {
if (taskDescription == null) {
return false;
}
synchronized (lock) {
if (!initialized) {
logger.error("Could not schedule task [" + taskDescription.getName() + "]. Task scheduler not properly initialized.");
return false;
}
return taskManager.schedule(taskDescription);
}
}
public void shutDown() {
synchronized (lock) {
if (!initialized) {
return;
}
taskManager.stop();
}
}
public boolean isInitialized() {
synchronized (lock) {
if (!initialized) {
return false;
}
return taskManager.isInitialized();
}
}
public void deleteTask(String name, String group) {
synchronized (lock) {
if (!initialized) {
logger.error("Could not delete task[" + name + "," + group + "]. Task scheduler not properly initialized.");
return;
}
taskManager.delete(name + "::" + group);
}
}
public int getRunningTaskCount() {
synchronized (lock) {
if (!initialized) {
logger.error("Could not determine running task count. Task scheduler not properly initialized.");
return -1;
}
return taskManager.getRunningTaskCount();
}
}
public boolean isTaskAlreadyRunning(Object taskKey) {
synchronized (lock) {
if (!initialized) {
logger.error("Could not determine task status. Task scheduler not properly initialized.");
return false;
}
return taskManager.isTaskRunning(taskKey);
}
}
public void setTriggerFactory(Object triggerFactory) {
synchronized (lock) {
if (!initialized) {
logger.error("Could not modify task manager. Task scheduler not properly initialized.");
return;
}
taskManager.setProperty("Q_TASK_TRIGGER_FACTORY", triggerFactory);
}
}
public void setJobDetailFactory(Object jobDetailFactory) {
synchronized (lock) {
if (!initialized) {
logger.error("Could not modify task manager. Task scheduler not properly initialized.");
return;
}
taskManager.setProperty("Q_TASK_JOB_DETAIL_FACTORY", jobDetailFactory);
}
}
}