ConnectionContext connectionContext = entry.getValue().context;
if (connectionContext == null) {
continue;
}
Connection connection = connectionContext.getConnection();
if (connection == null) {
LOG.debug("slowConsumer abort ignored, no connection in context:" + connectionContext);
}
if (!abortMap.containsKey(connection)) {
abortMap.put(connection, new ArrayList<Subscription>());
}
abortMap.get(connection).add(entry.getKey());
}
for (Entry<Connection, List<Subscription>> entry : abortMap.entrySet()) {
final Connection connection = entry.getKey();
final List<Subscription> subscriptions = entry.getValue();
if (abortSubscriberConnection) {
LOG.info("aborting connection:{} with {} slow consumers",
connection.getConnectionId(), subscriptions.size());
if (LOG.isTraceEnabled()) {
for (Subscription subscription : subscriptions) {
LOG.trace("Connection {} being aborted because of slow consumer: {} on destination: {}",
new Object[] { connection.getConnectionId(),
subscription.getConsumerInfo().getConsumerId(),
subscription.getActiveMQDestination() });
}
}
try {
scheduler.executeAfterDelay(new Runnable() {
@Override
public void run() {
connection.serviceException(new InactivityIOException(
subscriptions.size() + " Consumers was slow too often (>"
+ maxSlowCount + ") or too long (>"
+ maxSlowDuration + "): "));
}}, 0l);
} catch (Exception e) {
LOG.info("exception on aborting connection {} with {} slow consumers",
connection.getConnectionId(), subscriptions.size());
}
} else {
// just abort each consumer by telling it to stop
for (Subscription subscription : subscriptions) {
LOG.info("aborting slow consumer: {} for destination:{}",
subscription.getConsumerInfo().getConsumerId(),
subscription.getActiveMQDestination());
try {
ConsumerControl stopConsumer = new ConsumerControl();
stopConsumer.setConsumerId(subscription.getConsumerInfo().getConsumerId());
stopConsumer.setClose(true);
connection.dispatchAsync(stopConsumer);
} catch (Exception e) {
LOG.info("exception on aborting slow consumer: {}", subscription.getConsumerInfo().getConsumerId());
}
}
}