fixes for memory leaks

git-svn-id: https://svn.apache.org/repos/asf/incubator/activemq/trunk@392904 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Robert Davies 2006-04-10 08:12:09 +00:00
parent fdd4b4e3e8
commit b792f11767
5 changed files with 45 additions and 33 deletions

View File

@ -348,8 +348,9 @@
<!-- This test currently fails -->
<exclude>**/ItStillMarshallsTheSameTest.*</exclude>
<!-- This test currently fails -->
<!-- Kaha in flux - removing tests -->
<exclude>**/KahaXARecoveryBrokerTest.*</exclude>
<exclude>**/KahaRecoveryBrokerTest.*</exclude>
<!-- https://issues.apache.org/activemq/browse/AMQ-522 -->
<exclude>**/ProxyConnectorTest.*</exclude>

View File

@ -63,6 +63,8 @@ public class AdvisoryBroker extends BrokerFilter {
advisoryProducerId.setConnectionId(idGenerator.generateId());
}
public void addConnection(ConnectionContext context, ConnectionInfo info) throws Exception {
next.addConnection(context, info);
@ -149,11 +151,14 @@ public class AdvisoryBroker extends BrokerFilter {
next.removeDestination(context, destination, timeout);
ActiveMQTopic topic = AdvisorySupport.getDestinationAdvisoryTopic(destination);
DestinationInfo info = (DestinationInfo) destinations.remove(destination);
if( info !=null ) {
if( info !=null && info.getDestination() != null && topic != null) {
info.setOperationType(DestinationInfo.REMOVE_OPERATION_TYPE);
fireAdvisory(context, topic, info);
}
next.removeDestination(context,topic,timeout);
next.removeDestination(context, AdvisorySupport.getConsumerAdvisoryTopic(info.getDestination()), timeout);
next.removeDestination(context, AdvisorySupport.getProducerAdvisoryTopic(info.getDestination()), timeout);
}
}
public void addDestinationInfo(ConnectionContext context,DestinationInfo info) throws Exception{

View File

@ -90,26 +90,25 @@ abstract public class AbstractRegion implements Region {
}
}
public void removeDestination(ConnectionContext context, ActiveMQDestination destination, long timeout)
throws Exception {
public void removeDestination(ConnectionContext context,ActiveMQDestination destination,long timeout)
throws Exception{
// The destination cannot be removed if there are any active subscriptions
for (Iterator iter = subscriptions.values().iterator(); iter.hasNext();) {
Subscription sub = (Subscription) iter.next();
if( sub.matches(destination) ) {
throw new JMSException("Destination still has an active subscription: "+ destination);
for(Iterator iter=subscriptions.values().iterator();iter.hasNext();){
Subscription sub=(Subscription) iter.next();
if(sub.matches(destination)){
throw new JMSException("Destination still has an active subscription: "+destination);
}
}
log.debug("Removing destination: "+destination);
synchronized(destinationsMutex){
Destination dest=(Destination) destinations.remove(destination);
if(dest==null)
throw new IllegalArgumentException("The destination does not exist: "+destination);
if(dest!=null){
destinationMap.removeAll(destination);
dest.dispose(context);
dest.stop();
}else{
log.debug("Destination doesn't exist: " + dest);
}
}
}

View File

@ -58,7 +58,7 @@ public class Topic implements Destination {
protected final ActiveMQDestination destination;
protected final CopyOnWriteArrayList consumers = new CopyOnWriteArrayList();
protected final Valve dispatchValve = new Valve(true);
protected final TopicMessageStore store;
protected final TopicMessageStore store;//this could be NULL! (If an advsiory)
protected final UsageManager usageManager;
protected final DestinationStatistics destinationStatistics = new DestinationStatistics();
@ -72,7 +72,7 @@ public class Topic implements Destination {
TaskRunnerFactory taskFactory) {
this.destination = destination;
this.store = store;
this.store = store; //this could be NULL! (If an advsiory)
this.usageManager = new UsageManager(memoryManager);
this.usageManager.setLimit(Long.MAX_VALUE);
@ -287,7 +287,7 @@ public class Topic implements Destination {
}
public Message loadMessage(MessageId messageId) throws IOException {
return store.getMessage(messageId);
return store != null ? store.getMessage(messageId) : null;
}
public void start() throws Exception {
@ -301,6 +301,7 @@ public class Topic implements Destination {
public Message[] browse(){
final Set result=new CopyOnWriteArraySet();
try{
if(store!=null){
store.recover(new MessageRecoveryListener(){
public void recoverMessage(Message message) throws Exception{
result.add(message);
@ -316,6 +317,7 @@ public class Topic implements Destination {
result.add(msgs[i]);
}
}
}
}catch(Throwable e){
log.warn("Failed to browse Topic: "+getActiveMQDestination().getPhysicalName(),e);
}

View File

@ -22,6 +22,7 @@ import java.util.Set;
import javax.jms.InvalidDestinationException;
import javax.jms.JMSException;
import org.apache.activemq.advisory.AdvisorySupport;
import org.apache.activemq.broker.ConnectionContext;
import org.apache.activemq.broker.region.policy.PolicyEntry;
import org.apache.activemq.command.ActiveMQDestination;
@ -154,7 +155,11 @@ public class TopicRegion extends AbstractRegion {
// Implementation methods
// -------------------------------------------------------------------------
protected Destination createDestination(ConnectionContext context, ActiveMQDestination destination) throws Exception {
TopicMessageStore store = persistenceAdapter.createTopicMessageStore((ActiveMQTopic) destination);
TopicMessageStore store = null;
if (!AdvisorySupport.isAdvisoryTopic(destination)){
store = persistenceAdapter.createTopicMessageStore((ActiveMQTopic) destination);
}
Topic topic = new Topic(destination, store, memoryManager, destinationStatistics, taskRunnerFactory);
configureTopic(topic, destination);