consumers.add(sub); applyRecovery=true; super.addSubscription(context, sub); sub.add(context, this); consumers.add(sub); super.addSubscription(context, sub); super.addSubscription(context, sub); sub.add(context, this); if(dsub.isActive()) {
@Override public boolean sendToDeadLetterQueue(ConnectionContext context, MessageReference messageReference, Subscription subscription, Throwable poisonCause) { boolean wasDLQd = super.sendToDeadLetterQueue(context, messageReference, subscription, poisonCause); if (wasDLQd) { try { if (!messageReference.isAdvisory()) { BaseDestination baseDestination = (BaseDestination) messageReference.getMessage().getRegionDestination(); ActiveMQTopic topic = AdvisorySupport.getMessageDLQdAdvisoryTopic(baseDestination.getActiveMQDestination()); Message payload = messageReference.getMessage().copy(); if (!baseDestination.isIncludeBodyForAdvisory()) { payload.clearBody(); } fireAdvisory(context, topic, payload); } } catch (Exception e) { handleFireFailure("add to DLQ", e); } } return wasDLQd; }
@Override public void duplicateFromStore(Message message, Subscription subscription) { ConnectionContext connectionContext = createConnectionContext(); getLog().warn("{}{}, redirecting {} for dlq processing", DUPLICATE_FROM_STORE_MSG_PREFIX, destination, message.getMessageId()); Throwable cause = new Throwable(DUPLICATE_FROM_STORE_MSG_PREFIX + destination); message.setRegionDestination(this); broker.getRoot().sendToDeadLetterQueue(connectionContext, message, null, cause); MessageAck messageAck = new MessageAck(message, MessageAck.POSION_ACK_TYPE, 1); messageAck.setPoisonCause(cause); try { acknowledge(connectionContext, subscription, messageAck, message); } catch (IOException e) { getLog().error("Failed to acknowledge duplicate message {} from {} with {}", message.getMessageId(), destination, messageAck); } }
@Override public void markForGC(long timeStamp) { if (isGcIfInactive() && this.lastActiveTime == 0 && isActive() == false && destinationStatistics.messages.getCount() == 0 && getInactiveTimeoutBeforeGC() > 0l) { this.lastActiveTime = timeStamp; } }
@Override public boolean canGC() { boolean result = false; final long currentLastActiveTime = this.lastActiveTime; if (isGcIfInactive() && currentLastActiveTime != 0l && destinationStatistics.messages.getCount() == 0L ) { if ((System.currentTimeMillis() - currentLastActiveTime) >= getInactiveTimeoutBeforeGC()) { result = true; } } return result; }
public void baseUpdate(BaseDestination destination, Set<String> includedProperties) { if (isUpdate("producerFlowControl", includedProperties)) { destination.setProducerFlowControl(isProducerFlowControl()); destination.setAlwaysRetroactive(isAlwaysRetroactive()); destination.setBlockedProducerWarningInterval(getBlockedProducerWarningInterval()); destination.setMaxPageSize(getMaxPageSize()); destination.setMaxBrowsePageSize(getMaxBrowsePageSize()); destination.setMinimumMessageSize((int) getMinimumMessageSize()); destination.setMaxExpirePageSize(getMaxExpirePageSize()); destination.setCursorMemoryHighWaterMark(getCursorMemoryHighWaterMark()); destination.setStoreUsageHighWaterMark(getStoreUsageHighWaterMark()); destination.setGcIfInactive(isGcInactiveDestinations()); destination.setGcWithNetworkConsumers(isGcWithNetworkConsumers()); destination.setInactiveTimeoutBeforeGC(getInactiveTimeoutBeforeGC()); destination.setReduceMemoryFootprint(isReduceMemoryFootprint()); destination.setDoOptimzeMessageStorage(isDoOptimzeMessageStorage());
public void baseConfiguration(Broker broker,BaseDestination destination) { destination.setProducerFlowControl(isProducerFlowControl()); destination.setBlockedProducerWarningInterval(getBlockedProducerWarningInterval()); destination.setEnableAudit(isEnableAudit()); destination.setMaxAuditDepth(getMaxQueueAuditDepth()); destination.setMaxProducersToAudit(getMaxProducersToAudit()); destination.setMaxPageSize(getMaxPageSize()); destination.setMaxBrowsePageSize(getMaxBrowsePageSize()); destination.setUseCache(isUseCache()); destination.setMinimumMessageSize((int) getMinimumMessageSize()); destination.setAdvisoryForConsumed(isAdvisoryForConsumed()); destination.setAdvisoryForDelivery(isAdvisoryForDelivery()); destination.setAdvisoryForDiscardingMessages(isAdvisoryForDiscardingMessages()); destination.setAdvisoryForSlowConsumers(isAdvisoryForSlowConsumers()); destination.setAdvisdoryForFastProducers(isAdvisdoryForFastProducers()); destination.setAdvisoryWhenFull(isAdvisoryWhenFull()); destination.setSendAdvisoryIfNoConsumers(sendAdvisoryIfNoConsumers); destination.setExpireMessagesPeriod(getExpireMessagesPeriod()); destination.setMaxExpirePageSize(getMaxExpirePageSize()); destination.setCursorMemoryHighWaterMark(getCursorMemoryHighWaterMark()); destination.setStoreUsageHighWaterMark(getStoreUsageHighWaterMark()); SlowConsumerStrategy scs = getSlowConsumerStrategy(); if (scs != null) { scs.setBrokerService(broker); destination.setSlowConsumerStrategy(scs); destination.setPrioritizedMessages(isPrioritizedMessages()); destination.setGcIfInactive(isGcInactiveDestinations()); destination.setInactiveTimoutBeforeGC(getInactiveTimoutBeforeGC()); destination.setReduceMemoryFootprint(isReduceMemoryFootprint());
public void baseConfiguration(Broker broker, BaseDestination destination) { baseUpdate(destination); destination.setEnableAudit(isEnableAudit()); destination.setMaxAuditDepth(getMaxQueueAuditDepth()); destination.setMaxProducersToAudit(getMaxProducersToAudit()); destination.setUseCache(isUseCache()); destination.setExpireMessagesPeriod(getExpireMessagesPeriod()); SlowConsumerStrategy scs = getSlowConsumerStrategy(); if (scs != null) { scs.setBrokerService(broker); scs.addDestination(destination); } destination.setSlowConsumerStrategy(scs); destination.setPrioritizedMessages(isPrioritizedMessages()); if (sendFailIfNoSpace != -1) { destination.getSystemUsage().setSendFailIfNoSpace(isSendFailIfNoSpace()); } if (sendFailIfNoSpaceAfterTimeout != -1) { destination.getSystemUsage().setSendFailIfNoSpaceAfterTimeout(getSendFailIfNoSpaceAfterTimeout()); } }
/** * Called to notify a producer is too fast * * @param context * @param producerInfo */ @Override public void fastProducer(ConnectionContext context, ProducerInfo producerInfo) { if (advisoryForFastProducers) { broker.fastProducer(context, producerInfo, getActiveMQDestination()); } }
protected final void waitForSpace(ConnectionContext context, ProducerBrokerExchange producerBrokerExchange, Usage<?> usage, int highWaterMark, String warning) throws IOException, InterruptedException, ResourceAllocationException { if (!context.isNetworkConnection() && systemUsage.isSendFailIfNoSpace()) { if (isFlowControlLogRequired()) { getLog().info("sendFailIfNoSpace, forcing exception on send, usage: {}: {}", usage, warning); } else { getLog().debug("sendFailIfNoSpace, forcing exception on send, usage: {}: {}", usage, warning); if (isFlowControlLogRequired()) { getLog().info("sendFailIfNoSpaceAfterTimeout expired, forcing exception on send, usage: {}: {}", usage, warning); } else { getLog().debug("sendFailIfNoSpaceAfterTimeout expired, forcing exception on send, usage: {}: {}", usage, warning); if (isFlowControlLogRequired()) { getLog().warn("{}: {} (blocking for: {}s)", new Object[]{ usage, warning, new Long(((System.currentTimeMillis() - start) / 1000))}); } else { getLog().debug("{}: {} (blocking for: {}s)", new Object[]{ usage, warning, new Long(((System.currentTimeMillis() - start) / 1000))});
@Override public void removeSubscription(ConnectionContext context, Subscription sub, long lastDeliveredSequenceId) throws Exception { if (!sub.getConsumerInfo().isDurable()) { boolean removed = false; synchronized (consumers) { removed = consumers.remove(sub); } if (removed) { super.removeSubscription(context, sub, lastDeliveredSequenceId); } } sub.remove(context, this); }
@Override public void initialize() throws Exception { super.initialize(); // set non default subscription recovery policy (override policyEntries) if (AdvisorySupport.isMasterBrokerAdvisoryTopic(destination)) { subscriptionRecoveryPolicy = new LastImageSubscriptionRecoveryPolicy(); setAlwaysRetroactive(true); } if (store != null) { // AMQ-2586: Better to leave this stat at zero than to give the user // misleading metrics. // int messageCount = store.getMessageCount(); // destinationStatistics.getMessages().setCount(messageCount); store.start(); } }
if (d instanceof BaseDestination) { BaseDestination bd = (BaseDestination) d; bd.markForGC(timeStamp); if (bd.canGC()) { list.add(bd); dest.getLog().info( dest.getName() + " Inactive for longer than " + dest.getInactiveTimoutBeforeGC() + " ms - removing ..."); try { getRoot().removeDestination(context, dest.getActiveMQDestination(), 0); } catch (Exception e) { LOG.error("Failed to remove inactive destination " + dest, e);
public void markForGC(long timeStamp) { if (isGcIfInactive() && this.lastActiveTime == 0 && isActive() == false && destinationStatistics.messages.getCount() == 0 && getInactiveTimoutBeforeGC() > 0l) { this.lastActiveTime = timeStamp; } }
Logger log = LOG; if (dest instanceof BaseDestination) { log = ((BaseDestination) dest).getLog();
@Override public void registerIndexListener(IndexListener indexListener) { getDelegate().registerIndexListener(indexListener); try { if (indexListener instanceof BaseDestination) { // update queue storeUsage Object matchingPersistenceAdapter = multiKahaDBPersistenceAdapter.destinationMap.chooseValue(getDelegate().getDestination()); if (matchingPersistenceAdapter instanceof FilteredKahaDBPersistenceAdapter) { FilteredKahaDBPersistenceAdapter filteredAdapter = (FilteredKahaDBPersistenceAdapter) matchingPersistenceAdapter; if (filteredAdapter.getUsage() != null && filteredAdapter.getPersistenceAdapter() instanceof KahaDBPersistenceAdapter) { StoreUsage storeUsage = filteredAdapter.getUsage(); storeUsage.setStore(filteredAdapter.getPersistenceAdapter()); storeUsage.setParent(multiKahaDBPersistenceAdapter.getBrokerService().getSystemUsage().getStoreUsage()); ((BaseDestination) indexListener).getSystemUsage().setStoreUsage(storeUsage); } } } } catch (Exception ignored) { LOG.warn("Failed to set mKahaDB destination store usage", ignored); } } };
public boolean canGC() { boolean result = false; if (isGcIfInactive()&& this.lastActiveTime != 0l) { if ((System.currentTimeMillis() - this.lastActiveTime) >= getInactiveTimoutBeforeGC()) { result = true; } } return result; }
public void baseUpdate(BaseDestination destination, Set<String> includedProperties) { if (isUpdate("producerFlowControl", includedProperties)) { destination.setProducerFlowControl(isProducerFlowControl()); destination.setAlwaysRetroactive(isAlwaysRetroactive()); destination.setBlockedProducerWarningInterval(getBlockedProducerWarningInterval()); destination.setMaxPageSize(getMaxPageSize()); destination.setMaxBrowsePageSize(getMaxBrowsePageSize()); destination.setMinimumMessageSize((int) getMinimumMessageSize()); destination.setMaxExpirePageSize(getMaxExpirePageSize()); destination.setCursorMemoryHighWaterMark(getCursorMemoryHighWaterMark()); destination.setStoreUsageHighWaterMark(getStoreUsageHighWaterMark()); destination.setGcIfInactive(isGcInactiveDestinations()); destination.setGcWithNetworkConsumers(isGcWithNetworkConsumers()); destination.setInactiveTimeoutBeforeGC(getInactiveTimeoutBeforeGC()); destination.setReduceMemoryFootprint(isReduceMemoryFootprint()); destination.setDoOptimzeMessageStorage(isDoOptimzeMessageStorage());
@Override public void markForGC(long timeStamp) { if (isGcIfInactive() && this.lastActiveTime == 0 && isActive() == false && destinationStatistics.messages.getCount() == 0 && getInactiveTimeoutBeforeGC() > 0l) { this.lastActiveTime = timeStamp; } }