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 2010/07/07 00:27:15 UTC
svn commit: r961036 -
/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/
Author: tabish
Date: Tue Jul 6 22:27:14 2010
New Revision: 961036
URL: http://svn.apache.org/viewvc?rev=961036&view=rev
Log:
https://issues.apache.org/activemq/browse/AMQNET-254
Adds a basic FailoverTransport and Inactivity monitor. Also provides a simple ConnectionStateTracker that can track the Connection and restore all its Consumer subscriptions once a successful failover is completed.
Added:
activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/
activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/CommandVisitorAdapter.cs (with props)
activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionState.cs (with props)
activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionStateTracker.cs (with props)
activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConsumerState.cs (with props)
activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ICommandVisitor.cs (with props)
activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/SynchronizedObjects.cs (with props)
activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ThreadSimulator.cs (with props)
activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/Tracked.cs (with props)
Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/CommandVisitorAdapter.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/CommandVisitorAdapter.cs?rev=961036&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/CommandVisitorAdapter.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/CommandVisitorAdapter.cs Tue Jul 6 22:27:14 2010
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using Apache.NMS.Stomp.Commands;
+
+namespace Apache.NMS.Stomp.State
+{
+ public class CommandVisitorAdapter : ICommandVisitor
+ {
+ public virtual Response processAddConnection(ConnectionInfo info)
+ {
+ return null;
+ }
+
+ public virtual Response processAddConsumer(ConsumerInfo info)
+ {
+ return null;
+ }
+
+ public virtual Response processKeepAliveInfo(KeepAliveInfo info)
+ {
+ return null;
+ }
+
+ public virtual Response processMessage(Message send)
+ {
+ return null;
+ }
+
+ public virtual Response processMessageAck(MessageAck ack)
+ {
+ return null;
+ }
+
+ public virtual Response processRemoveConnection(ConnectionId id)
+ {
+ return null;
+ }
+
+ public virtual Response processRemoveConsumer(ConsumerId id)
+ {
+ return null;
+ }
+
+ public virtual Response processRemoveSubscriptionInfo(RemoveSubscriptionInfo info)
+ {
+ return null;
+ }
+
+ public virtual Response processShutdownInfo(ShutdownInfo info)
+ {
+ return null;
+ }
+
+ public virtual Response processMessageDispatch(MessageDispatch dispatch)
+ {
+ return null;
+ }
+
+ public virtual Response processResponse(Response response)
+ {
+ return null;
+ }
+
+ public virtual Response processConnectionError(ConnectionError error)
+ {
+ return null;
+ }
+
+ }
+}
Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/CommandVisitorAdapter.cs
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionState.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionState.cs?rev=961036&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionState.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionState.cs Tue Jul 6 22:27:14 2010
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using Apache.NMS.Stomp.Commands;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.Stomp.State
+{
+ public class ConnectionState
+ {
+
+ ConnectionInfo info;
+ private AtomicDictionary<ConsumerId, ConsumerState> consumers =
+ new AtomicDictionary<ConsumerId, ConsumerState>();
+ private Atomic<bool> _shutdown = new Atomic<bool>(false);
+
+ public ConnectionState(ConnectionInfo info)
+ {
+ this.info = info;
+ }
+
+ public override String ToString()
+ {
+ return info.ToString();
+ }
+
+ public void reset(ConnectionInfo info)
+ {
+ this.info = info;
+ _shutdown.Value = false;
+ }
+
+ public ConsumerState this[ConsumerId id]
+ {
+ get
+ {
+ #if DEBUG
+ try
+ {
+ #endif
+ return consumers[id];
+ #if DEBUG
+ }
+ catch(System.Collections.Generic.KeyNotFoundException ex)
+ {
+ // Useful for dignosing missing consumer ids
+ string consumerList = string.Empty;
+ foreach(ConsumerId consumerId in consumers.Keys)
+ {
+ consumerList += consumerId.ToString() + "\n";
+ }
+ System.Diagnostics.Debug.Assert(false,
+ string.Format("Consumer '{0}' did not exist in the consumers collection.\n\nConsumers:-\n{1}", id, consumerList));
+ throw ex;
+ }
+ #endif
+ }
+ }
+
+ public void addConsumer(ConsumerInfo info)
+ {
+ checkShutdown();
+ consumers.Add(info.ConsumerId, new ConsumerState(info));
+ }
+
+ public ConsumerState removeConsumer(ConsumerId id)
+ {
+ ConsumerState ret = consumers[id];
+ consumers.Remove(id);
+ return ret;
+ }
+
+ public ConnectionInfo Info
+ {
+ get
+ {
+ return info;
+ }
+ }
+
+ public AtomicCollection<ConsumerId> ConsumerIds
+ {
+ get
+ {
+ return consumers.Keys;
+ }
+ }
+
+ public AtomicCollection<ConsumerState> ConsumerStates
+ {
+ get
+ {
+ return consumers.Values;
+ }
+ }
+
+ private void checkShutdown()
+ {
+ if(_shutdown.Value)
+ {
+ throw new ApplicationException("Disposed");
+ }
+ }
+
+ public void shutdown()
+ {
+ if(_shutdown.CompareAndSet(false, true))
+ {
+ this.consumers.Clear();
+ }
+ }
+ }
+}
Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionState.cs
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionStateTracker.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionStateTracker.cs?rev=961036&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionStateTracker.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionStateTracker.cs Tue Jul 6 22:27:14 2010
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Collections.Generic;
+
+using Apache.NMS.Stomp.Commands;
+using Apache.NMS.Stomp.Transport;
+
+namespace Apache.NMS.Stomp.State
+{
+ /// <summary>
+ /// Tracks the state of a connection so a newly established transport can be
+ /// re-initialized to the state that was tracked.
+ /// </summary>
+ public class ConnectionStateTracker : CommandVisitorAdapter
+ {
+
+ private static Tracked TRACKED_RESPONSE_MARKER = new Tracked(null);
+
+ protected Dictionary<ConnectionId, ConnectionState> connectionStates =
+ new Dictionary<ConnectionId, ConnectionState>();
+
+ private bool _restoreConsumers = true;
+
+ /// <summary>
+ /// </summary>
+ /// <param name="command"></param>
+ /// <returns>null if the command is not state tracked.</returns>
+ public Tracked track(Command command)
+ {
+ try
+ {
+ return (Tracked) command.visit(this);
+ }
+ catch(IOException e)
+ {
+ throw e;
+ }
+ catch(Exception e)
+ {
+ throw new IOException(e.Message);
+ }
+ }
+
+ public void trackBack(Command command)
+ {
+ }
+
+ public void DoRestore(ITransport transport)
+ {
+ // Restore the connections.
+ foreach(ConnectionState connectionState in connectionStates.Values)
+ {
+ transport.Oneway(connectionState.Info);
+
+ if(RestoreConsumers)
+ {
+ DoRestoreConsumers(transport, connectionState);
+ }
+ }
+ }
+
+ /// <summary>
+ /// </summary>
+ /// <param name="transport"></param>
+ /// <param name="connectionState"></param>
+ protected void DoRestoreConsumers(ITransport transport, ConnectionState connectionState)
+ {
+ // Restore the session's consumers
+ foreach(ConsumerState consumerState in connectionState.ConsumerStates)
+ {
+ transport.Oneway(consumerState.Info);
+ }
+ }
+
+ public override Response processAddConsumer(ConsumerInfo info)
+ {
+ if(info != null)
+ {
+ SessionId sessionId = info.ConsumerId.ParentId;
+ if(sessionId != null)
+ {
+ ConnectionId connectionId = sessionId.ParentId;
+ if(connectionId != null)
+ {
+ ConnectionState cs = connectionStates[connectionId];
+ if(cs != null)
+ {
+ cs.addConsumer(info);
+ }
+ }
+ }
+ }
+ return TRACKED_RESPONSE_MARKER;
+ }
+
+ public override Response processRemoveConsumer(ConsumerId id)
+ {
+ if(id != null)
+ {
+ SessionId sessionId = id.ParentId;
+ if(sessionId != null)
+ {
+ ConnectionId connectionId = sessionId.ParentId;
+ if(connectionId != null)
+ {
+ ConnectionState cs = connectionStates[connectionId];
+ if(cs != null)
+ {
+ cs.removeConsumer(id);
+ }
+ }
+ }
+ }
+ return TRACKED_RESPONSE_MARKER;
+ }
+
+ public override Response processAddConnection(ConnectionInfo info)
+ {
+ if(info != null)
+ {
+ connectionStates.Add(info.ConnectionId, new ConnectionState(info));
+ }
+ return TRACKED_RESPONSE_MARKER;
+ }
+
+ public override Response processRemoveConnection(ConnectionId id)
+ {
+ if(id != null)
+ {
+ connectionStates.Remove(id);
+ }
+ return TRACKED_RESPONSE_MARKER;
+ }
+
+ public bool RestoreConsumers
+ {
+ get
+ {
+ return _restoreConsumers;
+ }
+ set
+ {
+ _restoreConsumers = value;
+ }
+ }
+ }
+}
Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConnectionStateTracker.cs
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConsumerState.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConsumerState.cs?rev=961036&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConsumerState.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConsumerState.cs Tue Jul 6 22:27:14 2010
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+
+using Apache.NMS.Stomp.Commands;
+
+namespace Apache.NMS.Stomp.State
+{
+
+ public class ConsumerState
+ {
+ ConsumerInfo info;
+
+ public ConsumerState(ConsumerInfo info)
+ {
+ this.info = info;
+ }
+
+ public override String ToString()
+ {
+ return info.ToString();
+ }
+
+ public ConsumerInfo Info
+ {
+ get
+ {
+ return info;
+ }
+ }
+ }
+}
Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ConsumerState.cs
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ICommandVisitor.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ICommandVisitor.cs?rev=961036&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ICommandVisitor.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ICommandVisitor.cs Tue Jul 6 22:27:14 2010
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+using Apache.NMS.Stomp.Commands;
+
+namespace Apache.NMS.Stomp.State
+{
+ public interface ICommandVisitor
+ {
+ Response processAddConnection(ConnectionInfo info);
+
+ Response processAddConsumer(ConsumerInfo info);
+
+ Response processRemoveConnection(ConnectionId id);
+
+ Response processRemoveConsumer(ConsumerId id);
+
+ Response processRemoveSubscriptionInfo(RemoveSubscriptionInfo info);
+
+ Response processMessage(Message send);
+
+ Response processMessageAck(MessageAck ack);
+
+ Response processKeepAliveInfo(KeepAliveInfo info);
+
+ Response processShutdownInfo(ShutdownInfo info);
+
+ Response processMessageDispatch(MessageDispatch dispatch);
+
+ Response processConnectionError(ConnectionError error);
+
+ Response processResponse(Response response);
+ }
+}
Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ICommandVisitor.cs
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/SynchronizedObjects.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/SynchronizedObjects.cs?rev=961036&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/SynchronizedObjects.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/SynchronizedObjects.cs Tue Jul 6 22:27:14 2010
@@ -0,0 +1,219 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace Apache.NMS.Stomp.State
+{
+ public class AtomicCollection<TValue>
+ where TValue : class
+ {
+ private ArrayList _collection = new ArrayList();
+
+ public AtomicCollection()
+ {
+ }
+
+ public AtomicCollection(ICollection c)
+ {
+ lock(c.SyncRoot)
+ {
+ foreach(object obj in c)
+ {
+ _collection.Add(obj);
+ }
+ }
+ }
+
+ public int Count
+ {
+ get
+ {
+ lock(_collection.SyncRoot)
+ {
+ return _collection.Count;
+ }
+ }
+ }
+
+ public bool IsReadOnly
+ {
+ get
+ {
+ return false;
+ }
+ }
+
+ public int Add(TValue v)
+ {
+ lock(_collection.SyncRoot)
+ {
+ return _collection.Add(v);
+ }
+ }
+
+ public void Clear()
+ {
+ lock(_collection.SyncRoot)
+ {
+ _collection.Clear();
+ }
+ }
+
+ public bool Contains(TValue v)
+ {
+ lock(_collection.SyncRoot)
+ {
+ return _collection.Contains(v);
+ }
+ }
+
+ public void CopyTo(TValue[] a, int index)
+ {
+ lock(_collection.SyncRoot)
+ {
+ _collection.CopyTo(a, index);
+ }
+ }
+
+ public void Remove(TValue v)
+ {
+ lock(_collection.SyncRoot)
+ {
+ _collection.Remove(v);
+ }
+ }
+
+ public void RemoveAt(int index)
+ {
+ lock(_collection.SyncRoot)
+ {
+ _collection.RemoveAt(index);
+ }
+ }
+
+ public TValue this[int index]
+ {
+ get
+ {
+ TValue ret;
+ lock(_collection.SyncRoot)
+ {
+ ret = (TValue) _collection[index];
+ }
+ return (TValue) ret;
+ }
+ set
+ {
+ lock(_collection.SyncRoot)
+ {
+ _collection[index] = value;
+ }
+ }
+ }
+
+ public IEnumerator GetEnumerator()
+ {
+ lock(_collection.SyncRoot)
+ {
+ return _collection.GetEnumerator();
+ }
+ }
+
+#if !NETCF
+ public IEnumerator GetEnumerator(int index, int count)
+ {
+ lock(_collection.SyncRoot)
+ {
+ return _collection.GetEnumerator(index, count);
+ }
+ }
+#endif
+ }
+
+ public class AtomicDictionary<TKey, TValue>
+ where TKey : class
+ where TValue : class
+ {
+ private Dictionary<TKey, TValue> _dictionary = new Dictionary<TKey, TValue>();
+
+ public void Clear()
+ {
+ _dictionary.Clear();
+ }
+
+ public TValue this[TKey key]
+ {
+ get
+ {
+ TValue ret;
+ lock(((ICollection) _dictionary).SyncRoot)
+ {
+ ret = _dictionary[key];
+ }
+ return ret;
+ }
+ set
+ {
+ lock(((ICollection) _dictionary).SyncRoot)
+ {
+ _dictionary[key] = value;
+ }
+ }
+ }
+
+ public AtomicCollection<TKey> Keys
+ {
+ get
+ {
+ lock(((ICollection) _dictionary).SyncRoot)
+ {
+ return new AtomicCollection<TKey>(_dictionary.Keys);
+ }
+ }
+ }
+
+ public AtomicCollection<TValue> Values
+ {
+ get
+ {
+ lock(((ICollection) _dictionary).SyncRoot)
+ {
+ return new AtomicCollection<TValue>(_dictionary.Values);
+ }
+ }
+ }
+
+ public void Add(TKey k, TValue v)
+ {
+ lock(((ICollection) _dictionary).SyncRoot)
+ {
+ _dictionary.Add(k, v);
+ }
+ }
+
+ public bool Remove(TKey v)
+ {
+ lock(((ICollection) _dictionary).SyncRoot)
+ {
+ return _dictionary.Remove(v);
+ }
+ }
+ }
+}
Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/SynchronizedObjects.cs
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ThreadSimulator.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ThreadSimulator.cs?rev=961036&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ThreadSimulator.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ThreadSimulator.cs Tue Jul 6 22:27:14 2010
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+
+namespace Apache.NMS.Stomp.State
+{
+ public abstract class ThreadSimulator
+ {
+ public virtual void Run()
+ {
+ throw new ApplicationException("ThreadSimulator.Run() should be overridden.");
+ }
+ }
+}
Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/ThreadSimulator.cs
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/Tracked.cs
URL: http://svn.apache.org/viewvc/activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/Tracked.cs?rev=961036&view=auto
==============================================================================
--- activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/Tracked.cs (added)
+++ activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/Tracked.cs Tue Jul 6 22:27:14 2010
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using Apache.NMS.Stomp.Commands;
+
+namespace Apache.NMS.Stomp.State
+{
+ public class Tracked : Response
+ {
+ private ThreadSimulator runnable = null;
+
+ public Tracked(ThreadSimulator runnable)
+ {
+ this.runnable = runnable;
+ }
+
+ public void onResponses()
+ {
+ if(runnable != null)
+ {
+ runnable.Run();
+ runnable = null;
+ }
+ }
+
+ virtual public bool WaitingForResponse
+ {
+ get
+ {
+ return runnable != null;
+ }
+ }
+
+ }
+}
Propchange: activemq/activemq-dotnet/Apache.NMS.Stomp/trunk/src/main/csharp/State/Tracked.cs
------------------------------------------------------------------------------
svn:eol-style = native