/*
* Copyright (c) 2009-2010 Lockheed Martin Corporation
*
* 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.eurekastreams.commons.scheduling;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.transaction.annotation.Transactional;
/**
* This class uses reflection to call the specified object and method
* from within a @Transactional environment.
*
* This allows us to call mapper methods (which need to be called from within
* a transactional environment) from the spring scheduler.
*
*/
public class TransactionalTaskRunner
{
/**
* logger.
*/
private static Log log = LogFactory.getLog(TransactionalTaskRunner.class);
/**
* conversion constant.
*/
public static final double MILLIS_TO_SECONDS = 1000;
/**
* The object to call.
*/
private Object target;
/**
* the method which will be called that requires a transactional environment.
*/
private Method method;
/**
* I think spring wants this here.
*/
public TransactionalTaskRunner()
{
}
/**
*
* @param inTarget the object to call.
* @param methodName the method to run on the target, method must accept no arguments.
*/
public TransactionalTaskRunner(final Object inTarget, final String methodName)
{
try
{
target = inTarget;
method = inTarget.getClass().getMethod(methodName);
}
catch (SecurityException e)
{
log.error(e.toString());
}
catch (NoSuchMethodException e)
{
log.error(e.toString());
}
}
/**
* this method creates a transactional environment for calling mapper methods.
*/
@Transactional
public void runTransactionalTask()
{
Date start = new Date();
try
{
long startTime = start.getTime();
method.invoke(target);
Date end = new Date();
long endTime = end.getTime();
String message = "Method " + method.getName()
+ " started at " + start
+ " and finished at " + end
+ " taking " + ((endTime - startTime)) / MILLIS_TO_SECONDS
+ " seconds";
log.info(message);
}
catch (IllegalArgumentException e)
{
String message = "Method " + method.getName() + " started at " + start;
log.error(message);
log.error(e.toString());
}
catch (IllegalAccessException e)
{
String message = "Method " + method.getName() + " started at " + start;
log.error(message);
log.error(e.toString());
}
catch (InvocationTargetException e)
{
String message = "Method " + method.getName() + " started at " + start;
log.error(message);
log.error(e.toString());
}
}
}