创建**App.Shared**类库,并引入Volo.Abp.EventBus。引入这个库是因为要使用EventNameAttribute,设置事件名称,如果不声明,事件名称将是包含命名空间的事件类的全名。相当于RabbitMq里面的RoutingKey

    1. using System;
    2. using Volo.Abp.EventBus;
    3. namespace App.Shared
    4. {
    5. [Serializable]
    6. [EventName("Test.App1ToApp2")]
    7. public class App1ToApp2Eto
    8. {
    9. public string Message { get; set; }
    10. public App1ToApp2Eto() { }
    11. public App1ToApp2Eto(string message)
    12. {
    13. Message = message;
    14. }
    15. }
    16. }
    1. using System;
    2. using Volo.Abp.EventBus;
    3. namespace App.Shared
    4. {
    5. [Serializable]
    6. [EventName("Test.App2ToApp1")]
    7. public class App2ToApp1Eto
    8. {
    9. public string Message { get; set; }
    10. public App2ToApp1Eto() { }
    11. public App2ToApp1Eto(string message)
    12. {
    13. Message = message;
    14. }
    15. }
    16. }

    创建**App1**控制台项目。
    引入包Volo.Abp.EventBus.RabbitMQVolo.Abp.Autofac
    创建启动Module

    1. using Volo.Abp.Autofac;
    2. using Volo.Abp.EventBus.RabbitMq;
    3. using Volo.Abp.Modularity;
    4. using Volo.Abp.RabbitMQ;
    5. namespace App1;
    6. [DependsOn(
    7. typeof(AbpAutofacModule),
    8. typeof(AbpEventBusRabbitMqModule)
    9. )]
    10. public class App1Module : AbpModule
    11. {
    12. public override void ConfigureServices(ServiceConfigurationContext context)
    13. {
    14. // 如果不配置默认本地
    15. Configure<AbpRabbitMqOptions>(options =>
    16. {
    17. options.Connections.Default.UserName = "UserName";
    18. options.Connections.Default.Password = "Password";
    19. options.Connections.Default.HostName = "HostName";
    20. options.Connections.Default.Port = 5672;
    21. });
    22. Configure<AbpRabbitMqEventBusOptions>(options =>
    23. {
    24. options.ClientName = "App1";
    25. options.ExchangeName = "TestMessageing";
    26. });
    27. }
    28. }

    如果不设置AbpRabbitMqOptions,则会走默认的本地配置,账号也是默认的guest账号。
    Program类中设置启动项。

    1. using Microsoft.Extensions.DependencyInjection;
    2. using Volo.Abp;
    3. namespace App1;
    4. internal class Program
    5. {
    6. static async Task Main(string[] args)
    7. {
    8. using var app = AbpApplicationFactory.Create<App1Module>(options =>
    9. {
    10. options.UseAutofac();
    11. });
    12. await app.InitializeAsync();
    13. var service = app.ServiceProvider.GetRequiredService<App1MessagingService>();
    14. await service.RunAsync();
    15. await app.ShutdownAsync();
    16. }
    17. }

    这里的App1MessagingService类,是利用控制台,接受输入的消息,进行发送事件。

    1. using App.Shared;
    2. using Volo.Abp.DependencyInjection;
    3. using Volo.Abp.EventBus.Distributed;
    4. namespace App1;
    5. public class App1MessagingService : ITransientDependency
    6. {
    7. private readonly IDistributedEventBus _distributedEventBus;
    8. public App1MessagingService(IDistributedEventBus distributedEventBus)
    9. {
    10. _distributedEventBus = distributedEventBus;
    11. }
    12. public async Task RunAsync()
    13. {
    14. string message;
    15. do
    16. {
    17. Console.Write("App1请发送消息:");
    18. message = Console.ReadLine();
    19. await _distributedEventBus.PublishAsync(new App1ToApp2Eto(message));
    20. } while (message != "exit");
    21. }
    22. }

    有发送就有接收,**App1**项目接收**App2**发送的事件。

    1. using App.Shared;
    2. using Volo.Abp.DependencyInjection;
    3. using Volo.Abp.EventBus.Distributed;
    4. namespace App1;
    5. public class App1EventHandler : IDistributedEventHandler<App2ToApp1Eto>, ITransientDependency
    6. {
    7. public Task HandleEventAsync(App2ToApp1Eto eventData)
    8. {
    9. Console.WriteLine();
    10. Console.WriteLine("App1收到消息:" + eventData.Message);
    11. return Task.CompletedTask;
    12. }
    13. }

    创建App2和App1大体一样。
    整体项目结构。
    image.png
    将两个项目启动,并测试。
    image.png
    image.png
    image.png

    AbpRabbitMq.7z