@Override public boolean apply(final T input) { return (input.getProcessingState() == PersistentQueueEntryLifecycleState.AVAILABLE); } }));
private boolean removeInflightEventsWhenSwitchingToQueueOpenForRead(final List<T> candidates) { boolean foundEntryInInflightEvents = false; for (T entry : candidates) { foundEntryInInflightEvents = inflightEvents.remove(entry.getRecordId()); } return foundEntryInInflightEvents; }
@Override public Void inTransaction(final QueueSqlDao<T> transactional, final TransactionStatus status) throws Exception { transactional.updateOnError(entry.getRecordId(), clock.getUTCNow().toDate(), entry.getErrorCount(), config.getTableName()); return null; } });
public void insertEntryFromTransaction(final QueueSqlDao<T> transactional, final T entry) { transactional.insertEntry(entry, config.getTableName()); totalWritten.inc(); if (useInflightQueue && isQueueOpenForWrite.get()) { Long lastInsertId = transactional.getLastInsertId(); boolean success = inflightEvents.offer(lastInsertId); if (log.isDebugEnabled()) { log.debug(DB_QUEUE_LOG_ID + "Inserting entry " + lastInsertId + (success ? " into inflightQ" : " into disk") + " [" + entry.getEventJson() + "]" ); } // Q overflowed if (!success) { final boolean q = isQueueOpenForWrite.compareAndSet(true, false); if (q) { log.info(DB_QUEUE_LOG_ID + "Closing Q for write: Overflowed with recordId = " + lastInsertId); } } else { totalInflightWritten.inc(); } } }
private List<T> getEntriesFromIds(final List<Long> recordIds) { int originalSize = recordIds.size(); List<T> result = new ArrayList<T>(recordIds.size()); int nbTries = 0; do { final List<T> tmp = sqlDao.getEntriesFromIds(recordIds, config.getTableName()); if (tmp.size() > 0) { for (T cur : tmp) { recordIds.remove(cur.getRecordId()); } result.addAll(tmp); } if (result.size() < originalSize) { try { long sleepTime = INFLIGHT_ENTRIES_INITIAL_POLL_SLEEP_MS * (int) Math.pow(2, nbTries); Thread.sleep(sleepTime); log.info(DB_QUEUE_LOG_ID + "Sleeping " + sleepTime + " for IDS = " + Joiner.on(",").join(recordIds)); } catch (InterruptedException e) { log.warn(DB_QUEUE_LOG_ID + "Thread " + Thread.currentThread() + " got interrupted"); Thread.currentThread().interrupt(); return result; } } nbTries++; } while (result.size() < originalSize && nbTries < INFLIGHT_ENTRIES_POLL_MAX_RETRY); if (recordIds.size() > 0) { log.warn(DB_QUEUE_LOG_ID + " Missing inflight entries from disk, recordIds = [" + Joiner.on(",").join(recordIds) + " ]"); } return result; }
private boolean claimEntry(T entry) { final Date nextAvailable = clock.getUTCNow().plus(config.getClaimedTime().getMillis()).toDate(); final boolean claimed = (sqlDao.claimEntry(entry.getRecordId(), clock.getUTCNow().toDate(), Hostname.get(), nextAvailable, config.getTableName()) == 1); if (claimed && log.isDebugEnabled()) { log.debug(DB_QUEUE_LOG_ID + "Claiming entry " + entry.getRecordId()); } return claimed; }
public void moveEntryToHistoryFromTransaction(final QueueSqlDao<T> transactional, final T entry) { transactional.insertEntry(entry, config.getHistoryTableName()); transactional.removeEntry(entry.getRecordId(), config.getTableName()); }