summaryrefslogtreecommitdiff
path: root/java/client/src
diff options
context:
space:
mode:
authorRafael H. Schloming <rhs@apache.org>2009-07-25 02:38:15 +0000
committerRafael H. Schloming <rhs@apache.org>2009-07-25 02:38:15 +0000
commitc1a0ca697fccbb4bca552a5840154766ee81a0c3 (patch)
treebc33560dcef160a6213cc9567828f384eb595b71 /java/client/src
parentdd188d3fa7fb527b9a1b914f78dc71a147219298 (diff)
downloadqpid-python-c1a0ca697fccbb4bca552a5840154766ee81a0c3.tar.gz
fixed session memory leak exposed by SessionCreateTest
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@797705 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'java/client/src')
-rw-r--r--java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java46
1 files changed, 32 insertions, 14 deletions
diff --git a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java b/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
index 7ce51c8918..0644bd88a8 100644
--- a/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
+++ b/java/client/src/main/java/org/apache/qpid/client/AMQSession_0_10.java
@@ -52,6 +52,8 @@ import static org.apache.qpid.transport.Option.*;
import javax.jms.*;
import javax.jms.IllegalStateException;
+import java.lang.ref.WeakReference;
+
import java.util.Date;
import java.util.HashMap;
import java.util.UUID;
@@ -72,6 +74,34 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
private static final Logger _logger = LoggerFactory.getLogger(AMQSession_0_10.class);
private static Timer timer = new Timer("ack-flusher", true);
+ private static class Flusher extends TimerTask
+ {
+
+ private WeakReference<AMQSession_0_10> session;
+ public Flusher(AMQSession_0_10 session)
+ {
+ this.session = new WeakReference<AMQSession_0_10>(session);
+ }
+
+ public void run() {
+ AMQSession_0_10 ssn = session.get();
+ if (ssn == null)
+ {
+ cancel();
+ }
+ else
+ {
+ try
+ {
+ ssn.flushAcknowledgments(true);
+ }
+ catch (Throwable t)
+ {
+ _logger.error("error flushing acks", t);
+ }
+ }
+ }
+ }
/**
@@ -129,20 +159,7 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
if (maxAckDelay > 0)
{
- flushTask = new TimerTask()
- {
- public void run()
- {
- try
- {
- flushAcknowledgments(true);
- }
- catch (Throwable t)
- {
- _logger.error("error flushing acks", t);
- }
- }
- };
+ flushTask = new Flusher(this);
timer.schedule(flushTask, new Date(), maxAckDelay);
}
}
@@ -319,6 +336,7 @@ public class AMQSession_0_10 extends AMQSession<BasicMessageConsumer_0_10, Basic
if (flushTask != null)
{
flushTask.cancel();
+ flushTask = null;
}
flushAcknowledgments();
getQpidSession().sync();