protected List<Message> filerToPersistMessages(List<Message> messages){ List<Message> result = new ArrayList<>(); //We need to get from the list the FINISHED persisted messages for(Message msg : messages){ if(((ExecutionMessage)msg).isStepPersist() && ((ExecutionMessage)msg).getStatus().equals(ExecStatus.FINISHED)){ result.add(msg); } } return result; }
@Override public ExecutionMessage mapRow(ResultSet rs, int rowNum) throws SQLException { return new ExecutionMessage(rs.getLong("EXEC_STATE_ID"), rs.getString("ASSIGNED_WORKER"), rs.getString("EXEC_GROUP"), "-1", ExecStatus.find(rs.getInt("STATUS")), null, rs.getInt("MSG_SEQ_ID"), rs.getLong("CREATE_TIME")); } }
@Override public List<String> getBusyWorkers(ExecStatus... statuses) { // prepare the sql statement String sqlStat = BUSY_WORKERS_SQL .replaceAll(":status", StringUtils.repeat("?", ",", statuses.length)); // prepare the argument Object[] values = new Object[statuses.length]; int i=0; for (ExecStatus status : statuses) { values[i] = status.getNumber(); } return doSelectWithTemplate(getBusyWorkersJdbcTemplate, sqlStat, new BusyWorkerRowMapper(), values); }
@Override public void onEnqueue(List<ExecutionMessage> messages, int queueSize) { if (logger.isDebugEnabled()) { logger.debug("Enqueue " + messages.size() + " messages:"); logger.debug("queue size: " + queueSize); if (logger.isTraceEnabled()) { for (ExecutionMessage msg : messages) { String message = String.format( "Enqueue msgId= %s:%s,workerId=%s,status=%s", msg.getMsgUniqueId(), String.valueOf(msg.getMsgSeqId()), msg.getWorkerId(), msg.getStatus().toString() ); logger.trace(message); } } } }
@Override public void onPoll(List<ExecutionMessage> messages, int queueSize) { if (logger.isDebugEnabled()) { logger.debug("poll " + messages.size() + " messages:"); logger.debug("queue size: " + queueSize); if (logger.isTraceEnabled()) { for (ExecutionMessage msg : messages) { String message = String.format( "Poll msgId= %s:%s,workerId=%s,status=%s", msg.getMsgUniqueId(), String.valueOf(msg.getMsgSeqId()), msg.getWorkerId(), msg.getStatus().toString() ); logger.trace(message); } } } }
@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); }
protected List<Message> filerToPersistMessages(List<Message> messages){ List<Message> result = new ArrayList<>(); //We need to get from the list the FINISHED persisted messages for(Message msg : messages){ if(((ExecutionMessage)msg).isStepPersist() && ((ExecutionMessage)msg).getStatus().equals(ExecStatus.FINISHED)){ result.add(msg); } } return result; }
@Override public ExecutionMessage mapRow(ResultSet rs, int rowNum) throws SQLException { return new ExecutionMessage(rs.getLong("EXEC_STATE_ID"), rs.getString("ASSIGNED_WORKER"), rs.getString("EXEC_GROUP"), rs.getString("MSG_ID"), ExecStatus.find(rs.getInt("STATUS")), new Payload(rs.getBytes("PAYLOAD")), rs.getInt("MSG_SEQ_ID"), rs.getLong("CREATE_TIME")); } }
public Integer countMessagesWithoutAckForWorker(int maxSize, long minVersionAllowed, String workerUuid) { countMessagesWithoutAckForWorkerJdbcTemplate.setStatementBatchSize(maxSize); try { Object[] values = {workerUuid, ExecStatus.SENT.getNumber(), minVersionAllowed}; long time = System.currentTimeMillis(); Integer result = countMessagesWithoutAckForWorkerJdbcTemplate.queryForObject(QUERY_COUNT_MESSAGES_WITHOUT_ACK_FOR_WORKER_SQL, values,Integer.class); if (logger.isTraceEnabled()) logger.trace("Query [" + QUERY_COUNT_MESSAGES_WITHOUT_ACK_FOR_WORKER_SQL + "] took " + (System.currentTimeMillis() - time) + " ms"); if (logger.isDebugEnabled()) { logger.debug("Got msg without ack :" + result + ",for version:" + minVersionAllowed + ",for worker:" + workerUuid); } return result; } finally { countMessagesWithoutAckForWorkerJdbcTemplate.clearStatementBatchSize(); } }
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(); } }
@Override public List<ExecutionMessage> findByStatuses(int maxSize, ExecStatus... statuses) { findByStatusesJdbcTemplate.setStatementBatchSize(maxSize); // prepare the sql statement String sqlStat = QUERY_MESSAGES_BY_STATUSES .replaceAll(":status", StringUtils.repeat("?", ",", statuses.length)); // set ? according to the number of parameters Object[] values = new Object[statuses.length]; int i = 0; for (ExecStatus status : statuses) { values[i++] = status.getNumber(); } try { return doSelectWithTemplate(findByStatusesJdbcTemplate, sqlStat, new ExecutionMessageWithoutPayloadRowMapper(), values); } catch (RuntimeException ex) { logger.error(sqlStat, ex); throw ex; } finally { findByStatusesJdbcTemplate.clearStatementBatchSize(); } }
@Override public List<ExecutionMessage> poll(String workerId, int maxSize, ExecStatus... statuses) { pollJdbcTemplate.setStatementBatchSize(maxSize); try { // prepare the sql statement String sqlStat = QUERY_WORKER_SQL .replaceAll(":status", StringUtils.repeat("?", ",", statuses.length)); // prepare the argument Object[] values = new Object[statuses.length + 1]; values[0] = workerId; int i = 1; for (ExecStatus status : statuses) { values[i++] = status.getNumber(); } return doSelectWithTemplate(pollJdbcTemplate, sqlStat, new ExecutionMessageRowMapper(), values); } finally { pollJdbcTemplate.clearStatementBatchSize(); } }
@Override public List<ExecutionMessage> pollRecovery(String workerId, int maxSize, ExecStatus... statuses) { pollForRecoveryJdbcTemplate.setStatementBatchSize(maxSize); try { // prepare the sql statement String sqlStatPrvTable = QUERY_WORKER_RECOVERY_SQL .replaceAll(":status", StringUtils.repeat("?", ",", statuses.length)); // prepare the argument Object[] values = new Object[statuses.length + 1]; values[0] = workerId; int i = 1; for (ExecStatus status : statuses) { values[i++] = status.getNumber(); } return doSelectWithTemplate(pollForRecoveryJdbcTemplate, sqlStatPrvTable, new ExecutionMessageRowMapper(), values); } finally { pollForRecoveryJdbcTemplate.clearStatementBatchSize(); } }