private ExecutionMessage createTerminatedExecutionMessage(Execution nextStepExecution) { Payload payload = converter.createPayload(nextStepExecution); //we need the payload ExecutionMessage finalMessage = (ExecutionMessage) executionMessage.clone(); finalMessage.setStatus(ExecStatus.TERMINATED); //in queue it is checked and finish flow is called finalMessage.incMsgSeqId(); finalMessage.setPayload(payload); return finalMessage; }
ExecutionMessage stepFinishMessage = (ExecutionMessage) msg.clone(); stepFinishMessage.setStatus(ExecStatus.FINISHED); stepFinishMessage.incMsgSeqId(); ExecutionMessage flowFailedMessage = (ExecutionMessage) stepFinishMessage.clone(); flowFailedMessage.setStatus(ExecStatus.FAILED); addErrorMessage(flowFailedMessage);
private boolean isRunningTooLong(Long startTime, Execution nextStepExecution) { Long currentTime = System.currentTimeMillis(); //Return true if running more than 60 seconds. //We want to exit after 60 seconds from this thread in order to prevent starvation of other tasks. if ((currentTime - startTime) > 60 * 1000) { //set current step to finished executionMessage.setStatus(ExecStatus.FINISHED); executionMessage.incMsgSeqId(); executionMessage.setPayload(null); ExecutionMessage inProgressMessage = createInProgressExecutionMessage(nextStepExecution); ExecutionMessage[] executionMessagesToSend = new ExecutionMessage[]{executionMessage, inProgressMessage}; //for the outBuffer ExecutionMessage inProgressMessageForInBuffer = (ExecutionMessage) inProgressMessage.clone(); inProgressMessageForInBuffer.setPayload(null); //we do not need the payload for the inBuffer shortcut try { //The order is important!!!!! outBuffer.put(executionMessagesToSend); inBuffer.addExecutionMessage(inProgressMessageForInBuffer); } catch (InterruptedException e) { logger.warn("Thread was interrupted! Exiting the execution... ", e); return true; //exiting... in shutdown... } return true; } else { return false; } }
private void ackMessages(List<ExecutionMessage> newMessages) throws InterruptedException { ExecutionMessage cloned; for (ExecutionMessage message : newMessages) { // create a unique id for this lane in this specific worker to be used in out buffer optimization //logger.error("ACK FOR MESSAGE: " + message.getMsgId() + " : " + message.getExecStateId()); message.setWorkerKey(message.getMsgId() + " : " + message.getExecStateId()); cloned = (ExecutionMessage) message.clone(); cloned.setStatus(ExecStatus.IN_PROGRESS); cloned.incMsgSeqId(); message.incMsgSeqId(); // increment the original message seq too in order to preserve the order of all messages of entire step cloned.setPayload(null); //payload is not needed in ack - make it null in order to minimize the data that is being sent outBuffer.put(cloned); } }
private boolean isRecoveryCheckpoint(Execution nextStepExecution) { //Here we check if we need to go to queue to persist - we can do it with shortcut to InBuffer!!!!!!!! if (!isRecoveryDisabled && nextStepExecution.getSystemContext().containsKey(TempConstants.IS_RECOVERY_CHECKPOINT)) { //clean key nextStepExecution.getSystemContext().remove(TempConstants.IS_RECOVERY_CHECKPOINT); //set current step to finished executionMessage.setStatus(ExecStatus.FINISHED); executionMessage.incMsgSeqId(); executionMessage.setPayload(null); ExecutionMessage inProgressMessage = createInProgressExecutionMessage(nextStepExecution); ExecutionMessage[] executionMessagesToSend = new ExecutionMessage[]{executionMessage, inProgressMessage}; //for the outBuffer ExecutionMessage inProgressMessageForInBuffer = (ExecutionMessage) inProgressMessage.clone(); inProgressMessageForInBuffer.setPayload(null); //we do not need the payload for the inBuffer shortcut try { //The order is important!!!!! outBuffer.put(executionMessagesToSend); inBuffer.addExecutionMessage(inProgressMessageForInBuffer); } catch (InterruptedException e) { logger.warn("Thread was interrupted! Exiting the execution... ", e); return true; //exiting... in shutdown... } return true; } else { return false; } }
ExecutionMessage[] executionMessagesToSend = new ExecutionMessage[]{executionMessage, inProgressMessage}; //for the outBuffer ExecutionMessage inProgressMessageForInBuffer = (ExecutionMessage) inProgressMessage.clone();