Skip to content

Commit d3a1d50

Browse files
committed
完善心跳的设计。
1 parent 99d94fc commit d3a1d50

29 files changed

+340
-59
lines changed

src/EQueue.AdminWeb/Controllers/HomeController.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public ActionResult Index()
2222
TopicCount = result.TopicCount,
2323
QueueCount = result.QueueCount,
2424
ConsumerGroupCount = result.ConsumerGroupCount,
25+
ProducerCount = result.ProducerCount,
2526
ConsumerCount = result.ConsumerCount,
2627
TotalUnConsumedMessageCount = result.TotalUnConsumedMessageCount,
2728
MessageChunkCount = result.MessageChunkCount,
@@ -48,6 +49,14 @@ public ActionResult QueueInfo(string topic)
4849
TopicQueueInfos = topicQueueInfos
4950
});
5051
}
52+
public ActionResult ProducerInfo(string group, string topic)
53+
{
54+
var producerIds = _messageService.GetProducerInfo();
55+
return View(new ProducerViewModel
56+
{
57+
ProducerIds = producerIds
58+
});
59+
}
5160
public ActionResult ConsumerInfo(string group, string topic)
5261
{
5362
var consumerInfos = _messageService.GetConsumerInfo(group, topic);

src/EQueue.AdminWeb/EQueue.AdminWeb.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@
150150
<DependentUpon>Global.asax</DependentUpon>
151151
</Compile>
152152
<Compile Include="Models\BrokerStatisticInfoViewModel.cs" />
153+
<Compile Include="Models\ProducerViewModel.cs" />
153154
<Compile Include="Models\MessageViewModel.cs" />
154155
<Compile Include="Models\ConsumerViewModel.cs" />
155156
<Compile Include="Models\TopicQueueViewModel.cs" />
@@ -190,6 +191,7 @@
190191
<Content Include="Views\Shared\_Layout.cshtml" />
191192
<Content Include="Views\Home\Index.cshtml" />
192193
<Content Include="Views\Home\ConsumerInfo.cshtml" />
194+
<Content Include="Views\Home\ProducerInfo.cshtml" />
193195
</ItemGroup>
194196
<ItemGroup>
195197
<ProjectReference Include="..\EQueue\EQueue.csproj">

src/EQueue.AdminWeb/MessageService.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace EQueue.AdminWeb
1313
{
1414
public class MessageService
1515
{
16+
private readonly byte[] EmptyBytes = new byte[0];
1617
private readonly SocketRemotingClient _remotingClient;
1718
private readonly IBinarySerializer _binarySerializer;
1819
private readonly IScheduleService _scheduleService;
@@ -82,7 +83,21 @@ public IEnumerable<TopicQueueInfo> GetTopicQueueInfo(string topic)
8283
}
8384
else
8485
{
85-
throw new Exception(string.Format("QueryTopicQueueInfo failed, errorMessage: {0}", Encoding.UTF8.GetString(remotingResponse.Body)));
86+
throw new Exception(string.Format("GetTopicQueueInfo failed, errorMessage: {0}", Encoding.UTF8.GetString(remotingResponse.Body)));
87+
}
88+
}
89+
public IEnumerable<string> GetProducerInfo()
90+
{
91+
var remotingRequest = new RemotingRequest((int)RequestCode.QueryProducerInfo, EmptyBytes);
92+
var remotingResponse = _remotingClient.InvokeSync(remotingRequest, 10000);
93+
if (remotingResponse.Code == (int)ResponseCode.Success)
94+
{
95+
var producerIds = Encoding.UTF8.GetString(remotingResponse.Body);
96+
return producerIds.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);
97+
}
98+
else
99+
{
100+
throw new Exception(string.Format("GetProducerInfo failed, errorMessage: {0}", Encoding.UTF8.GetString(remotingResponse.Body)));
86101
}
87102
}
88103
public IEnumerable<ConsumerInfo> GetConsumerInfo(string group, string topic)
@@ -96,7 +111,7 @@ public IEnumerable<ConsumerInfo> GetConsumerInfo(string group, string topic)
96111
}
97112
else
98113
{
99-
throw new Exception(string.Format("QueryConsumerInfo failed, errorMessage: {0}", Encoding.UTF8.GetString(remotingResponse.Body)));
114+
throw new Exception(string.Format("GetConsumerInfo failed, errorMessage: {0}", Encoding.UTF8.GetString(remotingResponse.Body)));
100115
}
101116
}
102117
public void AddQueue(string topic)

src/EQueue.AdminWeb/Models/BrokerStatisticInfoViewModel.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ public class BrokerStatisticInfoViewModel
88
/// <summary>队列个数
99
/// </summary>
1010
public int QueueCount { get; set; }
11+
/// <summary>生产者个数
12+
/// </summary>
13+
public int ProducerCount { get; set; }
1114
/// <summary>消费者组个数
1215
/// </summary>
1316
public int ConsumerGroupCount { get; set; }
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Collections.Generic;
2+
using EQueue.Protocols;
3+
4+
namespace EQueue.AdminWeb.Models
5+
{
6+
public class ProducerViewModel
7+
{
8+
public IEnumerable<string> ProducerIds { get; set; }
9+
}
10+
}

src/EQueue.AdminWeb/Views/Home/ConsumerInfo.cshtml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
</td>
6666
<td class="text-center vertical-center">
6767
@(item.QueueCurrentOffset - item.ConsumedOffset)
68+
</td>
6869
</tr>
6970
}
7071
</tbody>

src/EQueue.AdminWeb/Views/Home/Index.cshtml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424
@Model.QueueCount
2525
</div>
2626
</div>
27+
<div class="form-group">
28+
<label class="col-sm-2 control-label">生产者个数:</label>
29+
<div class="col-sm-10">
30+
@Model.ProducerCount
31+
</div>
32+
</div>
2733
<div class="form-group">
2834
<label class="col-sm-2 control-label">消费者组个数:</label>
2935
<div class="col-sm-10">
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
@model EQueue.AdminWeb.Models.ProducerViewModel
2+
@{
3+
ViewBag.Title = "生产者列表";
4+
}
5+
<div>
6+
<table class="table table-striped">
7+
<thead>
8+
<tr>
9+
<th class="vertical-center">
10+
ProducerId
11+
</th>
12+
</tr>
13+
</thead>
14+
<tbody>
15+
@foreach (var item in Model.ProducerIds)
16+
{
17+
<tr>
18+
<td class="vertical-center">
19+
@item
20+
</td>
21+
</tr>
22+
}
23+
</tbody>
24+
</table>
25+
</div>

src/EQueue.AdminWeb/Views/Shared/_Layout.cshtml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
</button>
2323
@Html.ActionLink("首页", "Index", "Home", null, new { @class = "navbar-brand" })
2424
@Html.ActionLink("队列信息", "QueueInfo", "Home", null, new { @class = "navbar-brand" })
25+
@Html.ActionLink("生产者列表", "ProducerInfo", "Home", null, new { @class = "navbar-brand" })
2526
@Html.ActionLink("消费者列表", "ConsumerInfo", "Home", null, new { @class = "navbar-brand" })
2627
@Html.ActionLink("消息查询", "Message", "Home", null, new { @class = "navbar-brand" })
2728
</div>

src/EQueue/Broker/BrokerController.cs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class BrokerController
2626
private readonly IMessageStore _messageStore;
2727
private readonly IConsumeOffsetStore _consumeOffsetStore;
2828
private readonly SuspendedPullRequestManager _suspendedPullRequestManager;
29+
private readonly ProducerManager _producerManager;
2930
private readonly ConsumerManager _consumerManager;
3031
private readonly SocketRemotingServer _producerSocketRemotingServer;
3132
private readonly SocketRemotingServer _consumerSocketRemotingServer;
@@ -36,6 +37,10 @@ public class BrokerController
3637
private int _isCleaning = 0;
3738

3839
public BrokerSetting Setting { get; private set; }
40+
public ProducerManager ProducerManager
41+
{
42+
get { return _producerManager; }
43+
}
3944
public ConsumerManager ConsumerManager
4045
{
4146
get { return _consumerManager; }
@@ -52,6 +57,7 @@ public static BrokerController Instance
5257
private BrokerController(BrokerSetting setting)
5358
{
5459
Setting = setting ?? new BrokerSetting();
60+
_producerManager = ObjectContainer.Resolve<ProducerManager>();
5561
_consumerManager = ObjectContainer.Resolve<ConsumerManager>();
5662
_messageStore = ObjectContainer.Resolve<IMessageStore>();
5763
_consumeOffsetStore = ObjectContainer.Resolve<IConsumeOffsetStore>();
@@ -64,6 +70,7 @@ private BrokerController(BrokerSetting setting)
6470
_adminSocketRemotingServer = new SocketRemotingServer("EQueue.Broker.AdminRemotingServer", Setting.AdminAddress, Setting.SocketSetting);
6571

6672
_logger = ObjectContainer.Resolve<ILoggerFactory>().Create(GetType().FullName);
73+
_producerSocketRemotingServer.RegisterConnectionEventListener(new ProducerConnectionEventListener(this));
6774
_consumerSocketRemotingServer.RegisterConnectionEventListener(new ConsumerConnectionEventListener(this));
6875
RegisterRequestHandlers();
6976

@@ -150,6 +157,7 @@ public BrokerController Start()
150157
_consumeOffsetStore.Start();
151158
_messageStore.Start();
152159
_queueStore.Start();
160+
_producerManager.Start();
153161
_consumerManager.Start();
154162
_suspendedPullRequestManager.Start();
155163
_consumerSocketRemotingServer.Start();
@@ -172,6 +180,7 @@ public BrokerController Shutdown()
172180
_producerSocketRemotingServer.Shutdown();
173181
_consumerSocketRemotingServer.Shutdown();
174182
_adminSocketRemotingServer.Shutdown();
183+
_producerManager.Shutdown();
175184
_consumerManager.Shutdown();
176185
_suspendedPullRequestManager.Shutdown();
177186
_messageStore.Shutdown();
@@ -189,6 +198,7 @@ public BrokerStatisticInfo GetBrokerStatisticInfo()
189198
statisticInfo.QueueCount = _queueStore.GetAllQueueCount();
190199
statisticInfo.TotalUnConsumedMessageCount = _queueStore.GetTotalUnConusmedMessageCount();
191200
statisticInfo.ConsumerGroupCount = _consumerManager.GetConsumerGroupCount();
201+
statisticInfo.ProducerCount = _producerManager.GetProducerCount();
192202
statisticInfo.ConsumerCount = _consumerManager.GetConsumerCount();
193203
statisticInfo.MessageChunkCount = _messageStore.ChunkCount;
194204
statisticInfo.MessageMinChunkNum = _messageStore.MinChunkNum;
@@ -209,20 +219,22 @@ private void RemoveNotExistQueueConsumeOffsets()
209219
}
210220
private void RegisterRequestHandlers()
211221
{
222+
_producerSocketRemotingServer.RegisterRequestHandler((int)RequestCode.ProducerHeartbeat, new ProducerHeartbeatRequestHandler(this));
212223
_producerSocketRemotingServer.RegisterRequestHandler((int)RequestCode.SendMessage, new SendMessageRequestHandler(this));
213224

225+
_consumerSocketRemotingServer.RegisterRequestHandler((int)RequestCode.ConsumerHeartbeat, new ConsumerHeartbeatRequestHandler(this));
214226
_consumerSocketRemotingServer.RegisterRequestHandler((int)RequestCode.PullMessage, new PullMessageRequestHandler());
215227

216228
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.GetTopicQueueIdsForProducer, new GetTopicQueueIdsForProducerRequestHandler());
217229
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.GetTopicQueueIdsForConsumer, new GetTopicQueueIdsForConsumerRequestHandler());
218230
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.QueryGroupConsumer, new QueryConsumerRequestHandler());
219-
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.ConsumerHeartbeat, new ConsumerHeartbeatRequestHandler(this));
220231
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.UpdateQueueOffsetRequest, new UpdateQueueOffsetRequestHandler());
221232

222233
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.QueryBrokerStatisticInfo, new QueryBrokerStatisticInfoRequestHandler());
223234
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.CreateTopic, new CreateTopicRequestHandler());
224235
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.DeleteTopic, new DeleteTopicRequestHandler());
225236
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.QueryTopicQueueInfo, new QueryTopicQueueInfoRequestHandler());
237+
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.QueryProducerInfo, new QueryProducerInfoRequestHandler());
226238
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.QueryConsumerInfo, new QueryConsumerInfoRequestHandler());
227239
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.AddQueue, new AddQueueRequestHandler());
228240
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.DeleteQueue, new DeleteQueueRequestHandler());
@@ -231,6 +243,24 @@ private void RegisterRequestHandlers()
231243
_adminSocketRemotingServer.RegisterRequestHandler((int)RequestCode.GetMessageDetail, new GetMessageDetailRequestHandler());
232244
}
233245

246+
class ProducerConnectionEventListener : IConnectionEventListener
247+
{
248+
private BrokerController _brokerController;
249+
250+
public ProducerConnectionEventListener(BrokerController brokerController)
251+
{
252+
_brokerController = brokerController;
253+
}
254+
255+
public void OnConnectionAccepted(ITcpConnection connection) { }
256+
public void OnConnectionEstablished(ITcpConnection connection) { }
257+
public void OnConnectionFailed(SocketError socketError) { }
258+
public void OnConnectionClosed(ITcpConnection connection, SocketError socketError)
259+
{
260+
var producerId = ClientIdFactory.CreateClientId(connection.RemotingEndPoint as IPEndPoint);
261+
_brokerController._producerManager.RemoveProducer(producerId);
262+
}
263+
}
234264
class ConsumerConnectionEventListener : IConnectionEventListener
235265
{
236266
private BrokerController _brokerController;

0 commit comments

Comments
 (0)