@Override @Transactional(propagation = Propagation.SUPPORTS) public void logMessageRecovery(List<ExecutionMessage> messages) { if(!CollectionUtils.isEmpty(messages)){ logger.warn("Will do recovery for " + messages.size() + " messages. "); if(logger.isDebugEnabled()){ for(ExecutionMessage msg:messages){ logger.debug("Will do recovery for messages with ExecStateId = " + msg.getExecStateId()); } } } }
private void fillPayload(ExecutionMessage msg) { if (msg.getPayload() == null){ Map<Long, Payload> payloadMap = executionQueueService.readPayloadByExecutionIds(msg.getExecStateId()); Payload payload = payloadMap.get(msg.getExecStateId()); msg.setPayload(payload); } }
@Override public void setValues(PreparedStatement ps, int i) throws SQLException { ExecutionMessage msg = messages.get(i); ps.setLong(1, idGen.next()); ps.setLong(2, msg.getExecStateId()); ps.setString(3, msg.getWorkerId()); ps.setString(4, msg.getWorkerGroup()); ps.setInt(5, msg.getStatus().getNumber()); ps.setInt(6, msg.getMsgSeqId()); ps.setLong(7, Calendar.getInstance().getTimeInMillis()); ps.setLong(8, version); }
@Override public void setValues(PreparedStatement ps, int i) throws SQLException { ExecutionMessage msg = stateMessages.get(i); ps.setLong(1, msg.getExecStateId()); ps.setString(2, msg.getMsgId()); ps.setBytes(3, msg.getPayload().getData()); }
@Override public void tryOnce() { String wrv = recoveryManager.getWRV(); if (logger.isDebugEnabled()) logger.debug("Dispatch start with bulk number: " + bulkNumber); dispatcherService.dispatch(optimizedBulk, bulkNumber, wrv, workerUuid); if (executionsActivityListener != null) { executionsActivityListener.onHalt(extract(optimizedBulk, on(ExecutionMessage.class).getExecStateId())); } if (logger.isDebugEnabled()) logger.debug("Dispatch end with bulk number: " + bulkNumber); } });
public List<ExecutionMessage> pollMessagesWithoutAck(int maxSize, long minVersionAllowed) { pollMessagesWithoutAckJdbcTemplate.setStatementBatchSize(maxSize); try { String sqlStat = QUERY_MESSAGES_WITHOUT_ACK_SQL; Object[] values = {ExecStatus.SENT.getNumber(), minVersionAllowed}; long time = System.currentTimeMillis(); List<ExecutionMessage> result = pollMessagesWithoutAckJdbcTemplate.query(sqlStat, values, new ExecutionMessageWithoutPayloadRowMapper()); if (!result.isEmpty()) { logger.warn("Pool " + result.size() + " messages without ack, version = " + minVersionAllowed); if (logger.isDebugEnabled()) { for (ExecutionMessage msg : result) { logger.debug("Recovery msg [" + msg.getExecStateId() + "," + msg.getStatus() + "," + msg.getCreateDate() + "]"); } } } if (logger.isTraceEnabled()) logger.trace("Query [" + sqlStat + "] took " + (System.currentTimeMillis() - time) + " ms"); if (logger.isDebugEnabled()) { logger.debug("Got msg without ack :" + result.size() + ",for version:" + minVersionAllowed); } return result; } finally { pollMessagesWithoutAckJdbcTemplate.clearStatementBatchSize(); } }
if (msg.getExecStateId() == ExecutionMessage.EMPTY_EXEC_STATE_ID) { long execStateId = executionQueueRepository.generateExecStateId(); msg.setExecStateId(execStateId);
List<ExecutionMessage> newMessages = queueDispatcher.poll(workerUuid, messagesToGet); if (executionsActivityListener != null) { executionsActivityListener.onActivate(extract(newMessages, on(ExecutionMessage.class).getExecStateId()));
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); } }