You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ta...@apache.org on 2011/02/03 17:49:40 UTC
svn commit: r1066863 - in
/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp:
Connection.cs MessageConsumer.cs MessageProducer.cs Session.cs
Author: tabish
Date: Thu Feb 3 16:49:39 2011
New Revision: 1066863
URL: http://svn.apache.org/viewvc?rev=1066863&view=rev
Log:
Fix up the close / dispose methods to better handle shutdown when a parent resource is closed before its child.
Modified:
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageConsumer.cs
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageProducer.cs
activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Session.cs
Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs?rev=1066863&r1=1066862&r2=1066863&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Connection.cs Thu Feb 3 16:49:39 2011
@@ -518,13 +518,18 @@ namespace Apache.NMS.ActiveMQ
public void Close()
{
+ if(!this.closed.Value && !transportFailed.Value)
+ {
+ this.Stop();
+ }
+
lock(myLock)
{
if(this.closed.Value)
{
return;
}
-
+
try
{
Tracer.Info("Connection.Close(): Closing Connection Now.");
@@ -534,7 +539,7 @@ namespace Apache.NMS.ActiveMQ
{
foreach(Session session in sessions)
{
- session.DoClose();
+ session.Shutdown();
}
}
sessions.Clear();
@@ -548,7 +553,7 @@ namespace Apache.NMS.ActiveMQ
executor.Shutdown();
- Tracer.Info("Disposing of the Transport.");
+ Tracer.Info("Connection: Disposing of the Transport.");
transport.Dispose();
}
catch(Exception ex)
@@ -557,6 +562,11 @@ namespace Apache.NMS.ActiveMQ
}
finally
{
+ if(executor != null)
+ {
+ executor.Shutdown();
+ }
+
this.transport = null;
this.closed.Value = true;
this.connected.Value = false;
@@ -585,9 +595,6 @@ namespace Apache.NMS.ActiveMQ
try
{
- // For now we do not distinguish between Dispose() and Close().
- // In theory Dispose should possibly be lighter-weight and perform a (faster)
- // disorderly close.
Close();
}
catch
@@ -909,7 +916,7 @@ namespace Apache.NMS.ActiveMQ
{
try
{
- session.Dispose();
+ session.Shutdown();
}
catch(Exception ex)
{
Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageConsumer.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageConsumer.cs?rev=1066863&r1=1066862&r2=1066863&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageConsumer.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageConsumer.cs Thu Feb 3 16:49:39 2011
@@ -344,9 +344,32 @@ namespace Apache.NMS.ActiveMQ
internal void DoClose()
{
+ Shutdown();
+ RemoveInfo removeCommand = new RemoveInfo();
+ removeCommand.ObjectId = this.ConsumerId;
+ if (Tracer.IsDebugEnabled)
+ {
+ Tracer.DebugFormat("Remove of Consumer[{0}] sent last delivered Id[{1}].",
+ this.ConsumerId, this.lastDeliveredSequenceId);
+ }
+ removeCommand.LastDeliveredSequenceId = lastDeliveredSequenceId;
+ this.session.Connection.Oneway(removeCommand);
+ }
+
+ /// <summary>
+ /// Called from the parent Session of this Consumer to indicate that its
+ /// parent session is closing and this Consumer should close down but not
+ /// send any message to the Broker as the parent close will take care of
+ /// removing its child resources at the broker.
+ /// </summary>
+ internal void Shutdown()
+ {
if(!this.unconsumedMessages.Closed)
{
- Tracer.Debug("Closing down the Consumer");
+ if(Tracer.IsDebugEnabled)
+ {
+ Tracer.DebugFormat("Shutdown of Consumer[{0}] started.", ConsumerId);
+ }
// Do we have any acks we need to send out before closing?
// Ack any delivered messages now.
@@ -367,18 +390,14 @@ namespace Apache.NMS.ActiveMQ
}
}
+ this.session.RemoveConsumer(this.ConsumerId);
this.unconsumedMessages.Close();
- this.session.RemoveConsumer(this.info.ConsumerId);
- RemoveInfo removeCommand = new RemoveInfo();
- removeCommand.ObjectId = this.info.ConsumerId;
- removeCommand.LastDeliveredSequenceId = this.lastDeliveredSequenceId;
-
- this.session.Connection.Oneway(removeCommand);
- this.session = null;
-
- Tracer.Debug("Consumer instance Closed.");
- }
+ if(Tracer.IsDebugEnabled)
+ {
+ Tracer.DebugFormat("Shutdown of Consumer[{0}] completed.", ConsumerId);
+ }
+ }
}
#endregion
Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageProducer.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageProducer.cs?rev=1066863&r1=1066862&r2=1066863&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageProducer.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/MessageProducer.cs Thu Feb 3 16:49:39 2011
@@ -117,15 +117,23 @@ namespace Apache.NMS.ActiveMQ
return;
}
- DoClose();
+ Shutdown();
RemoveInfo removeInfo = new RemoveInfo();
removeInfo.ObjectId = this.info.ProducerId;
this.session.Connection.Oneway(removeInfo);
- this.session = null;
+ if(Tracer.IsDebugEnabled)
+ {
+ Tracer.DebugFormat("Remove of Producer[{0}] sent.", this.ProducerId);
+ }
}
}
- internal void DoClose()
+ /// <summary>
+ /// Called from the Parent session to deactivate this Producer, when a parent
+ /// is closed all children are automatically removed from the broker so this
+ /// method circumvents the need to send a Remove command to the broker.
+ /// </summary>
+ internal void Shutdown()
{
lock(closedLock)
{
Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Session.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Session.cs?rev=1066863&r1=1066862&r2=1066863&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Session.cs (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Session.cs Thu Feb 3 16:49:39 2011
@@ -331,6 +331,15 @@ namespace Apache.NMS.ActiveMQ
internal void DoClose()
{
+ Shutdown();
+ RemoveInfo info = new RemoveInfo();
+ info.ObjectId = this.info.SessionId;
+ info.LastDeliveredSequenceId = this.lastDeliveredSequenceId;
+ this.connection.Oneway(info);
+ }
+
+ internal void Shutdown()
+ {
lock(myLock)
{
if(this.closed)
@@ -350,7 +359,7 @@ namespace Apache.NMS.ActiveMQ
foreach(MessageConsumer consumer in consumers.Values)
{
consumer.FailureError = this.connection.FirstFailureError;
- consumer.DoClose();
+ consumer.Shutdown();
this.lastDeliveredSequenceId =
Math.Min(this.lastDeliveredSequenceId, consumer.LastDeliveredSequenceId);
}
@@ -361,7 +370,7 @@ namespace Apache.NMS.ActiveMQ
{
foreach(MessageProducer producer in producers.Values)
{
- producer.DoClose();
+ producer.Shutdown();
}
}
producers.Clear();
@@ -386,12 +395,6 @@ namespace Apache.NMS.ActiveMQ
}
finally
{
- // Make sure we attempt to inform the broker this Session is done.
- RemoveInfo info = new RemoveInfo();
- info.ObjectId = this.info.SessionId;
- info.LastDeliveredSequenceId = this.lastDeliveredSequenceId;
- this.connection.Oneway(info);
- this.connection = null;
this.closed = true;
this.closing = false;
}