private void setLastCachedId(final int index, MessageId candidate) { MessageId lastCacheId = lastCachedIds[index]; if (lastCacheId == null) { lastCachedIds[index] = candidate; } else { Object lastCacheFutureOrSequenceLong = lastCacheId.getFutureOrSequenceLong(); Object candidateOrSequenceLong = candidate.getFutureOrSequenceLong(); if (lastCacheFutureOrSequenceLong == null) { // possibly null for topics lastCachedIds[index] = candidate; } else if (candidateOrSequenceLong != null && Long.compare(((Long) candidateOrSequenceLong), ((Long) lastCacheFutureOrSequenceLong)) > 0) { lastCachedIds[index] = candidate; } else if (LOG.isTraceEnabled()) { LOG.trace("no set last cached[" + index + "] current:" + lastCacheFutureOrSequenceLong + " <= than candidate: " + candidateOrSequenceLong+ ", " + this); } } }
@Override public String toString() { return super.toString() + ":" + regionDestination.getActiveMQDestination().getPhysicalName() + ",batchResetNeeded=" + batchResetNeeded + ",size=" + this.size + ",cacheEnabled=" + cacheEnabled + ",maxBatchSize:" + maxBatchSize + ",hasSpace:" + hasSpace() + ",pendingCachedIds.size:" + pendingCachedIds.size() + ",lastSyncCachedId:" + lastCachedIds[SYNC_ADD] + ",lastSyncCachedId-seq:" + (lastCachedIds[SYNC_ADD] != null ? lastCachedIds[SYNC_ADD].getFutureOrSequenceLong() : "null") + ",lastAsyncCachedId:" + lastCachedIds[ASYNC_ADD] + ",lastAsyncCachedId-seq:" + (lastCachedIds[ASYNC_ADD] != null ? lastCachedIds[ASYNC_ADD].getFutureOrSequenceLong() : "null"); }
@Override protected void setBatch(MessageId messageId) throws Exception { if (LOG.isTraceEnabled()) { LOG.trace("{} setBatch {} seq: {}, loc: {}", this, messageId, messageId.getFutureOrSequenceLong(), messageId.getEntryLocator()); } store.setBatch(messageId); batchResetNeeded = false; }
public static boolean gotToTheStore(Message message) throws Exception { if (message.isRecievedByDFBridge()) { // concurrent store and dispatch - wait to see if the message gets to the store to see // if the index suppressed it (original still present), or whether it was stored and needs to be removed Object possibleFuture = message.getMessageId().getFutureOrSequenceLong(); if (possibleFuture instanceof Future) { try { ((Future) possibleFuture).get(); } catch (Exception okToErrorOrCancelStoreOp) {} } // need to access again after wait on future Object sequence = message.getMessageId().getFutureOrSequenceLong(); return (sequence != null && sequence instanceof Long && Long.compare((Long) sequence, -1l) != 0); } return true; }
private void pruneLastCached() { for (Iterator<MessageId> it = pendingCachedIds.iterator(); it.hasNext(); ) { MessageId candidate = it.next(); final Object futureOrLong = candidate.getFutureOrSequenceLong(); if (futureOrLong instanceof Future) { Future future = (Future) futureOrLong; long next = 1 + (Long)lastCachedIds[SYNC_ADD].getFutureOrSequenceLong(); if (Long.compare((Long)futureOrLong, next) == 0) { setLastCachedId(SYNC_ADD, candidate);
private static final boolean isAsync(Message message) { return message.isRecievedByDFBridge() || message.getMessageId().getFutureOrSequenceLong() instanceof Future; }
for (ListIterator<MessageId> it = pendingCachedIds.listIterator(pendingCachedIds.size()); it.hasPrevious(); ) { MessageId lastPending = it.previous(); Object futureOrLong = lastPending.getFutureOrSequenceLong(); if (futureOrLong instanceof Future) { Future future = (Future) futureOrLong; if (candidate != null) { if (!isAsync(currentAdd) && Long.compare(((Long) currentAdd.getMessageId().getFutureOrSequenceLong()), ((Long) lastCachedIds[ASYNC_ADD].getFutureOrSequenceLong())) < 0) { if (LOG.isTraceEnabled()) { LOG.trace("no set batch from async:" + candidate.getFutureOrSequenceLong() + " >= than current: " + currentAdd.getMessageId().getFutureOrSequenceLong() + ", " + this);
synchronized (indexOrderedCursorUpdates) { MessageContext candidate = indexOrderedCursorUpdates.peek(); while (candidate != null && candidate.message.getMessageId().getFutureOrSequenceLong() != null) { candidate = indexOrderedCursorUpdates.removeFirst(); if (candidate.message.getMessageId().getFutureOrSequenceLong() instanceof Long && ((Long)candidate.message.getMessageId().getFutureOrSequenceLong()).compareTo(-1l) == 0) { LOG.warn("{} messageStore indicated duplicate add attempt for {}, suppressing duplicate dispatch", this, candidate.message.getMessageId()); } else {
@Override public void removeMessage(ConnectionContext context, MessageAck ack) throws IOException { long seq = ack.getLastMessageId().getFutureOrSequenceLong() != null ? (Long) ack.getLastMessageId().getFutureOrSequenceLong() : persistenceAdapter.getStoreSequenceIdForMessageId(context, ack.getLastMessageId(), destination)[0]; // Get a connection and remove the message from the DB TransactionContext c = persistenceAdapter.getTransactionContext(context); try { adapter.doRemoveMessage(c, seq, context != null ? context.getXid() : null); } catch (SQLException e) { JDBCPersistenceAdapter.log("JDBC Failure: ", e); throw IOExceptionSupport.create("Failed to broker message: " + ack.getLastMessageId() + " in container: " + e, e); } finally { c.close(); } }
LOG.trace("{} store replayed pending message due to concurrentStoreAndDispatchQueues {} seq: {}", this, message.getMessageId(), message.getMessageId().getFutureOrSequenceLong()); LOG.warn("{} - cursor got duplicate from store {} seq: {}", this, message.getMessageId(), message.getMessageId().getFutureOrSequenceLong()); duplicate(message); LOG.warn("{} - cursor got duplicate send {} seq: {}", this, message.getMessageId(), message.getMessageId().getFutureOrSequenceLong()); if (gotToTheStore(message)) { duplicate(message);
@Override public synchronized boolean tryAddMessageLast(MessageReference node, long wait) throws Exception { boolean disableCache = false; if (hasSpace()) { if (isCacheEnabled()) { if (recoverMessage(node.getMessage(),true)) { trackLastCached(node); } else { dealWithDuplicates(); return false; } } } else { disableCache = true; } if (disableCache && isCacheEnabled()) { if (LOG.isTraceEnabled()) { LOG.trace("{} - disabling cache on add {} {}", this, node.getMessageId(), node.getMessageId().getFutureOrSequenceLong()); } syncWithStore(node.getMessage()); setCacheEnabled(false); } size++; return true; }
LOG.warn("{}, duplicate message {} - {} from cursor, is cursor audit disabled or too constrained? Redirecting to dlq", this, ref.getMessageId(), ref.getMessage().getMessageId().getFutureOrSequenceLong()); if (store != null) { ConnectionContext connectionContext = createConnectionContext();
@Override public void addMessage(final ConnectionContext context, final Message message) throws IOException { final KahaAddMessageCommand command = new KahaAddMessageCommand(); command.setDestination(dest); command.setMessageId(message.getMessageId().toProducerKey()); command.setTransactionInfo(TransactionIdConversion.convert(transactionIdTransformer.transform(message.getTransactionId()))); command.setPriority(message.getPriority()); command.setPrioritySupported(isPrioritizedMessages()); org.apache.activemq.util.ByteSequence packet = wireFormat.marshal(message); command.setMessage(new Buffer(packet.getData(), packet.getOffset(), packet.getLength())); store(command, isEnableJournalDiskSyncs() && message.isResponseRequired(), new IndexAware() { // sync add? (for async, future present from getFutureOrSequenceLong) Object possibleFuture = message.getMessageId().getFutureOrSequenceLong(); @Override public void sequenceAssignedWithIndexLocked(final long sequence) { message.getMessageId().setFutureOrSequenceLong(sequence); if (indexListener != null) { if (possibleFuture == null) { trackPendingAdd(dest, sequence); indexListener.onAdd(new IndexListener.MessageContext(context, message, new Runnable() { @Override public void run() { trackPendingAddComplete(dest, sequence); } })); } } } }, null); }
@Override protected void setBatch(MessageId messageId) throws Exception { if (LOG.isTraceEnabled()) { LOG.trace("{} setBatch {} seq: {}, loc: {}", this, messageId, messageId.getFutureOrSequenceLong(), messageId.getEntryLocator()); } store.setBatch(messageId); batchResetNeeded = false; }
@Override protected void setBatch(MessageId messageId) throws Exception { if (LOG.isTraceEnabled()) { LOG.trace("{} setBatch {} seq: {}, loc: {}", this, messageId, messageId.getFutureOrSequenceLong(), messageId.getEntryLocator()); } store.setBatch(messageId); batchResetNeeded = false; }
@Override protected void setBatch(MessageId messageId) throws Exception { if (LOG.isTraceEnabled()) { LOG.trace("{} setBatch {} seq: {}, loc: {}", this, messageId, messageId.getFutureOrSequenceLong(), messageId.getEntryLocator()); } store.setBatch(messageId); batchResetNeeded = false; }
@Override public String toString() { return super.toString() + ":" + regionDestination.getActiveMQDestination().getPhysicalName() + ",batchResetNeeded=" + batchResetNeeded + ",size=" + this.size + ",cacheEnabled=" + isCacheEnabled() + ",maxBatchSize:" + maxBatchSize + ",hasSpace:" + hasSpace() + ",pendingCachedIds.size:" + pendingCachedIds.size() + ",lastSyncCachedId:" + lastCachedIds[SYNC_ADD] + ",lastSyncCachedId-seq:" + (lastCachedIds[SYNC_ADD] != null ? lastCachedIds[SYNC_ADD].getFutureOrSequenceLong() : "null") + ",lastAsyncCachedId:" + lastCachedIds[ASYNC_ADD] + ",lastAsyncCachedId-seq:" + (lastCachedIds[ASYNC_ADD] != null ? lastCachedIds[ASYNC_ADD].getFutureOrSequenceLong() : "null"); }
@Override public String toString() { return super.toString() + ":" + regionDestination.getActiveMQDestination().getPhysicalName() + ",batchResetNeeded=" + batchResetNeeded + ",size=" + this.size + ",cacheEnabled=" + isCacheEnabled() + ",maxBatchSize:" + maxBatchSize + ",hasSpace:" + hasSpace() + ",pendingCachedIds.size:" + pendingCachedIds.size() + ",lastSyncCachedId:" + lastCachedIds[SYNC_ADD] + ",lastSyncCachedId-seq:" + (lastCachedIds[SYNC_ADD] != null ? lastCachedIds[SYNC_ADD].getFutureOrSequenceLong() : "null") + ",lastAsyncCachedId:" + lastCachedIds[ASYNC_ADD] + ",lastAsyncCachedId-seq:" + (lastCachedIds[ASYNC_ADD] != null ? lastCachedIds[ASYNC_ADD].getFutureOrSequenceLong() : "null"); }
@Override public String toString() { return super.toString() + ":" + regionDestination.getActiveMQDestination().getPhysicalName() + ",batchResetNeeded=" + batchResetNeeded + ",size=" + this.size + ",cacheEnabled=" + isCacheEnabled() + ",maxBatchSize:" + maxBatchSize + ",hasSpace:" + hasSpace() + ",pendingCachedIds.size:" + pendingCachedIds.size() + ",lastSyncCachedId:" + lastCachedIds[SYNC_ADD] + ",lastSyncCachedId-seq:" + (lastCachedIds[SYNC_ADD] != null ? lastCachedIds[SYNC_ADD].getFutureOrSequenceLong() : "null") + ",lastAsyncCachedId:" + lastCachedIds[ASYNC_ADD] + ",lastAsyncCachedId-seq:" + (lastCachedIds[ASYNC_ADD] != null ? lastCachedIds[ASYNC_ADD].getFutureOrSequenceLong() : "null"); }
public void commitRemove(ConnectionContext context, MessageAck ack) throws IOException { TransactionContext c = getTransactionContext(context); try { getAdapter().doRemoveMessage(c, (Long)ack.getLastMessageId().getFutureOrSequenceLong(), null); } catch (SQLException e) { JDBCPersistenceAdapter.log("JDBC Failure: ", e); throw IOExceptionSupport.create("Failed to commit last ack: " + ack + ". Reason: " + e,e); } finally { c.close(); } }