Skip to content

Commit dff7d2b

Browse files
committed
[FIX]Event应该注册一个,收到消息后,处理多个Handler该Event的事件
1 parent 3d5d7ff commit dff7d2b

5 files changed

Lines changed: 138 additions & 81 deletions

File tree

RabbitMQ.EventBus.AspNetCore.Simple/Controllers/MessageBodyHandle.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,32 @@
55

66
namespace RabbitMQ.EventBus.AspNetCore.Simple.Controllers
77
{
8+
public class MessageBodyHandle00 : IEventHandler<MessageBody>, IDisposable
9+
{
10+
private Guid id;
11+
private readonly ILogger<MessageBodyHandle> _logger;
12+
13+
public MessageBodyHandle00(ILogger<MessageBodyHandle> logger)
14+
{
15+
id = Guid.NewGuid();
16+
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
17+
}
18+
public void Dispose()
19+
{
20+
Console.WriteLine("释放");
21+
}
22+
23+
public Task Handle(EventHandlerArgs<MessageBody> args)
24+
{
25+
Console.WriteLine("==================================================");
26+
Console.WriteLine(id + "=>" + typeof(MessageBody).Name);
27+
Console.WriteLine(args.Event.Body);
28+
Console.WriteLine(args.Original);
29+
Console.WriteLine(args.Redelivered);
30+
Console.WriteLine("==================================================");
31+
return Task.CompletedTask;
32+
}
33+
}
834
public class MessageBodyHandle : IEventHandler<MessageBody1>, IDisposable
935
{
1036
private Guid id;
@@ -20,6 +46,32 @@ public void Dispose()
2046
Console.WriteLine("释放");
2147
}
2248

49+
public Task Handle(EventHandlerArgs<MessageBody1> args)
50+
{
51+
Console.WriteLine("==================================================");
52+
Console.WriteLine(id + "=>" + typeof(MessageBody1).Name);
53+
Console.WriteLine(args.Event.Body);
54+
Console.WriteLine(args.Original);
55+
Console.WriteLine(args.Redelivered);
56+
Console.WriteLine("==================================================");
57+
return Task.CompletedTask;
58+
}
59+
}
60+
public class MessageBodyHandle111 : IEventHandler<MessageBody1>, IDisposable
61+
{
62+
private Guid id;
63+
private readonly ILogger<MessageBodyHandle> _logger;
64+
65+
public MessageBodyHandle111(ILogger<MessageBodyHandle> logger)
66+
{
67+
id = Guid.NewGuid();
68+
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
69+
}
70+
public void Dispose()
71+
{
72+
Console.WriteLine("释放");
73+
}
74+
2375
public Task Handle(EventHandlerArgs<MessageBody1> args)
2476
{
2577
Console.WriteLine("==================================================");

RabbitMQ.EventBus.AspNetCore.Simple/Startup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public void ConfigureServices(IServiceCollection services)
2323
string assemblyName = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
2424
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
2525

26-
services.AddRabbitMQEventBus(() => "amqp://guest:guest@192.168.0.252:5672/", eventBusOptionAction: eventBusOption =>
26+
services.AddRabbitMQEventBus(() => "amqp://guest:guest@192.168.0.251:5672/", eventBusOptionAction: eventBusOption =>
2727
{
2828
eventBusOption.ClientProvidedAssembly(assemblyName);
2929
eventBusOption.EnableRetryOnFailure(true, 5000, TimeSpan.FromSeconds(30));

src/RabbitMQ.EventBus.AspNetCore/DefaultRabbitMQEventBus.cs

Lines changed: 75 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -68,69 +68,69 @@ public void Publish<TMessage>(TMessage message, string exchange, string routingK
6868
_logger.WriteLog(_persistentConnection.Configuration.Level, $"{DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss")}\t{exchange}\t{routingKey}\t{body}");
6969
_eventHandlerFactory?.PubliushEvent(new EventBusArgs(_persistentConnection.Endpoint, exchange, "", routingKey, type, _persistentConnection.Configuration.ClientProvidedName, body, true));
7070
}
71-
public void Subscribe<TEvent, THandler>(string type = ExchangeType.Topic)
72-
where TEvent : IEvent
73-
where THandler : IEventHandler<TEvent>
74-
{
75-
Subscribe(typeof(TEvent), typeof(THandler));
76-
#region MyRegion
77-
/*object attribute = typeof(TEvent).GetCustomAttributes(typeof(EventBusAttribute), true).FirstOrDefault();
78-
if (attribute is EventBusAttribute attr)
79-
{
80-
string queue = attr.Queue ?? $"{ attr.Exchange }.{ typeof(TEvent).Name }";
81-
if (!_persistentConnection.IsConnected)
82-
{
83-
_persistentConnection.TryConnect();
84-
}
85-
IModel channel;
86-
#region snippet
87-
try
88-
{
89-
channel = _persistentConnection.ExchangeDeclare(exchange: attr.Exchange, type: type);
90-
channel.QueueDeclarePassive(queue);
91-
}
92-
catch
93-
{
94-
channel = _persistentConnection.ExchangeDeclare(exchange: attr.Exchange, type: type);
95-
channel.QueueDeclare(queue: queue,
96-
durable: true,
97-
exclusive: false,
98-
autoDelete: false,
99-
arguments: null);
100-
}
101-
#endregion
102-
channel.QueueBind(queue, attr.Exchange, attr.RoutingKey, null);
103-
channel.BasicQos(0, 1, false);
104-
EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
105-
consumer.Received += async (model, ea) =>
106-
{
107-
string body = Encoding.UTF8.GetString(ea.Body);
108-
bool isAck = false;
109-
try
110-
{
111-
await ProcessEvent<TEvent, THandler>(body);
112-
channel.BasicAck(ea.DeliveryTag, multiple: false);
113-
isAck = true;
114-
}
115-
catch (Exception ex)
116-
{
117-
_logger.LogError(new EventId(ex.HResult), ex, ex.Message);
118-
}
119-
finally
120-
{
121-
_logger.Information($"RabbitMQEventBus\t{DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss")}\t{isAck}\t{ea.Exchange}\t{ea.RoutingKey}\t{body}");
122-
}
123-
};
124-
channel.CallbackException += (sender, ex) =>
125-
{
71+
//public void Subscribe<TEvent, THandler>(string type = ExchangeType.Topic)
72+
// where TEvent : IEvent
73+
// where THandler : IEventHandler<TEvent>
74+
//{
75+
// //Subscribe(typeof(TEvent), typeof(THandler));
76+
// #region MyRegion
77+
// /*object attribute = typeof(TEvent).GetCustomAttributes(typeof(EventBusAttribute), true).FirstOrDefault();
78+
// if (attribute is EventBusAttribute attr)
79+
// {
80+
// string queue = attr.Queue ?? $"{ attr.Exchange }.{ typeof(TEvent).Name }";
81+
// if (!_persistentConnection.IsConnected)
82+
// {
83+
// _persistentConnection.TryConnect();
84+
// }
85+
// IModel channel;
86+
// #region snippet
87+
// try
88+
// {
89+
// channel = _persistentConnection.ExchangeDeclare(exchange: attr.Exchange, type: type);
90+
// channel.QueueDeclarePassive(queue);
91+
// }
92+
// catch
93+
// {
94+
// channel = _persistentConnection.ExchangeDeclare(exchange: attr.Exchange, type: type);
95+
// channel.QueueDeclare(queue: queue,
96+
// durable: true,
97+
// exclusive: false,
98+
// autoDelete: false,
99+
// arguments: null);
100+
// }
101+
// #endregion
102+
// channel.QueueBind(queue, attr.Exchange, attr.RoutingKey, null);
103+
// channel.BasicQos(0, 1, false);
104+
// EventingBasicConsumer consumer = new EventingBasicConsumer(channel);
105+
// consumer.Received += async (model, ea) =>
106+
// {
107+
// string body = Encoding.UTF8.GetString(ea.Body);
108+
// bool isAck = false;
109+
// try
110+
// {
111+
// await ProcessEvent<TEvent, THandler>(body);
112+
// channel.BasicAck(ea.DeliveryTag, multiple: false);
113+
// isAck = true;
114+
// }
115+
// catch (Exception ex)
116+
// {
117+
// _logger.LogError(new EventId(ex.HResult), ex, ex.Message);
118+
// }
119+
// finally
120+
// {
121+
// _logger.Information($"RabbitMQEventBus\t{DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss")}\t{isAck}\t{ea.Exchange}\t{ea.RoutingKey}\t{body}");
122+
// }
123+
// };
124+
// channel.CallbackException += (sender, ex) =>
125+
// {
126126

127-
};
128-
channel.BasicConsume(queue: queue, autoAck: false, consumer: consumer);
129-
}*/
130-
#endregion
131-
}
127+
// };
128+
// channel.BasicConsume(queue: queue, autoAck: false, consumer: consumer);
129+
// }*/
130+
// #endregion
131+
//}
132132

133-
public void Subscribe(Type eventType, Type eventHandleType, string type = ExchangeType.Topic)
133+
public void Subscribe(Type eventType, string type = ExchangeType.Topic)
134134
{
135135
var attributes = eventType.GetCustomAttributes(typeof(EventBusAttribute), true);
136136
var millisecondsDelay = (int?)_persistentConnection?.Configuration?.ConsumerFailRetryInterval.TotalMilliseconds ?? 1000;
@@ -169,7 +169,7 @@ public void Subscribe(Type eventType, Type eventHandleType, string type = Exchan
169169
bool isAck = false;
170170
try
171171
{
172-
await ProcessEvent(body, eventType, eventHandleType, ea);
172+
await ProcessEvent(body, eventType, ea);
173173
channel.BasicAck(ea.DeliveryTag, multiple: false);
174174
isAck = true;
175175
}
@@ -222,21 +222,24 @@ public void Subscribe(Type eventType, Type eventHandleType, string type = Exchan
222222
/// <param name="eventHandleType"></param>
223223
/// <param name="args"></param>
224224
/// <returns></returns>
225-
private async Task ProcessEvent(string body, Type eventType, Type eventHandleType, BasicDeliverEventArgs args)
225+
private async Task ProcessEvent(string body, Type eventType, BasicDeliverEventArgs args)
226226
{
227227
using (var scope = _serviceProvider.CreateScope())
228228
{
229-
object eventHandler = scope.ServiceProvider.GetRequiredService(eventHandleType);
230-
if (eventHandler == null)
229+
foreach (Type eventHandleType in typeof(IEventHandler<>).GetMakeGenericType(eventType))
231230
{
232-
throw new InvalidOperationException(eventHandleType.Name);
233-
}
234-
Type concreteType = typeof(IEventHandler<>).MakeGenericType(eventType);
235-
await (Task)concreteType.GetMethod(nameof(IEventHandler<IEvent>.Handle)).Invoke(
236-
eventHandler,
237-
new object[] {
231+
object eventHandler = scope.ServiceProvider.GetRequiredService(eventHandleType);
232+
if (eventHandler == null)
233+
{
234+
throw new InvalidOperationException(eventHandleType.Name);
235+
}
236+
Type concreteType = typeof(IEventHandler<>).MakeGenericType(eventType);
237+
await (Task)concreteType.GetMethod(nameof(IEventHandler<IEvent>.Handle)).Invoke(
238+
eventHandler,
239+
new object[] {
238240
Activator.CreateInstance(typeof(EventHandlerArgs<>).MakeGenericType(eventType), new object[] { body, args.Redelivered, args.Exchange, args.RoutingKey })
239-
});
241+
});
242+
}
240243
}
241244
}
242245
}

src/RabbitMQ.EventBus.AspNetCore/Extensions/ServiceCollectionExtensions.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using RabbitMQ.EventBus.AspNetCore.Factories;
99
using RabbitMQ.EventBus.AspNetCore.Modules;
1010
using System;
11+
using System.Linq;
1112

1213
namespace Microsoft.Extensions.DependencyInjection
1314
{
@@ -60,10 +61,12 @@ public static void RabbitMQEventBusAutoSubscribe(this IApplicationBuilder app)
6061
logger.LogInformation($"=======================================================================");
6162
foreach (Type mType in typeof(IEvent).GetAssemblies())
6263
{
63-
foreach (Type hType in typeof(IEventHandler<>).GetMakeGenericType(mType))
64+
var handlesAny = typeof(IEventHandler<>).GetMakeGenericType(mType);
65+
if (handlesAny.Any())
6466
{
65-
logger.LogInformation($"{mType.Name}\t=>\t{hType.Name}");
66-
eventBus.Subscribe(mType, hType);
67+
68+
logger.LogInformation($"{mType.Name}\t=>\t{string.Join("、", handlesAny)}");
69+
eventBus.Subscribe(mType);
6770
}
6871
}
6972
logger.LogInformation($"=======================================================================");

src/RabbitMQ.EventBus.AspNetCore/IRabbitMQEventBus.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,14 @@ public interface IRabbitMQEventBus
2525
/// <typeparam name="TEvent">消息体</typeparam>
2626
/// <typeparam name="THandler">消息处理</typeparam>
2727
/// <param name="type">消息类型</param>
28-
void Subscribe<TEvent, THandler>(string type = ExchangeType.Topic)
29-
where TEvent : IEvent
30-
where THandler : IEventHandler<TEvent>;
28+
//void Subscribe<TEvent, THandler>(string type = ExchangeType.Topic)
29+
// where TEvent : IEvent
30+
// where THandler : IEventHandler<TEvent>;
3131
/// <summary>
3232
/// 订阅消息
3333
/// </summary>
3434
/// <param name="eventType">消息体</param>
35-
/// <param name="eventHandleType">消息处理</param>
3635
/// <param name="type">消息类型</param>
37-
void Subscribe(Type eventType, Type eventHandleType, string type = ExchangeType.Topic);
36+
void Subscribe(Type eventType, string type = ExchangeType.Topic);
3837
}
3938
}

0 commit comments

Comments
 (0)