Skip to content

Commit 7df2d09

Browse files
author
Alexandru Scvortov
committed
merge bug22967 into default (Channel flow in public API)
2 parents a845202 + 9e1f2c9 commit 7df2d09

File tree

4 files changed

+129
-0
lines changed

4 files changed

+129
-0
lines changed

projects/client/ApigenBootstrap/RabbitMQ.Client.ApigenBootstrap.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@
9090
<Compile Include="..\RabbitMQ.Client\src\client\events\ModelShutdownEventHandler.cs">
9191
<Link>src\client\events\ModelShutdownEventHandler.cs</Link>
9292
</Compile>
93+
<Compile Include="..\RabbitMQ.Client\src\client\events\FlowControlEventHandler.cs">
94+
<Link>src\client\events\FlowControlEventHandler.cs</Link>
95+
</Compile>
9396
<Compile Include="properties\AssemblyInfo.cs" />
9497
</ItemGroup>
9598

projects/client/RabbitMQ.Client/src/client/api/IModel.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ public interface IModel: IDisposable
9393
///</remarks>
9494
event CallbackExceptionEventHandler CallbackException;
9595

96+
event FlowControlEventHandler FlowControl;
97+
9698
///<summary>All messages received before this fires that haven't been
9799
///ack'ed will be redelivered. All messages received afterwards won't
98100
///be.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// This source code is dual-licensed under the Apache License, version
2+
// 2.0, and the Mozilla Public License, version 1.1.
3+
//
4+
// The APL v2.0:
5+
//
6+
//---------------------------------------------------------------------------
7+
// Copyright (C) 2007-2010 LShift Ltd., Cohesive Financial
8+
// Technologies LLC., and Rabbit Technologies Ltd.
9+
//
10+
// Licensed under the Apache License, Version 2.0 (the "License");
11+
// you may not use this file except in compliance with the License.
12+
// You may obtain a copy of the License at
13+
//
14+
// http://www.apache.org/licenses/LICENSE-2.0
15+
//
16+
// Unless required by applicable law or agreed to in writing, software
17+
// distributed under the License is distributed on an "AS IS" BASIS,
18+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19+
// See the License for the specific language governing permissions and
20+
// limitations under the License.
21+
//---------------------------------------------------------------------------
22+
//
23+
// The MPL v1.1:
24+
//
25+
//---------------------------------------------------------------------------
26+
// The contents of this file are subject to the Mozilla Public License
27+
// Version 1.1 (the "License"); you may not use this file except in
28+
// compliance with the License. You may obtain a copy of the License at
29+
// http://www.rabbitmq.com/mpl.html
30+
//
31+
// Software distributed under the License is distributed on an "AS IS"
32+
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
33+
// License for the specific language governing rights and limitations
34+
// under the License.
35+
//
36+
// The Original Code is The RabbitMQ .NET Client.
37+
//
38+
// The Initial Developers of the Original Code are LShift Ltd,
39+
// Cohesive Financial Technologies LLC, and Rabbit Technologies Ltd.
40+
//
41+
// Portions created before 22-Nov-2008 00:00:00 GMT by LShift Ltd,
42+
// Cohesive Financial Technologies LLC, or Rabbit Technologies Ltd
43+
// are Copyright (C) 2007-2008 LShift Ltd, Cohesive Financial
44+
// Technologies LLC, and Rabbit Technologies Ltd.
45+
//
46+
// Portions created by LShift Ltd are Copyright (C) 2007-2010 LShift
47+
// Ltd. Portions created by Cohesive Financial Technologies LLC are
48+
// Copyright (C) 2007-2010 Cohesive Financial Technologies
49+
// LLC. Portions created by Rabbit Technologies Ltd are Copyright
50+
// (C) 2007-2010 Rabbit Technologies Ltd.
51+
//
52+
// All Rights Reserved.
53+
//
54+
// Contributor(s): ______________________________________.
55+
//
56+
//---------------------------------------------------------------------------
57+
58+
using System;
59+
60+
namespace RabbitMQ.Client.Events
61+
{
62+
63+
///<summary>Delegate used to process flow control events.</summary>
64+
public delegate void FlowControlEventHandler(IModel sender, FlowControlEventArgs args);
65+
66+
///<summary>Event relating to flow control</summary>
67+
public class FlowControlEventArgs : EventArgs
68+
{
69+
private readonly bool m_active;
70+
71+
public FlowControlEventArgs(bool active)
72+
{
73+
m_active = active;
74+
}
75+
76+
///<summary>Access the flow control setting</summary>
77+
public bool Active { get { return m_active; } }
78+
}
79+
}

projects/client/RabbitMQ.Client/src/client/impl/ModelBase.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ public abstract class ModelBase : IFullModel
8282
private readonly object m_eventLock = new object();
8383
private BasicReturnEventHandler m_basicReturn;
8484
private CallbackExceptionEventHandler m_callbackException;
85+
private FlowControlEventHandler m_flowControl;
8586
private BasicRecoverOkEventHandler m_basicRecoverOk;
8687

8788
public ManualResetEvent m_flowControlBlock = new ManualResetEvent(true);
@@ -149,6 +150,24 @@ public event CallbackExceptionEventHandler CallbackException
149150
}
150151
}
151152

153+
public event FlowControlEventHandler FlowControl
154+
{
155+
add
156+
{
157+
lock (m_eventLock)
158+
{
159+
m_flowControl += value;
160+
}
161+
}
162+
remove
163+
{
164+
lock (m_eventLock)
165+
{
166+
m_flowControl -= value;
167+
}
168+
}
169+
}
170+
152171
public event BasicRecoverOkEventHandler BasicRecoverOk
153172
{
154173
add
@@ -298,6 +317,31 @@ public virtual void OnCallbackException(CallbackExceptionEventArgs args)
298317
}
299318
}
300319

320+
public virtual void OnFlowControl(FlowControlEventArgs args)
321+
{
322+
FlowControlEventHandler handler;
323+
lock (m_eventLock)
324+
{
325+
handler = m_flowControl;
326+
}
327+
if (handler != null)
328+
{
329+
foreach (FlowControlEventHandler h in handler.GetInvocationList())
330+
{
331+
try
332+
{
333+
h(this, args);
334+
}
335+
catch (Exception e)
336+
{
337+
CallbackExceptionEventArgs exnArgs = new CallbackExceptionEventArgs(e);
338+
exnArgs.Detail["context"] = "OnFlowControl";
339+
OnCallbackException(exnArgs);
340+
}
341+
}
342+
}
343+
}
344+
301345
public virtual void OnBasicRecoverOk(EventArgs args)
302346
{
303347
BasicRecoverOkEventHandler handler;
@@ -455,6 +499,7 @@ public void HandleChannelFlow(bool active)
455499
else
456500
m_flowControlBlock.Reset();
457501
_Private_ChannelFlowOk(active);
502+
OnFlowControl(new FlowControlEventArgs(active));
458503
}
459504

460505
public void HandleConnectionStart(byte versionMajor,

0 commit comments

Comments
 (0)