This closes #2688
This commit is contained in:
commit
f0c023eec1
|
@ -3935,19 +3935,25 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
float queueRate = getRate();
|
float queueRate = getRate();
|
||||||
|
long queueMessages = getMessageCount();
|
||||||
|
|
||||||
if (logger.isDebugEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
logger.debug(getAddress() + ":" + getName() + " has " + getConsumerCount() + " consumer(s) and is receiving messages at a rate of " + queueRate + " msgs/second.");
|
logger.debug(getAddress() + ":" + getName() + " has " + queueMessages + " message(s) and " + getConsumerCount() + " consumer(s) and is receiving messages at a rate of " + queueRate + " msgs/second.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (consumers.size() == 0) {
|
if (consumers.size() == 0) {
|
||||||
logger.debug("There are no consumers, no need to check slow consumer's rate");
|
logger.debug("There are no consumers, no need to check slow consumer's rate");
|
||||||
return;
|
return;
|
||||||
} else if (queueRate < (threshold * consumers.size())) {
|
} else {
|
||||||
if (logger.isDebugEnabled()) {
|
float queueThreshold = threshold * consumers.size();
|
||||||
logger.debug("Insufficient messages received on queue \"" + getName() + "\" to satisfy slow-consumer-threshold. Skipping inspection of consumer.");
|
|
||||||
|
if (queueRate < queueThreshold && queueMessages < queueThreshold) {
|
||||||
|
if (logger.isDebugEnabled()) {
|
||||||
|
logger.debug("Insufficient messages received on queue \"" + getName() + "\" to satisfy slow-consumer-threshold. Skipping inspection of consumer.");
|
||||||
|
}
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ConsumerHolder consumerHolder : consumers) {
|
for (ConsumerHolder consumerHolder : consumers) {
|
||||||
|
@ -3955,11 +3961,7 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
|
||||||
if (consumer instanceof ServerConsumerImpl) {
|
if (consumer instanceof ServerConsumerImpl) {
|
||||||
ServerConsumerImpl serverConsumer = (ServerConsumerImpl) consumer;
|
ServerConsumerImpl serverConsumer = (ServerConsumerImpl) consumer;
|
||||||
float consumerRate = serverConsumer.getRate();
|
float consumerRate = serverConsumer.getRate();
|
||||||
if (queueRate < threshold) {
|
if (consumerRate < threshold) {
|
||||||
if (logger.isDebugEnabled()) {
|
|
||||||
logger.debug("Insufficient messages received on queue \"" + getName() + "\" to satisfy slow-consumer-threshold. Skipping inspection of consumer.");
|
|
||||||
}
|
|
||||||
} else if (consumerRate < threshold) {
|
|
||||||
RemotingConnection connection = null;
|
RemotingConnection connection = null;
|
||||||
ActiveMQServer server = ((PostOfficeImpl) postOffice).getServer();
|
ActiveMQServer server = ((PostOfficeImpl) postOffice).getServer();
|
||||||
RemotingService remotingService = server.getRemotingService();
|
RemotingService remotingService = server.getRemotingService();
|
||||||
|
|
|
@ -59,7 +59,8 @@ public class SlowConsumerTest extends ActiveMQTestBase {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(SlowConsumerTest.class);
|
private static final Logger logger = Logger.getLogger(SlowConsumerTest.class);
|
||||||
|
|
||||||
int threshold = 10;
|
private int threshold = 10;
|
||||||
|
private long checkPeriod = 1;
|
||||||
private boolean isNetty = false;
|
private boolean isNetty = false;
|
||||||
private boolean isPaging = false;
|
private boolean isPaging = false;
|
||||||
|
|
||||||
|
@ -89,7 +90,7 @@ public class SlowConsumerTest extends ActiveMQTestBase {
|
||||||
server = createServer(true, isNetty);
|
server = createServer(true, isNetty);
|
||||||
|
|
||||||
AddressSettings addressSettings = new AddressSettings();
|
AddressSettings addressSettings = new AddressSettings();
|
||||||
addressSettings.setSlowConsumerCheckPeriod(1);
|
addressSettings.setSlowConsumerCheckPeriod(checkPeriod);
|
||||||
addressSettings.setSlowConsumerThreshold(threshold);
|
addressSettings.setSlowConsumerThreshold(threshold);
|
||||||
addressSettings.setSlowConsumerPolicy(SlowConsumerPolicy.KILL);
|
addressSettings.setSlowConsumerPolicy(SlowConsumerPolicy.KILL);
|
||||||
|
|
||||||
|
@ -142,6 +143,67 @@ public class SlowConsumerTest extends ActiveMQTestBase {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSlowConsumerKilledAfterBurst() throws Exception {
|
||||||
|
ClientSessionFactory sf = createSessionFactory(locator);
|
||||||
|
|
||||||
|
ClientSession session = addClientSession(sf.createSession(false, true, true, false));
|
||||||
|
|
||||||
|
ClientProducer producer = addClientProducer(session.createProducer(QUEUE));
|
||||||
|
|
||||||
|
assertPaging();
|
||||||
|
|
||||||
|
final int numMessages = 3 * threshold;
|
||||||
|
|
||||||
|
for (int i = 0; i < numMessages; i++) {
|
||||||
|
producer.send(createTextMessage(session, "m" + i));
|
||||||
|
}
|
||||||
|
|
||||||
|
ClientConsumer consumer = addClientConsumer(session.createConsumer(QUEUE));
|
||||||
|
session.start();
|
||||||
|
|
||||||
|
for (int i = 0; i < threshold; i++) {
|
||||||
|
consumer.receiveImmediate().individualAcknowledge();
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.sleep(3 * checkPeriod * 1000);
|
||||||
|
|
||||||
|
try {
|
||||||
|
consumer.receiveImmediate();
|
||||||
|
fail();
|
||||||
|
} catch (ActiveMQObjectClosedException e) {
|
||||||
|
assertEquals(e.getType(), ActiveMQExceptionType.OBJECT_CLOSED);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSlowConsumerSparedAfterBurst() throws Exception {
|
||||||
|
ClientSessionFactory sf = createSessionFactory(locator);
|
||||||
|
|
||||||
|
ClientSession session = addClientSession(sf.createSession(false, true, true, false));
|
||||||
|
|
||||||
|
ClientProducer producer = addClientProducer(session.createProducer(QUEUE));
|
||||||
|
|
||||||
|
assertPaging();
|
||||||
|
|
||||||
|
final int numMessages = 3 * threshold + 1;
|
||||||
|
|
||||||
|
for (int i = 0; i < numMessages; i++) {
|
||||||
|
producer.send(createTextMessage(session, "m" + i));
|
||||||
|
}
|
||||||
|
|
||||||
|
ClientConsumer consumer = addClientConsumer(session.createConsumer(QUEUE));
|
||||||
|
session.start();
|
||||||
|
|
||||||
|
for (int i = 0; i < 3 * threshold; i++) {
|
||||||
|
consumer.receiveImmediate().individualAcknowledge();
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.sleep(3 * checkPeriod * 1000);
|
||||||
|
|
||||||
|
assertNotNull(consumer.receiveImmediate());
|
||||||
|
}
|
||||||
|
|
||||||
private void assertPaging() throws Exception {
|
private void assertPaging() throws Exception {
|
||||||
Queue queue = server.locateQueue(QUEUE);
|
Queue queue = server.locateQueue(QUEUE);
|
||||||
if (isPaging) {
|
if (isPaging) {
|
||||||
|
|
Loading…
Reference in New Issue