mirror of https://github.com/apache/activemq.git
git-svn-id: https://svn.apache.org/repos/asf/activemq/trunk@650763 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6aa07faceb
commit
18f9773326
|
@ -30,7 +30,7 @@ import org.apache.activemq.usage.SystemUsage;
|
||||||
* @version $Revision: 1.12 $
|
* @version $Revision: 1.12 $
|
||||||
*/
|
*/
|
||||||
public abstract class BaseDestination implements Destination {
|
public abstract class BaseDestination implements Destination {
|
||||||
|
public static final int DEFAULT_PAGE_SIZE=100;
|
||||||
protected final ActiveMQDestination destination;
|
protected final ActiveMQDestination destination;
|
||||||
protected final Broker broker;
|
protected final Broker broker;
|
||||||
protected final MessageStore store;
|
protected final MessageStore store;
|
||||||
|
@ -40,7 +40,7 @@ public abstract class BaseDestination implements Destination {
|
||||||
private int maxProducersToAudit=1024;
|
private int maxProducersToAudit=1024;
|
||||||
private int maxAuditDepth=2048;
|
private int maxAuditDepth=2048;
|
||||||
private boolean enableAudit=true;
|
private boolean enableAudit=true;
|
||||||
private int maxPageSize=100;
|
private int maxPageSize=DEFAULT_PAGE_SIZE;
|
||||||
private boolean useCache=true;
|
private boolean useCache=true;
|
||||||
private int minimumMessageSize=1024;
|
private int minimumMessageSize=1024;
|
||||||
private boolean lazyDispatch=false;
|
private boolean lazyDispatch=false;
|
||||||
|
|
|
@ -23,14 +23,14 @@ import java.util.Comparator;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.CopyOnWriteArraySet;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.ThreadFactory;
|
import java.util.concurrent.ThreadFactory;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
import javax.jms.InvalidSelectorException;
|
import javax.jms.InvalidSelectorException;
|
||||||
import javax.jms.JMSException;
|
import javax.jms.JMSException;
|
||||||
|
|
||||||
import org.apache.activemq.broker.BrokerService;
|
import org.apache.activemq.broker.BrokerService;
|
||||||
import org.apache.activemq.broker.ConnectionContext;
|
import org.apache.activemq.broker.ConnectionContext;
|
||||||
import org.apache.activemq.broker.ProducerBrokerExchange;
|
import org.apache.activemq.broker.ProducerBrokerExchange;
|
||||||
|
@ -69,6 +69,7 @@ import org.apache.activemq.util.BrokerSupport;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The Queue is a List of MessageEntry objects that are dispatched to matching
|
* The Queue is a List of MessageEntry objects that are dispatched to matching
|
||||||
* subscriptions.
|
* subscriptions.
|
||||||
|
@ -749,27 +750,27 @@ public class Queue extends BaseDestination implements Task {
|
||||||
*/
|
*/
|
||||||
public int removeMatchingMessages(MessageReferenceFilter filter, int maximumMessages) throws Exception {
|
public int removeMatchingMessages(MessageReferenceFilter filter, int maximumMessages) throws Exception {
|
||||||
int movedCounter = 0;
|
int movedCounter = 0;
|
||||||
int count = 0;
|
Set<MessageReference> set = new CopyOnWriteArraySet<MessageReference>();
|
||||||
ConnectionContext context = createConnectionContext();
|
ConnectionContext context = createConnectionContext();
|
||||||
List<MessageReference> list = null;
|
|
||||||
do {
|
do {
|
||||||
pageInMessages();
|
pageInMessages();
|
||||||
synchronized (pagedInMessages) {
|
synchronized (pagedInMessages) {
|
||||||
list = new ArrayList<MessageReference>(pagedInMessages.values());
|
set.addAll(pagedInMessages.values());
|
||||||
}
|
}
|
||||||
|
List <MessageReference>list = new ArrayList<MessageReference>(set);
|
||||||
for (MessageReference ref : list) {
|
for (MessageReference ref : list) {
|
||||||
IndirectMessageReference r = (IndirectMessageReference) ref;
|
IndirectMessageReference r = (IndirectMessageReference) ref;
|
||||||
if (filter.evaluate(context, r)) {
|
if (filter.evaluate(context, r)) {
|
||||||
|
|
||||||
removeMessage(context, r);
|
removeMessage(context, r);
|
||||||
|
set.remove(r);
|
||||||
if (++movedCounter >= maximumMessages
|
if (++movedCounter >= maximumMessages
|
||||||
&& maximumMessages > 0) {
|
&& maximumMessages > 0) {
|
||||||
return movedCounter;
|
return movedCounter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
} while (count < this.destinationStatistics.getMessages().getCount());
|
} while (set.size() < this.destinationStatistics.getMessages().getCount());
|
||||||
return movedCounter;
|
return movedCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -808,16 +809,21 @@ public class Queue extends BaseDestination implements Task {
|
||||||
public int copyMatchingMessages(ConnectionContext context, MessageReferenceFilter filter, ActiveMQDestination dest, int maximumMessages) throws Exception {
|
public int copyMatchingMessages(ConnectionContext context, MessageReferenceFilter filter, ActiveMQDestination dest, int maximumMessages) throws Exception {
|
||||||
int movedCounter = 0;
|
int movedCounter = 0;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
List<MessageReference> list = null;
|
Set<MessageReference> set = new CopyOnWriteArraySet<MessageReference>();
|
||||||
do {
|
do {
|
||||||
|
int oldMaxSize=getMaxPageSize();
|
||||||
|
setMaxPageSize((int) this.destinationStatistics.getMessages().getCount());
|
||||||
pageInMessages();
|
pageInMessages();
|
||||||
|
setMaxPageSize(oldMaxSize);
|
||||||
synchronized (pagedInMessages) {
|
synchronized (pagedInMessages) {
|
||||||
list = new ArrayList<MessageReference>(pagedInMessages.values());
|
set.addAll(pagedInMessages.values());
|
||||||
}
|
}
|
||||||
|
List <MessageReference>list = new ArrayList<MessageReference>(set);
|
||||||
for (MessageReference ref : list) {
|
for (MessageReference ref : list) {
|
||||||
IndirectMessageReference r = (IndirectMessageReference) ref;
|
IndirectMessageReference r = (IndirectMessageReference) ref;
|
||||||
if (filter.evaluate(context, r)) {
|
if (filter.evaluate(context, r)) {
|
||||||
r.incrementReferenceCount();
|
|
||||||
|
r.incrementReferenceCount();
|
||||||
try {
|
try {
|
||||||
Message m = r.getMessage();
|
Message m = r.getMessage();
|
||||||
BrokerSupport.resend(context, m, dest);
|
BrokerSupport.resend(context, m, dest);
|
||||||
|
@ -865,14 +871,14 @@ public class Queue extends BaseDestination implements Task {
|
||||||
*/
|
*/
|
||||||
public int moveMatchingMessagesTo(ConnectionContext context,MessageReferenceFilter filter, ActiveMQDestination dest,int maximumMessages) throws Exception {
|
public int moveMatchingMessagesTo(ConnectionContext context,MessageReferenceFilter filter, ActiveMQDestination dest,int maximumMessages) throws Exception {
|
||||||
int movedCounter = 0;
|
int movedCounter = 0;
|
||||||
int count = 0;
|
Set<MessageReference> set = new CopyOnWriteArraySet<MessageReference>();
|
||||||
List<MessageReference> list = null;
|
|
||||||
do {
|
do {
|
||||||
pageInMessages();
|
pageInMessages();
|
||||||
synchronized (pagedInMessages) {
|
synchronized (pagedInMessages) {
|
||||||
list = new ArrayList<MessageReference>(pagedInMessages.values());
|
set.addAll(pagedInMessages.values());
|
||||||
}
|
}
|
||||||
for (MessageReference ref : list) {
|
List <MessageReference>list = new ArrayList<MessageReference>(set);
|
||||||
|
for (MessageReference ref:list) {
|
||||||
IndirectMessageReference r = (IndirectMessageReference) ref;
|
IndirectMessageReference r = (IndirectMessageReference) ref;
|
||||||
if (filter.evaluate(context, r)) {
|
if (filter.evaluate(context, r)) {
|
||||||
// We should only move messages that can be locked.
|
// We should only move messages that can be locked.
|
||||||
|
@ -881,6 +887,7 @@ public class Queue extends BaseDestination implements Task {
|
||||||
Message m = r.getMessage();
|
Message m = r.getMessage();
|
||||||
BrokerSupport.resend(context, m, dest);
|
BrokerSupport.resend(context, m, dest);
|
||||||
removeMessage(context, r);
|
removeMessage(context, r);
|
||||||
|
set.remove(r);
|
||||||
if (++movedCounter >= maximumMessages
|
if (++movedCounter >= maximumMessages
|
||||||
&& maximumMessages > 0) {
|
&& maximumMessages > 0) {
|
||||||
return movedCounter;
|
return movedCounter;
|
||||||
|
@ -889,9 +896,9 @@ public class Queue extends BaseDestination implements Task {
|
||||||
r.decrementReferenceCount();
|
r.decrementReferenceCount();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
count++;
|
|
||||||
}
|
}
|
||||||
} while (count < this.destinationStatistics.getMessages().getCount());
|
} while (set.size() < this.destinationStatistics.getMessages().getCount());
|
||||||
return movedCounter;
|
return movedCounter;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1065,12 +1072,12 @@ public class Queue extends BaseDestination implements Task {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private List<QueueMessageReference> doPageIn(boolean force) throws Exception {
|
private List<QueueMessageReference> doPageIn(boolean force) throws Exception {
|
||||||
List<QueueMessageReference> result = null;
|
List<QueueMessageReference> result = null;
|
||||||
dispatchLock.lock();
|
dispatchLock.lock();
|
||||||
try{
|
try{
|
||||||
|
|
||||||
int toPageIn = (getMaxPageSize()+(int)destinationStatistics.getInflight().getCount()) - pagedInMessages.size();
|
int toPageIn = (getMaxPageSize()+(int)destinationStatistics.getInflight().getCount()) - pagedInMessages.size();
|
||||||
if (isLazyDispatch()&& !force) {
|
if (isLazyDispatch()&& !force) {
|
||||||
// Only page in the minimum number of messages which can be dispatched immediately.
|
// Only page in the minimum number of messages which can be dispatched immediately.
|
||||||
|
|
|
@ -43,7 +43,6 @@ public class JmsQueueBrowserTest extends JmsTestSupport {
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public void testReceiveBrowseReceive() throws Exception {
|
public void testReceiveBrowseReceive() throws Exception {
|
||||||
|
|
||||||
Session session = connection.createSession(false, 0);
|
Session session = connection.createSession(false, 0);
|
||||||
ActiveMQQueue destination = new ActiveMQQueue("TEST");
|
ActiveMQQueue destination = new ActiveMQQueue("TEST");
|
||||||
MessageProducer producer = session.createProducer(destination);
|
MessageProducer producer = session.createProducer(destination);
|
||||||
|
|
|
@ -18,7 +18,6 @@ package org.apache.activemq.broker.jmx;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
import javax.jms.Connection;
|
import javax.jms.Connection;
|
||||||
import javax.jms.Message;
|
import javax.jms.Message;
|
||||||
import javax.jms.MessageProducer;
|
import javax.jms.MessageProducer;
|
||||||
|
@ -29,11 +28,10 @@ import javax.management.MalformedObjectNameException;
|
||||||
import javax.management.ObjectName;
|
import javax.management.ObjectName;
|
||||||
import javax.management.openmbean.CompositeData;
|
import javax.management.openmbean.CompositeData;
|
||||||
import javax.management.openmbean.TabularData;
|
import javax.management.openmbean.TabularData;
|
||||||
|
|
||||||
import junit.textui.TestRunner;
|
import junit.textui.TestRunner;
|
||||||
import org.apache.activemq.EmbeddedBrokerTestSupport;
|
import org.apache.activemq.EmbeddedBrokerTestSupport;
|
||||||
import org.apache.activemq.advisory.TempDestDeleteTest;
|
|
||||||
import org.apache.activemq.broker.BrokerService;
|
import org.apache.activemq.broker.BrokerService;
|
||||||
|
import org.apache.activemq.broker.region.BaseDestination;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
@ -56,7 +54,7 @@ public class MBeanTest extends EmbeddedBrokerTestSupport {
|
||||||
protected Connection connection;
|
protected Connection connection;
|
||||||
protected boolean transacted;
|
protected boolean transacted;
|
||||||
protected int authMode = Session.AUTO_ACKNOWLEDGE;
|
protected int authMode = Session.AUTO_ACKNOWLEDGE;
|
||||||
protected int messageCount = 10;
|
protected static final int MESSAGE_COUNT = 2*BaseDestination.DEFAULT_PAGE_SIZE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When you run this test case from the command line it will pause before
|
* When you run this test case from the command line it will pause before
|
||||||
|
@ -93,8 +91,8 @@ public class MBeanTest extends EmbeddedBrokerTestSupport {
|
||||||
queueViewMBeanName = assertRegisteredObjectName(domain + ":Type=Queue,Destination=" + newDestination + ",BrokerName=localhost");
|
queueViewMBeanName = assertRegisteredObjectName(domain + ":Type=Queue,Destination=" + newDestination + ",BrokerName=localhost");
|
||||||
|
|
||||||
queue = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, queueViewMBeanName, QueueViewMBean.class, true);
|
queue = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, queueViewMBeanName, QueueViewMBean.class, true);
|
||||||
|
int movedSize = MESSAGE_COUNT-3;
|
||||||
assertTrue("Should have at least one message in the queue: " + queueViewMBeanName, queue.getQueueSize() > 0);
|
assertEquals("Unexpected number of messages ",movedSize,queue.getQueueSize());
|
||||||
|
|
||||||
// now lets remove them by selector
|
// now lets remove them by selector
|
||||||
queue.removeMatchingMessages("counter > 2");
|
queue.removeMatchingMessages("counter > 2");
|
||||||
|
@ -114,16 +112,14 @@ public class MBeanTest extends EmbeddedBrokerTestSupport {
|
||||||
long queueSize = queue.getQueueSize();
|
long queueSize = queue.getQueueSize();
|
||||||
queue.copyMatchingMessagesTo("counter > 2", newDestination);
|
queue.copyMatchingMessagesTo("counter > 2", newDestination);
|
||||||
|
|
||||||
assertEquals("Should have same number of messages in the queue: " + queueViewMBeanName, queueSize, queueSize);
|
|
||||||
|
|
||||||
queueViewMBeanName = assertRegisteredObjectName(domain + ":Type=Queue,Destination=" + newDestination + ",BrokerName=localhost");
|
queueViewMBeanName = assertRegisteredObjectName(domain + ":Type=Queue,Destination=" + newDestination + ",BrokerName=localhost");
|
||||||
|
|
||||||
queue = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, queueViewMBeanName, QueueViewMBean.class, true);
|
queue = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(mbeanServer, queueViewMBeanName, QueueViewMBean.class, true);
|
||||||
|
|
||||||
LOG.info("Queue: " + queueViewMBeanName + " now has: " + queue.getQueueSize() + " message(s)");
|
LOG.info("Queue: " + queueViewMBeanName + " now has: " + queue.getQueueSize() + " message(s)");
|
||||||
|
assertEquals("Expected messages in a queue: " + queueViewMBeanName, MESSAGE_COUNT-3, queue.getQueueSize());
|
||||||
assertTrue("Should have at least one message in the queue: " + queueViewMBeanName, queue.getQueueSize() > 0);
|
|
||||||
|
|
||||||
// now lets remove them by selector
|
// now lets remove them by selector
|
||||||
queue.removeMatchingMessages("counter > 2");
|
queue.removeMatchingMessages("counter > 2");
|
||||||
|
|
||||||
|
@ -165,20 +161,20 @@ public class MBeanTest extends EmbeddedBrokerTestSupport {
|
||||||
echo("Found tabular data: " + table);
|
echo("Found tabular data: " + table);
|
||||||
assertTrue("Table should not be empty!", table.size() > 0);
|
assertTrue("Table should not be empty!", table.size() > 0);
|
||||||
|
|
||||||
assertEquals("Queue size", 10, proxy.getQueueSize());
|
assertEquals("Queue size", MESSAGE_COUNT, proxy.getQueueSize());
|
||||||
|
|
||||||
String messageID = messageIDs[0];
|
String messageID = messageIDs[0];
|
||||||
String newDestinationName = "queue://dummy.test.cheese";
|
String newDestinationName = "queue://dummy.test.cheese";
|
||||||
echo("Attempting to copy: " + messageID + " to destination: " + newDestinationName);
|
echo("Attempting to copy: " + messageID + " to destination: " + newDestinationName);
|
||||||
proxy.copyMessageTo(messageID, newDestinationName);
|
proxy.copyMessageTo(messageID, newDestinationName);
|
||||||
|
|
||||||
assertEquals("Queue size", 10, proxy.getQueueSize());
|
assertEquals("Queue size", MESSAGE_COUNT, proxy.getQueueSize());
|
||||||
|
|
||||||
messageID = messageIDs[1];
|
messageID = messageIDs[1];
|
||||||
echo("Attempting to remove: " + messageID);
|
echo("Attempting to remove: " + messageID);
|
||||||
proxy.removeMessage(messageID);
|
proxy.removeMessage(messageID);
|
||||||
|
|
||||||
assertEquals("Queue size", 9, proxy.getQueueSize());
|
assertEquals("Queue size", MESSAGE_COUNT-1, proxy.getQueueSize());
|
||||||
|
|
||||||
echo("Worked!");
|
echo("Worked!");
|
||||||
}
|
}
|
||||||
|
@ -296,8 +292,9 @@ public class MBeanTest extends EmbeddedBrokerTestSupport {
|
||||||
|
|
||||||
protected BrokerService createBroker() throws Exception {
|
protected BrokerService createBroker() throws Exception {
|
||||||
BrokerService answer = new BrokerService();
|
BrokerService answer = new BrokerService();
|
||||||
|
answer.setDeleteAllMessagesOnStartup(true);
|
||||||
answer.setUseJmx(true);
|
answer.setUseJmx(true);
|
||||||
answer.setEnableStatistics(true);
|
//answer.setEnableStatistics(true);
|
||||||
answer.setPersistent(false);
|
answer.setPersistent(false);
|
||||||
answer.addConnector(bindAddress);
|
answer.addConnector(bindAddress);
|
||||||
return answer;
|
return answer;
|
||||||
|
@ -309,7 +306,7 @@ public class MBeanTest extends EmbeddedBrokerTestSupport {
|
||||||
Session session = connection.createSession(transacted, authMode);
|
Session session = connection.createSession(transacted, authMode);
|
||||||
destination = createDestination();
|
destination = createDestination();
|
||||||
MessageProducer producer = session.createProducer(destination);
|
MessageProducer producer = session.createProducer(destination);
|
||||||
for (int i = 0; i < messageCount; i++) {
|
for (int i = 0; i < MESSAGE_COUNT; i++) {
|
||||||
Message message = session.createTextMessage("Message: " + i);
|
Message message = session.createTextMessage("Message: " + i);
|
||||||
message.setIntProperty("counter", i);
|
message.setIntProperty("counter", i);
|
||||||
producer.send(message);
|
producer.send(message);
|
||||||
|
|
Loading…
Reference in New Issue