use of org.jbpm.executor.api.Command in project jBPM5-Developer-Guide by Salaboy.
the class ExecutorRunnable method run.
@Transactional
public void run() {
logger.log(Level.INFO, " >>> Executor Thread {0} Waking Up!!!", this.toString());
List<?> resultList = em.createQuery("Select r from RequestInfo as r where r.status ='QUEUED' or r.status = 'RETRYING' ORDER BY r.time DESC").getResultList();
logger.log(Level.INFO, " >>> Pending Requests = {0}", resultList.size());
if (resultList.size() > 0) {
RequestInfo r = null;
Throwable exception = null;
try {
r = (RequestInfo) resultList.get(0);
r.setStatus(STATUS.RUNNING);
em.merge(r);
logger.log(Level.INFO, " >> Processing Request Id: {0}", r.getId());
logger.log(Level.INFO, " >> Request Status ={0}", r.getStatus());
logger.log(Level.INFO, " >> Command Name to execute = {0}", r.getCommandName());
Command cmd = this.findCommand(r.getCommandName());
CommandContext ctx = null;
byte[] reqData = r.getRequestData();
if (reqData != null) {
try {
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(reqData));
ctx = (CommandContext) in.readObject();
} catch (IOException e) {
ctx = null;
e.printStackTrace();
}
}
ExecutionResults results = cmd.execute(ctx);
if (ctx != null && ctx.getData("callbacks") != null) {
logger.log(Level.INFO, " ### Callback: {0}", ctx.getData("callbacks"));
String[] callbacksArray = ((String) ctx.getData("callbacks")).split(",");
;
List<String> callbacks = (List<String>) Arrays.asList(callbacksArray);
for (String callbackName : callbacks) {
CommandCallback handler = this.findCommandCallback(callbackName);
handler.onCommandDone(ctx, results);
}
} else {
logger.info(" ### Callbacks: NULL");
}
if (results != null) {
try {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bout);
out.writeObject(results);
byte[] respData = bout.toByteArray();
r.setResponseData(respData);
} catch (IOException e) {
r.setResponseData(null);
}
}
} catch (Exception e) {
e.printStackTrace();
exception = e;
}
if (exception != null) {
logger.log(Level.SEVERE, "{0} >>> Before - Error Handling!!!{1}", new Object[] { System.currentTimeMillis(), exception.getMessage() });
ErrorInfo errorInfo = new ErrorInfo(exception.getMessage(), ExceptionUtils.getFullStackTrace(exception.fillInStackTrace()));
errorInfo.setRequestInfo(r);
r.getErrorInfo().add(errorInfo);
logger.log(Level.SEVERE, " >>> Error Number: {0}", r.getErrorInfo().size());
if (r.getRetries() > 0) {
r.setStatus(STATUS.RETRYING);
r.setRetries(r.getRetries() - 1);
r.setExecutions(r.getExecutions() + 1);
logger.log(Level.SEVERE, " >>> Retrying ({0}) still available!", r.getRetries());
} else {
logger.severe(" >>> Error no retries left!");
r.setStatus(STATUS.ERROR);
r.setExecutions(r.getExecutions() + 1);
}
em.merge(r);
logger.severe(" >>> After - Error Handling!!!");
} else {
r.setStatus(STATUS.DONE);
em.merge(r);
}
}
}
Aggregations