blob: 61a484b432111ece5c8a83f43f7240116aba1af3 [file] [log] [blame]
/*******************************************************************************
* 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.ofbiz.service;
import java.util.Date;
import java.util.Map;
import javax.transaction.Transaction;
import org.apache.ofbiz.service.calendar.RecurrenceRule;
import org.apache.ofbiz.entity.Delegator;
import org.apache.ofbiz.entity.transaction.GenericTransactionException;
import org.apache.ofbiz.entity.transaction.TransactionUtil;
import org.apache.ofbiz.security.Security;
import org.apache.ofbiz.service.jms.JmsListenerFactory;
import org.apache.ofbiz.service.job.JobManager;
import org.apache.ofbiz.service.job.JobManagerException;
import org.apache.ofbiz.base.util.Debug;
/**
* Generic Services Local Dispatcher
*/
public abstract class GenericAbstractDispatcher implements LocalDispatcher {
public static final String module = GenericAbstractDispatcher.class.getName();
protected DispatchContext ctx = null;
protected ServiceDispatcher dispatcher = null;
protected String name = null;
public GenericAbstractDispatcher() {}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#schedule(java.lang.String, java.lang.String, java.util.Map, long, int, int, int, long, int)
*/
public void schedule(String poolName, String serviceName, Map<String, ? extends Object> context, long startTime, int frequency, int interval, int count, long endTime, int maxRetry) throws GenericServiceException {
schedule(null, poolName, serviceName, context, startTime, frequency, interval, count, endTime, maxRetry);
}
public void schedule(String poolName, String serviceName, long startTime, int frequency, int interval, int count, long endTime, int maxRetry, Object... context) throws GenericServiceException {
schedule(poolName, serviceName, ServiceUtil.makeContext(context), startTime, frequency, interval, count, endTime, maxRetry);
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#schedule(java.lang.String, java.lang.String, java.lang.String, java.util.Map, long, int, int, int, long, int)
*/
public void schedule(String jobName, String poolName, String serviceName, Map<String, ? extends Object> context, long startTime, int frequency, int interval, int count, long endTime, int maxRetry) throws GenericServiceException {
Transaction suspendedTransaction = null;
try {
boolean beganTransaction = false;
suspendedTransaction = TransactionUtil.suspend();
try {
beganTransaction = TransactionUtil.begin();
try {
getJobManager().schedule(jobName, poolName, serviceName, context, startTime, frequency, interval, count, endTime, maxRetry);
if (Debug.verboseOn()) {
Debug.logVerbose("[LocalDispatcher.schedule] : Current time : " + (new Date()).getTime(), module);
Debug.logVerbose("[LocalDispatcher.schedule] : Runtime : " + startTime, module);
Debug.logVerbose("[LocalDispatcher.schedule] : Frequency : " + frequency, module);
Debug.logVerbose("[LocalDispatcher.schedule] : Interval : " + interval, module);
Debug.logVerbose("[LocalDispatcher.schedule] : Count : " + count, module);
Debug.logVerbose("[LocalDispatcher.schedule] : EndTime : " + endTime, module);
Debug.logVerbose("[LocalDispatcher.schedule] : MazRetry : " + maxRetry, module);
}
} catch (JobManagerException jme) {
throw new GenericServiceException(jme.getMessage(), jme);
}
} catch (Exception e) {
String errMsg = "General error while scheduling job";
Debug.logError(e, errMsg, module);
try {
TransactionUtil.rollback(beganTransaction, errMsg, e);
} catch (GenericTransactionException gte1) {
Debug.logError(gte1, "Unable to rollback transaction", module);
}
} finally {
try {
TransactionUtil.commit(beganTransaction);
} catch (GenericTransactionException gte2) {
Debug.logError(gte2, "Unable to commit scheduled job", module);
}
}
} catch (GenericTransactionException gte) {
Debug.logError(gte, "Error suspending transaction while scheduling job", module);
} finally {
if (suspendedTransaction != null) {
try {
TransactionUtil.resume(suspendedTransaction);
} catch (GenericTransactionException gte3) {
Debug.logError(gte3, "Error resuming suspended transaction after scheduling job", module);
}
}
}
}
public void schedule(String jobName, String poolName, String serviceName, long startTime, int frequency, int interval, int count, long endTime, int maxRetry, Object... context) throws GenericServiceException {
schedule(jobName, poolName, serviceName, ServiceUtil.makeContext(context), startTime, frequency, interval, count, endTime, maxRetry);
}
public void addRollbackService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
ServiceSynchronization.registerRollbackService(this.getDispatchContext(), serviceName, null, context, true, persist);
}
public void addRollbackService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
addRollbackService(serviceName, ServiceUtil.makeContext(context), persist);
}
public void addCommitService(String serviceName, Map<String, ? extends Object> context, boolean persist) throws GenericServiceException {
ServiceSynchronization.registerCommitService(this.getDispatchContext(), serviceName, null, context, true, persist);
}
public void addCommitService(String serviceName, boolean persist, Object... context) throws GenericServiceException {
addCommitService(serviceName, ServiceUtil.makeContext(context), persist);
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#schedule(java.lang.String, java.util.Map, long, int, int, int, long)
*/
public void schedule(String serviceName, Map<String, ? extends Object> context, long startTime, int frequency, int interval, int count, long endTime) throws GenericServiceException {
ModelService model = ctx.getModelService(serviceName);
schedule(null, serviceName, context, startTime, frequency, interval, count, endTime, model.maxRetry);
}
public void schedule(String serviceName, long startTime, int frequency, int interval, int count, long endTime, Object... context) throws GenericServiceException {
schedule(serviceName, ServiceUtil.makeContext(context), startTime, frequency, interval, count, endTime);
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#schedule(java.lang.String, java.util.Map, long, int, int, int)
*/
public void schedule(String serviceName, Map<String, ? extends Object> context, long startTime, int frequency, int interval, int count) throws GenericServiceException {
schedule(serviceName, context, startTime, frequency, interval, count, 0);
}
public void schedule(String serviceName, long startTime, int frequency, int interval, int count, Object... context) throws GenericServiceException {
schedule(serviceName, ServiceUtil.makeContext(context), startTime, frequency, interval, count);
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#schedule(java.lang.String, java.util.Map, long, int, int, long)
*/
public void schedule(String serviceName, Map<String, ? extends Object> context, long startTime, int frequency, int interval, long endTime) throws GenericServiceException {
schedule(serviceName, context, startTime, frequency, interval, -1, endTime);
}
public void schedule(String serviceName, long startTime, int frequency, int interval, long endTime, Object... context) throws GenericServiceException {
schedule(serviceName, ServiceUtil.makeContext(context), startTime, frequency, interval, endTime);
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#schedule(java.lang.String, java.util.Map, long)
*/
public void schedule(String serviceName, Map<String, ? extends Object> context, long startTime) throws GenericServiceException {
schedule(serviceName, context, startTime, RecurrenceRule.DAILY, 1, 1);
}
public void schedule(String serviceName, long startTime, Object... context) throws GenericServiceException {
schedule(serviceName, ServiceUtil.makeContext(context), startTime);
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#getJobManager()
*/
public JobManager getJobManager() {
return dispatcher.getJobManager();
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#getJMSListeneFactory()
*/
public JmsListenerFactory getJMSListeneFactory() {
return dispatcher.getJMSListenerFactory();
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#getDelegator()
*/
public Delegator getDelegator() {
return dispatcher.getDelegator();
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#getSecurity()
*/
public Security getSecurity() {
return dispatcher.getSecurity();
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#getName()
*/
public String getName() {
return this.name;
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#getDispatchContext()
*/
public DispatchContext getDispatchContext() {
return ctx;
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#deregister()
*/
public void deregister() {
ServiceContainer.removeFromCache(getName());
dispatcher.deregister(this);
}
/**
* @see org.apache.ofbiz.service.LocalDispatcher#registerCallback(String, GenericServiceCallback)
*/
public void registerCallback(String serviceName, GenericServiceCallback cb) {
dispatcher.registerCallback(serviceName, cb);
}
}