Search in sources :

Example 1 with CommandContext

use of org.jbpm.executor.api.CommandContext in project jBPM5-Developer-Guide by Salaboy.

the class BasicExecutorBaseTest method callbackTest.

/**
     * Tests callback execution after a command was successfully executed.
     * @throws InterruptedException 
     */
@Test
public void callbackTest() throws InterruptedException {
    CommandContext commandContext = new CommandContext();
    //We register a business key in the command context so we can add
    //extra information on it.
    commandContext.setData("businessKey", UUID.randomUUID().toString());
    //We are going to put a new AtomicLong in the context. The idea is 
    //that the callback we will register will get this 'entity' and increments
    //its value.
    cachedEntities.put((String) commandContext.getData("businessKey"), new AtomicLong(1));
    //A job is scheduled. Using commandContext we can register a callback
    //using its CDI name.
    commandContext.setData("callbacks", "SimpleIncrementCallback");
    executor.scheduleRequest("PrintOutCmd", commandContext);
    Thread.sleep(10000);
    //after 10 seconds we should have no errors, no queued requests and
    //one executed request.
    List<RequestInfo> inErrorRequests = executor.getInErrorRequests();
    assertEquals(0, inErrorRequests.size());
    List<RequestInfo> queuedRequests = executor.getQueuedRequests();
    assertEquals(0, queuedRequests.size());
    List<RequestInfo> executedRequests = executor.getExecutedRequests();
    assertEquals(1, executedRequests.size());
    //Since the callback was invoked, the value of the entity should have
    //been incremented.
    assertEquals(2, ((AtomicLong) cachedEntities.get((String) commandContext.getData("businessKey"))).longValue());
}
Also used : AtomicLong(java.util.concurrent.atomic.AtomicLong) CommandContext(org.jbpm.executor.api.CommandContext) RequestInfo(org.jbpm.executor.entities.RequestInfo) Test(org.junit.Test)

Example 2 with CommandContext

use of org.jbpm.executor.api.CommandContext in project jBPM5-Developer-Guide by Salaboy.

the class BasicExecutorBaseTest method defaultRequestRetryTest.

/**
     * Test showing the retry mechanism for failing commands.
     * @throws InterruptedException 
     */
@Test
public void defaultRequestRetryTest() throws InterruptedException {
    CommandContext ctxCMD = new CommandContext();
    ctxCMD.setData("businessKey", UUID.randomUUID().toString());
    //The command we are registering will cause an exception.
    //Remeber that the default number of reties is 3.
    executor.scheduleRequest("ThrowExceptionCmd", ctxCMD);
    Thread.sleep(12000);
    //After 12 seconds we should have 4 errors: 1 corresponding to the
    //first time the command failed. The other 3 correspond to the 3
    //retries.
    List<RequestInfo> inErrorRequests = executor.getInErrorRequests();
    assertEquals(1, inErrorRequests.size());
    List<ErrorInfo> errors = executor.getAllErrors();
    System.out.println(" >>> Errors: " + errors);
    // Three retries means 4 executions in total 1(regular) + 3(retries)
    assertEquals(4, errors.size());
}
Also used : CommandContext(org.jbpm.executor.api.CommandContext) ErrorInfo(org.jbpm.executor.entities.ErrorInfo) RequestInfo(org.jbpm.executor.entities.RequestInfo) Test(org.junit.Test)

Example 3 with CommandContext

use of org.jbpm.executor.api.CommandContext 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);
        }
    }
}
Also used : CommandContext(org.jbpm.executor.api.CommandContext) ExecutionResults(org.jbpm.executor.api.ExecutionResults) ErrorInfo(org.jbpm.executor.entities.ErrorInfo) IOException(java.io.IOException) ByteArrayOutputStream(java.io.ByteArrayOutputStream) RequestInfo(org.jbpm.executor.entities.RequestInfo) ObjectOutputStream(java.io.ObjectOutputStream) IOException(java.io.IOException) Command(org.jbpm.executor.api.Command) ByteArrayInputStream(java.io.ByteArrayInputStream) List(java.util.List) CommandCallback(org.jbpm.executor.api.CommandCallback) ObjectInputStream(java.io.ObjectInputStream) Transactional(org.jboss.seam.transaction.Transactional)

Example 4 with CommandContext

use of org.jbpm.executor.api.CommandContext in project jBPM5-Developer-Guide by Salaboy.

the class BasicExecutorBaseTest method executorExceptionTest.

/**
     * Test showing the exception handling mechanism of the Executor Service.
     * @throws InterruptedException 
     */
@Test
public void executorExceptionTest() throws InterruptedException {
    CommandContext commandContext = new CommandContext();
    commandContext.setData("businessKey", UUID.randomUUID().toString());
    cachedEntities.put((String) commandContext.getData("businessKey"), new AtomicLong(1));
    //Same callback as the precious test
    commandContext.setData("callbacks", "SimpleIncrementCallback");
    //no retries please.
    commandContext.setData("retries", 0);
    //The command we are registering will cause an exception.
    executor.scheduleRequest("ThrowExceptionCmd", commandContext);
    Thread.sleep(10000);
    //After 10 seconds, we should have a failing request.
    List<RequestInfo> inErrorRequests = executor.getInErrorRequests();
    assertEquals(1, inErrorRequests.size());
    System.out.println("Error: " + inErrorRequests.get(0));
    List<ErrorInfo> errors = executor.getAllErrors();
    System.out.println(" >>> Errors: " + errors);
    assertEquals(1, errors.size());
}
Also used : AtomicLong(java.util.concurrent.atomic.AtomicLong) CommandContext(org.jbpm.executor.api.CommandContext) ErrorInfo(org.jbpm.executor.entities.ErrorInfo) RequestInfo(org.jbpm.executor.entities.RequestInfo) Test(org.junit.Test)

Example 5 with CommandContext

use of org.jbpm.executor.api.CommandContext in project jBPM5-Developer-Guide by Salaboy.

the class BasicExecutorBaseTest method cancelRequestTest.

/**
     * Test showing how a request can be canceled.
     * @throws InterruptedException 
     */
@Test
public void cancelRequestTest() throws InterruptedException {
    CommandContext ctxCMD = new CommandContext();
    ctxCMD.setData("businessKey", UUID.randomUUID().toString());
    //Schedule a task.
    Long requestId = executor.scheduleRequest("PrintOutCmd", ctxCMD);
    // cancel the task immediately
    executor.cancelRequest(requestId);
    //We should see the canceled task now
    List<RequestInfo> cancelledRequests = executor.getCancelledRequests();
    assertEquals(1, cancelledRequests.size());
}
Also used : CommandContext(org.jbpm.executor.api.CommandContext) AtomicLong(java.util.concurrent.atomic.AtomicLong) RequestInfo(org.jbpm.executor.entities.RequestInfo) Test(org.junit.Test)

Aggregations

CommandContext (org.jbpm.executor.api.CommandContext)7 RequestInfo (org.jbpm.executor.entities.RequestInfo)6 Test (org.junit.Test)5 AtomicLong (java.util.concurrent.atomic.AtomicLong)3 ErrorInfo (org.jbpm.executor.entities.ErrorInfo)3 ByteArrayInputStream (java.io.ByteArrayInputStream)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 IOException (java.io.IOException)1 ObjectInputStream (java.io.ObjectInputStream)1 ObjectOutputStream (java.io.ObjectOutputStream)1 List (java.util.List)1 Map (java.util.Map)1 Transactional (org.jboss.seam.transaction.Transactional)1 Command (org.jbpm.executor.api.Command)1 CommandCallback (org.jbpm.executor.api.CommandCallback)1 ExecutionResults (org.jbpm.executor.api.ExecutionResults)1