package org.kisst.gft; import java.util.ArrayList; import org.kisst.gft.task.JmsTask; import org.kisst.jms.JmsMessage; import org.kisst.jms.MessageHandler; import org.kisst.util.exception.MappedStateException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jamonapi.Monitor; import com.jamonapi.MonitorFactory; public class TaskStarter implements MessageHandler { final static Logger logger=LoggerFactory.getLogger(TaskStarter.class); public static interface JmsTaskCreator { public JmsTask createJmsTask(JmsMessage msg); } private final ArrayList<JmsTaskCreator> creators = new ArrayList<JmsTaskCreator>(); public void appendCreator(JmsTaskCreator creator) { creators.add(creator); } public boolean handle(JmsMessage msg) { JmsTask task=createJmsTask(msg); if (logger.isInfoEnabled()) logger.info(task+" started"); Monitor mon1 = MonitorFactory.start("channel:"+task.getTaskDefinition().getName()); try { task.run(); } catch (Exception e) { MappedStateException mse = new MappedStateException(e); try { task.addState(mse); } catch (RuntimeException e2) { logger.error("Error when adding state info to Exception for task "+task,e2); } throw(mse); } finally { mon1.stop(); } //if (! t.isDone()) // t.save(); return true; } protected JmsTask createJmsTask(JmsMessage msg) { for (JmsTaskCreator c : creators) { try { JmsTask task = c.createJmsTask(msg); if (task !=null) return task; } catch (RuntimeException e) { LogService.log("error", "ReceivingMessage", "JmsTaskStarter", msg.getMessageId(), e.getMessage()); throw e; } } LogService.log("error", "ReceivingMessage", "JmsTaskStarter", msg.getMessageId(), "could not determine task type of message "+msg); throw new RuntimeException("could not determine task type of message "+msg); } }