Add support for transport timeout while waiting for mutex lock. Fixes [AMQNET-330]. (See https://issues.apache.org/activemq/browse/AMQNET-330)
Project: http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/commit/67916c24 Tree: http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/tree/67916c24 Diff: http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/diff/67916c24 Branch: refs/heads/1.5.x Commit: 67916c249ec3dff2ed1da77849e70d8d9a9fe55e Parents: 1f46042 Author: Jim Gomes <jgo...@apache.org> Authored: Tue Jun 14 22:36:38 2011 +0000 Committer: Jim Gomes <jgo...@apache.org> Committed: Tue Jun 14 22:36:38 2011 +0000 ---------------------------------------------------------------------- .../Transport/Failover/FailoverTransport.cs | 13 ++++- src/main/csharp/Transport/ITransport.cs | 20 ++++++++ src/main/csharp/Transport/MutexTransport.cs | 54 +++++++++++++++++--- src/main/csharp/Transport/Tcp/TcpTransport.cs | 24 ++++++++- src/main/csharp/Transport/TransportFilter.cs | 20 ++++++++ vs2008-stomp-test.csproj | 14 +++-- 6 files changed, 132 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/blob/67916c24/src/main/csharp/Transport/Failover/FailoverTransport.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Transport/Failover/FailoverTransport.cs b/src/main/csharp/Transport/Failover/FailoverTransport.cs index 4d4d0ff..12c23af 100644 --- a/src/main/csharp/Transport/Failover/FailoverTransport.cs +++ b/src/main/csharp/Transport/Failover/FailoverTransport.cs @@ -55,6 +55,7 @@ namespace Apache.NMS.Stomp.Transport.Failover private bool started; private int timeout = -1; + private int asyncTimeout = 45000; private int initialReconnectDelay = 10; private int maxReconnectDelay = 1000 * 30; private int backOffMultiplier = 2; @@ -217,7 +218,17 @@ namespace Apache.NMS.Stomp.Transport.Failover #endregion - public bool IsFaultTolerant + /// <summary> + /// If doing an asynchronous connect, the milliseconds before timing out if no connection can be made + /// </summary> + /// <value>The async timeout.</value> + public int AsyncTimeout + { + get { return asyncTimeout; } + set { asyncTimeout = value; } + } + + public bool IsFaultTolerant { get { return true; } } http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/blob/67916c24/src/main/csharp/Transport/ITransport.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Transport/ITransport.cs b/src/main/csharp/Transport/ITransport.cs index 2d7f7a7..1e60307 100755 --- a/src/main/csharp/Transport/ITransport.cs +++ b/src/main/csharp/Transport/ITransport.cs @@ -70,6 +70,26 @@ namespace Apache.NMS.Stomp.Transport /// </summary> Object Narrow(Type type); + /// <summary> + /// Timeout in milliseconds to wait for sending synchronous messages or commands. + /// Set to -1 for infinite timeout. + /// </summary> + int Timeout + { + get; + set; + } + + /// <summary> + /// Timeout in milliseconds to wait for sending asynchronous messages or commands. + /// Set to -1 for infinite timeout. + /// </summary> + int AsyncTimeout + { + get; + set; + } + CommandHandler Command { get; http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/blob/67916c24/src/main/csharp/Transport/MutexTransport.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Transport/MutexTransport.cs b/src/main/csharp/Transport/MutexTransport.cs index 7fe6134..c5cbc31 100644 --- a/src/main/csharp/Transport/MutexTransport.cs +++ b/src/main/csharp/Transport/MutexTransport.cs @@ -14,44 +14,86 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -using Apache.NMS.Stomp.Commands; using System; +using System.Threading; +using Apache.NMS.Stomp.Commands; namespace Apache.NMS.Stomp.Transport { - /// <summary> /// A Transport which guards access to the next transport using a mutex. /// </summary> public class MutexTransport : TransportFilter { private readonly object transmissionLock = new object(); + private void GetTransmissionLock(int timeout) + { + if(timeout > 0) + { + DateTime timeoutTime = DateTime.Now + TimeSpan.FromMilliseconds(timeout); + + while(true) + { + if(Monitor.TryEnter(transmissionLock)) + { + break; + } + + if(DateTime.Now > timeoutTime) + { + throw new IOException(string.Format("Oneway timed out after {0} milliseconds.", timeout)); + } + + Thread.Sleep(10); + } + } + else + { + Monitor.Enter(transmissionLock); + } + } + public MutexTransport(ITransport next) : base(next) { } public override void Oneway(Command command) { - lock(transmissionLock) + GetTransmissionLock(this.next.Timeout); + try + { + base.Oneway(command); + } + finally { - this.next.Oneway(command); + Monitor.Exit(transmissionLock); } } public override FutureResponse AsyncRequest(Command command) { - lock(transmissionLock) + GetTransmissionLock(this.next.AsyncTimeout); + try { return base.AsyncRequest(command); } + finally + { + Monitor.Exit(transmissionLock); + } } public override Response Request(Command command, TimeSpan timeout) { - lock(transmissionLock) + GetTransmissionLock((int) timeout.TotalMilliseconds); + try { return base.Request(command, timeout); } + finally + { + Monitor.Exit(transmissionLock); + } } } } http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/blob/67916c24/src/main/csharp/Transport/Tcp/TcpTransport.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Transport/Tcp/TcpTransport.cs b/src/main/csharp/Transport/Tcp/TcpTransport.cs index cc955dc..0c9b6bc 100644 --- a/src/main/csharp/Transport/Tcp/TcpTransport.cs +++ b/src/main/csharp/Transport/Tcp/TcpTransport.cs @@ -40,6 +40,8 @@ namespace Apache.NMS.Stomp.Transport.Tcp private readonly Atomic<bool> closed = new Atomic<bool>(false); private volatile bool seenShutdown; private readonly Uri connectedUri; + private int timeout = -1; + private int asynctimeout = -1; private CommandHandler commandHandler; private ExceptionHandler exceptionHandler; @@ -314,7 +316,27 @@ namespace Apache.NMS.Stomp.Transport.Tcp // Implementation methods - public CommandHandler Command + /// <summary> + /// Timeout in milliseconds to wait for sending synchronous messages or commands. + /// Set to -1 for infinite timeout. + /// </summary> + public int Timeout + { + get { return this.timeout; } + set { this.timeout = value; } + } + + /// <summary> + /// Timeout in milliseconds to wait for sending asynchronous messages or commands. + /// Set to -1 for infinite timeout. + /// </summary> + public int AsyncTimeout + { + get { return this.asynctimeout; } + set { this.asynctimeout = value; } + } + + public CommandHandler Command { get { return commandHandler; } set { this.commandHandler = value; } http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/blob/67916c24/src/main/csharp/Transport/TransportFilter.cs ---------------------------------------------------------------------- diff --git a/src/main/csharp/Transport/TransportFilter.cs b/src/main/csharp/Transport/TransportFilter.cs index 9c4bdbd..0c5c01c 100644 --- a/src/main/csharp/Transport/TransportFilter.cs +++ b/src/main/csharp/Transport/TransportFilter.cs @@ -206,6 +206,26 @@ namespace Apache.NMS.Stomp.Transport return null; } + /// <summary> + /// Timeout in milliseconds to wait for sending synchronous messages or commands. + /// Set to -1 for infinite timeout. + /// </summary> + public int Timeout + { + get { return next.Timeout; } + set { next.Timeout = value; } + } + + /// <summary> + /// Timeout in milliseconds to wait for sending asynchronous messages or commands. + /// Set to -1 for infinite timeout. + /// </summary> + public int AsyncTimeout + { + get { return next.AsyncTimeout; } + set { next.AsyncTimeout = value; } + } + public bool IsFaultTolerant { get{ return next.IsFaultTolerant; } http://git-wip-us.apache.org/repos/asf/activemq-nms-stomp/blob/67916c24/vs2008-stomp-test.csproj ---------------------------------------------------------------------- diff --git a/vs2008-stomp-test.csproj b/vs2008-stomp-test.csproj index ffb03ae..ec42a91 100644 --- a/vs2008-stomp-test.csproj +++ b/vs2008-stomp-test.csproj @@ -3,7 +3,7 @@ <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> - <ProductVersion>9.0.21022</ProductVersion> + <ProductVersion>9.0.30729</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{E8C995C3-FF81-491B-A3B7-9D7C753BDDC3}</ProjectGuid> <OutputType>Library</OutputType> @@ -55,16 +55,20 @@ <NoWarn>3016</NoWarn> </PropertyGroup> <ItemGroup> + <Reference Include="Apache.NMS, Version=1.5.1.2341, Culture=neutral, PublicKeyToken=82756feee3957618, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>lib\Apache.NMS\net-2.0\Apache.NMS.dll</HintPath> + </Reference> + <Reference Include="Apache.NMS.Test, Version=1.5.1.2341, Culture=neutral, PublicKeyToken=82756feee3957618, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>lib\Apache.NMS\net-2.0\Apache.NMS.Test.dll</HintPath> + </Reference> <Reference Include="System" /> <Reference Include="System.Xml" /> <Reference Include="nunit.framework, Version=2.5.5.10112, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77"> <SpecificVersion>False</SpecificVersion> <HintPath>lib\NUnit\mono-2.0\nunit.framework.dll</HintPath> </Reference> - <Reference Include="Apache.NMS.Test, Version=1.4.0.2071, Culture=neutral, PublicKeyToken=82756feee3957618"> - <SpecificVersion>False</SpecificVersion> - <HintPath>lib\Apache.NMS\mono-2.0\Apache.NMS.Test.dll</HintPath> - </Reference> </ItemGroup> <ItemGroup> <BootstrapperPackage Include="Microsoft.Net.Framework.2.0">