activemq-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From tab...@apache.org
Subject svn commit: r893624 - in /activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x: ./ src/main/csharp/Threads/ src/main/csharp/Transport/ src/main/csharp/Transport/Mock/ src/test/csharp/Threads/ src/test/csharp/Transport/Inactivity/
Date Wed, 23 Dec 2009 20:51:36 GMT
Author: tabish
Date: Wed Dec 23 20:51:36 2009
New Revision: 893624

URL: http://svn.apache.org/viewvc?rev=893624&view=rev
Log:
https://issues.apache.org/activemq/browse/AMQNET-212

Merging work on the InactivityMonitor into the 1.2.x branch.

Added:
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Threads/CompositeTask.cs
      - copied unchanged from r893622, activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/CompositeTask.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Threads/CompositeTaskRunner.cs
      - copied unchanged from r893622, activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/main/csharp/Threads/CompositeTaskRunner.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/test/csharp/Threads/CompositeTaskRunnerTest.cs
      - copied unchanged from r893622, activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/src/test/csharp/Threads/CompositeTaskRunnerTest.cs
Modified:
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/   (props changed)
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/nant-common.xml   (props changed)
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Threads/Task.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/InactivityMonitor.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/Mock/MockTransport.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/test/csharp/Transport/Inactivity/InactivityMonitorTest.cs
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq-test.csproj
  (contents, props changed)
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq.csproj   (contents,
props changed)
    activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq.sln   (props
changed)

Propchange: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Dec 23 20:51:36 2009
@@ -1,3 +1,3 @@
 /activemq/activemq-dotnet/Apache.NMS.ActiveMQ/tags/1.0.0:692591,693525
 /activemq/activemq-dotnet/Apache.NMS.ActiveMQ/tags/1.1.0:788230,788233,790183
-/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk:891917,892010-892308,892840-893228
+/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk:891917,892010-892308,892840-893228,893560-893622

Propchange: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/nant-common.xml
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Dec 23 20:51:36 2009
@@ -1,2 +1,2 @@
 /activemq/activemq-dotnet/Apache.NMS.ActiveMQ/tags/1.1.0/nant-common.xml:788230,788233,790183
-/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nant-common.xml:891917,892010-892308,892840-893228
+/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/nant-common.xml:891917,892010-892308,892840-893228,893560-893622

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Threads/Task.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Threads/Task.cs?rev=893624&r1=893623&r2=893624&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Threads/Task.cs
(original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Threads/Task.cs
Wed Dec 23 20:51:36 2009
@@ -22,6 +22,15 @@
 	/// </summary>
 	public interface Task
 	{
+		/// <summary>
+		/// Performs some portion of the work that this Task object is
+		/// assigned to complete.  When the task is entirely finished this
+		/// method should return false. 
+		/// </summary>
+		/// <returns>
+		/// A <see cref="System.Boolean"/> this indicates if this Task should 
+		/// be run again.
+		/// </returns>
 		bool Iterate();
 	}
 }

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/InactivityMonitor.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/InactivityMonitor.cs?rev=893624&r1=893623&r2=893624&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/InactivityMonitor.cs
(original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/InactivityMonitor.cs
Wed Dec 23 20:51:36 2009
@@ -17,6 +17,7 @@
 
 using System;
 using System.Threading;
+using Apache.NMS.ActiveMQ.Threads;
 using Apache.NMS.ActiveMQ.Commands;
 using Apache.NMS.Util;
 
@@ -38,13 +39,19 @@
         private Atomic<bool> inRead = new Atomic<bool>(false);
         private Atomic<bool> inWrite = new Atomic<bool>(false);
 
+		private CompositeTaskRunner asyncTasks;
+        private AsyncSignalReadErrorkTask asyncErrorTask;
+        private AsyncWriteTask asyncWriteTask;
+		
         private Mutex monitor = new Mutex();
 
         private Timer readCheckTimer;
         private Timer writeCheckTimer;
 
-        private WriteChecker writeChecker;
-        private ReadChecker readChecker;
+        private DateTime lastReadCheckTime;
+
+        //private WriteChecker writeChecker;
+        //private ReadChecker readChecker;
 
         private long readCheckTime;
         public long ReadCheckTime
@@ -88,13 +95,30 @@
             Tracer.Debug("Creating Inactivity Monitor");
         }
 
+        ~InactivityMonitor()
+        {
+            Dispose(false);
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            if(disposing)
+            {
+                // get rid of unmanaged stuff
+            }
+
+            StopMonitorThreads();
+
+            base.Dispose(disposing);
+        }
+
         #region WriteCheck Related
         /// <summary>
         /// Check the write to the broker
         /// </summary>
-        public void WriteCheck()
+        public void WriteCheck(object state)
         {
-            if(inWrite.Value)
+            if(this.inWrite.Value || this.failed.Value)
             {
                 return;
             }
@@ -102,7 +126,8 @@
             if(!commandSent.Value)
             {
                 Tracer.Debug("No Message sent since last write check. Sending a KeepAliveInfo");
-                ThreadPool.QueueUserWorkItem(new WaitCallback(SendKeepAlive));
+                this.asyncWriteTask.IsPending = true;
+                this.asyncTasks.Wakeup();
             }
             else
             {
@@ -111,38 +136,32 @@
 
             commandSent.Value = false;
         }
+        #endregion
 
-        private void SendKeepAlive(object state)
+        #region ReadCheck Related
+        public void ReadCheck(object state)
         {
-            if(monitorStarted.Value)
+            DateTime now = DateTime.Now;
+            TimeSpan elapsed = now - this.lastReadCheckTime;
+
+            if(!AllowReadCheck(elapsed))
             {
-                try
-                {
-                    KeepAliveInfo info = new KeepAliveInfo();
-                    info.ResponseRequired = keepAliveResponseRequired.Value;
-                    Oneway(info);
-                }
-                catch(IOException exception)
-                {
-                    OnException(this, exception);
-                }
+                return;
             }
-        }
-        #endregion
 
-        #region ReadCheck Related
-        public void ReadCheck()
-        {
-            if(inRead.Value)
+            this.lastReadCheckTime = now;
+
+            if(this.inRead.Value || this.failed.Value)
             {
-                Tracer.Debug("A receive is in progress");
+                Tracer.Debug("A receive is in progress or already failed.");
                 return;
             }
 
             if(!commandReceived.Value)
             {
                 Tracer.Debug("No message received since last read check! Sending an InactivityException!");
-                ThreadPool.QueueUserWorkItem(new WaitCallback(SendInactivityException));
+                this.asyncErrorTask.IsPending = true;
+                this.asyncTasks.Wakeup();
             }
             else
             {
@@ -150,20 +169,15 @@
             }
         }
 
-        private void SendInactivityException(object state)
-        {
-            OnException(this, new IOException("Channel was inactive for too long."));
-        }
-
         /// <summary>
         /// Checks if we should allow the read check(if less than 90% of the read
         /// check time elapsed then we dont do the readcheck
         /// </summary>
         /// <param name="elapsed"></param>
         /// <returns></returns>
-        public bool AllowReadCheck(long elapsed)
+        public bool AllowReadCheck(TimeSpan elapsed)
         {
-            return (elapsed > (readCheckTime * 9 / 10));
+            return (elapsed.TotalMilliseconds > (readCheckTime * 9 / 10));
         }
         #endregion
 
@@ -269,10 +283,12 @@
                 {
                     return;
                 }
+
                 if(localWireFormatInfo == null)
                 {
                     return;
                 }
+
                 if(remoteWireFormatInfo == null)
                 {
                     return;
@@ -287,22 +303,28 @@
                         localWireFormatInfo.MaxInactivityDurationInitialDelay,
                         remoteWireFormatInfo.MaxInactivityDurationInitialDelay);
 
+                this.asyncTasks = new CompositeTaskRunner();
+
+                this.asyncErrorTask = new AsyncSignalReadErrorkTask(this, next.RemoteAddress);
+                this.asyncWriteTask = new AsyncWriteTask(this);
+
+                this.asyncTasks.AddTask(this.asyncErrorTask);
+                this.asyncTasks.AddTask(this.asyncWriteTask);
+
                 if(readCheckTime > 0)
                 {
                     monitorStarted.Value = true;
-                    writeChecker = new WriteChecker(this);
-                    readChecker = new ReadChecker(this);
 
                     writeCheckTime = readCheckTime > 3 ? readCheckTime / 3 : readCheckTime;
 
                     writeCheckTimer = new Timer(
-                        new TimerCallback(writeChecker.Check),
+                        new TimerCallback(WriteCheck),
                         null,
                         initialDelayTime,
                         writeCheckTime
                         );
                     readCheckTimer = new Timer(
-                        new TimerCallback(readChecker.Check),
+                        new TimerCallback(ReadCheck),
                         null,
                         initialDelayTime,
                         readCheckTime
@@ -317,59 +339,92 @@
             {
                 if(monitorStarted.CompareAndSet(true, false))
                 {
-                    readCheckTimer.Dispose();
-                    writeCheckTimer.Dispose();
+                    AutoResetEvent shutdownEvent = new AutoResetEvent(false);
+
+                    // Attempt to wait for the Timers to shutdown, but don't wait
+                    // forever, if they don't shutdown after two seconds, just quit.
+                    this.readCheckTimer.Dispose(shutdownEvent);
+                    shutdownEvent.WaitOne(TimeSpan.FromMilliseconds(2000));
+                    this.writeCheckTimer.Dispose(shutdownEvent);
+                    shutdownEvent.WaitOne(TimeSpan.FromMilliseconds(2000));
+
+					this.asyncTasks.Shutdown();
+                    this.asyncTasks = null;
+                    this.asyncWriteTask = null;
+                    this.asyncErrorTask = null;
                 }
             }
         }
-    }
-
-    class WriteChecker
-    {
-        private readonly InactivityMonitor parent;
 
-        public WriteChecker(InactivityMonitor parent)
+        #region Async Tasks
+        // Task that fires when the TaskRunner is signaled by the ReadCheck Timer Task.
+        class AsyncSignalReadErrorkTask : CompositeTask
         {
-            if(parent == null)
+            private InactivityMonitor parent;
+            private Uri remote;
+            private Atomic<bool> pending = new Atomic<bool>(false);
+    
+            public AsyncSignalReadErrorkTask(InactivityMonitor parent, Uri remote)
             {
-                throw new NullReferenceException("WriteChecker created with a NULL parent.");
+                this.parent = parent;
+                this.remote = remote;
             }
 
-            this.parent = parent;
-        }
-
-        public void Check(object state)
-        {
-            this.parent.WriteCheck();
-        }
-    }
-
-    class ReadChecker
-    {
-        private readonly InactivityMonitor parent;
-        private long lastRunTime;
-
-        public ReadChecker(InactivityMonitor parent)
-        {
-            if(parent == null)
+            public bool IsPending
             {
-                throw new NullReferenceException("ReadChecker created with a null parent");
+                get { return this.pending.Value; }
+                set { this.pending.Value = value; }
+            }
+    
+            public bool Iterate()
+            {
+                if(this.pending.CompareAndSet(true, false) && this.parent.monitorStarted.Value)
+                {
+                    IOException ex = new IOException("Channel was inactive for too long:
" + remote);
+                    this.parent.OnException(parent, ex);
+                }
+    
+                return this.pending.Value;
             }
-            this.parent = parent;
         }
-
-        public void Check(object state)
+    
+        // Task that fires when the TaskRunner is signaled by the WriteCheck Timer Task.
+        class AsyncWriteTask : CompositeTask
         {
-            long now = DateUtils.ToJavaTimeUtc(DateTime.UtcNow);
-            long elapsed = now - lastRunTime;
-            if(!parent.AllowReadCheck(elapsed))
+            private InactivityMonitor parent;
+            private Atomic<bool> pending = new Atomic<bool>(false);
+    
+            public AsyncWriteTask(InactivityMonitor parent)
             {
-                return;
+                this.parent = parent;
+            }
+    
+            public bool IsPending
+            {
+                get { return this.pending.Value; }
+                set { this.pending.Value = value; }
+            }
+    
+            public bool Iterate()
+            {
+                if(this.pending.CompareAndSet(true, false) && this.parent.monitorStarted.Value)
+                {
+                    try
+                    {
+                        KeepAliveInfo info = new KeepAliveInfo();
+                        info.ResponseRequired = this.parent.keepAliveResponseRequired.Value;
+                        this.parent.Oneway(info);
+                    }
+                    catch(IOException e)
+                    {
+                        this.parent.OnException(parent, e);
+                    }
+                }
+    
+                return this.pending.Value;
             }
-            lastRunTime = now;
-
-            // Invoke the parent check routine.
-            this.parent.ReadCheck();
         }
+        #endregion
     }
+
 }

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/Mock/MockTransport.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/Mock/MockTransport.cs?rev=893624&r1=893623&r2=893624&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/Mock/MockTransport.cs
(original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/main/csharp/Transport/Mock/MockTransport.cs
Wed Dec 23 20:51:36 2009
@@ -379,7 +379,7 @@
 
         public Uri RemoteAddress
         {
-            get{ return null; }
+            get{ return new Uri("mock://mock"); }
         }
         
         #endregion

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/test/csharp/Transport/Inactivity/InactivityMonitorTest.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/test/csharp/Transport/Inactivity/InactivityMonitorTest.cs?rev=893624&r1=893623&r2=893624&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/test/csharp/Transport/Inactivity/InactivityMonitorTest.cs
(original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/src/test/csharp/Transport/Inactivity/InactivityMonitorTest.cs
Wed Dec 23 20:51:36 2009
@@ -21,6 +21,7 @@
 using System.Collections;
 using System.Collections.Generic;
 using Apache.NMS;
+using Apache.NMS.Util;
 using Apache.NMS.ActiveMQ.Transport;
 using Apache.NMS.ActiveMQ.Transport.Mock;
 using Apache.NMS.ActiveMQ.Commands;
@@ -30,7 +31,7 @@
 
 namespace Apache.NMS.ActiveMQ.Test
 {
-    //[TestFixture]
+    [TestFixture]
     public class InactivityMonitorTest
     {
         private List<Command> received;
@@ -50,7 +51,7 @@
             received.Add( command );
         }
 
-        //[SetUp]
+        [SetUp]
         public void SetUp()
         {
             this.received = new List<Command>();
@@ -68,7 +69,7 @@
             this.localWireFormatInfo.TightEncodingEnabled = false;
         }
 
-        //[Test]
+        [Test]
         public void TestCreate()
         {
             InactivityMonitor monitor = new InactivityMonitor( this.transport );
@@ -80,12 +81,13 @@
             Assert.IsTrue( monitor.IsDisposed == false );
         }
 
-        //[Test]
+        [Test]
         public void TestReadTimeout()
         {
             InactivityMonitor monitor = new InactivityMonitor( this.transport );
 
             monitor.Exception += new ExceptionHandler(OnException);
+            monitor.Command += new CommandHandler(OnCommand);
 
             // Send the local one for the monitor to record.
             monitor.Oneway( this.localWireFormatInfo );
@@ -101,7 +103,7 @@
             Assert.IsTrue( this.exceptions.Count > 0 );
         }
 
-        //[Test]
+        [Test]
         public void TestWriteMessageFail()
         {
             this.transport.FailOnKeepAliveInfoSends = true ;
@@ -110,6 +112,8 @@
             InactivityMonitor monitor = new InactivityMonitor( this.transport );
 
             monitor.Exception += new ExceptionHandler(OnException);
+            monitor.Command += new CommandHandler(OnCommand);
+            monitor.Start();
 
             // Send the local one for the monitor to record.
             monitor.Oneway( this.localWireFormatInfo );
@@ -119,21 +123,29 @@
             ActiveMQMessage message = new ActiveMQMessage();
             this.transport.InjectCommand( message );
 
+            Thread.Sleep( 2000 );
+
             // Should not have timed out on Read yet.
             Assert.IsTrue( this.exceptions.Count == 0 );
 
-            Thread.Sleep( 8000 );
+            for(int ix = 0; ix < 4; ix++)
+            {
+                this.transport.InjectCommand( message );
+                Thread.Sleep( 2000 );
+            }
 
             // Channel should have been inactive for to long.
             Assert.IsTrue( this.exceptions.Count > 0 );
         }
 
-        //[Test]
+        [Test]
         public void TestNonFailureSendCase()
         {
             InactivityMonitor monitor = new InactivityMonitor( this.transport );
 
             monitor.Exception += new ExceptionHandler(OnException);
+            monitor.Command += new CommandHandler(OnCommand);
+            monitor.Start();
 
             // Send the local one for the monitor to record.
             monitor.Oneway( this.localWireFormatInfo );

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq-test.csproj
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq-test.csproj?rev=893624&r1=893623&r2=893624&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq-test.csproj
(original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq-test.csproj
Wed Dec 23 20:51:36 2009
@@ -88,6 +88,7 @@
     <Compile Include="src\test\csharp\OpenWire\PrefetchSizeZeroTest.cs" />
     <Compile Include="src\test\csharp\RollbackRedeliveryTest.cs" />
     <Compile Include="src\test\csharp\StompHelperTest.cs" />
+    <Compile Include="src\test\csharp\Threads\CompositeTaskRunnerTest.cs" />
     <Compile Include="src\test\csharp\Threads\DedicatedTaskRunnerTest.cs" />
     <Compile Include="src\test\csharp\Transport\failover\FailoverTransportTest.cs" />
     <Compile Include="src\test\csharp\Transport\Inactivity\InactivityMonitorTest.cs" />

Propchange: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq-test.csproj
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Dec 23 20:51:36 2009
@@ -1,2 +1,2 @@
 /activemq/activemq-dotnet/Apache.NMS.ActiveMQ/tags/1.1.0/vs2008-activemq-test.csproj:788230,788233,790183
-/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq-test.csproj:891917,892010-892308,892840-893228
+/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq-test.csproj:891917,892010-892308,892840-893228,893560-893622

Modified: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq.csproj
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq.csproj?rev=893624&r1=893623&r2=893624&view=diff
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq.csproj (original)
+++ activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq.csproj Wed
Dec 23 20:51:36 2009
@@ -881,6 +881,8 @@
     <Compile Include="src\main\csharp\State\ThreadSimulator.cs" />
     <Compile Include="src\main\csharp\State\Tracked.cs" />
     <Compile Include="src\main\csharp\State\TransactionState.cs" />
+    <Compile Include="src\main\csharp\Threads\CompositeTask.cs" />
+    <Compile Include="src\main\csharp\Threads\CompositeTaskRunner.cs" />
     <Compile Include="src\main\csharp\Threads\DedicatedTaskRunner.cs" />
     <Compile Include="src\main\csharp\Threads\DefaultThreadPools.cs" />
     <Compile Include="src\main\csharp\Threads\PooledTaskRunner.cs" />

Propchange: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq.csproj
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Dec 23 20:51:36 2009
@@ -1,2 +1,2 @@
 /activemq/activemq-dotnet/Apache.NMS.ActiveMQ/tags/1.1.0/vs2008-activemq.csproj:788230,788233,790183
-/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj:891917,892010-892308,892840-893228
+/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.csproj:891917,892010-892308,892840-893228,893560-893622

Propchange: activemq/activemq-dotnet/Apache.NMS.ActiveMQ/branches/1.2.x/vs2008-activemq.sln
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Wed Dec 23 20:51:36 2009
@@ -1,2 +1,2 @@
 /activemq/activemq-dotnet/Apache.NMS.ActiveMQ/tags/1.1.0/vs2008-activemq.sln:788230,788233,790183
-/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.sln:891917,892010-892308,892840-893228
+/activemq/activemq-dotnet/Apache.NMS.ActiveMQ/trunk/vs2008-activemq.sln:891917,892010-892308,892840-893228,893560-893622



Mime
View raw message