Using Message Queue

InfinniPlatform has an abstraction for work with message queue. Currently there is one implementation based on RabbitMQ. To use this implementation you need to make next steps.

1. Install Erlang

2. Install RabbitMQ

3. Install InfinniPlatform.MessageQueue.RabbitMQ package:

dotnet add package InfinniPlatform.MessageQueue.RabbitMQ -s https://www.myget.org/F/infinniplatform/

4. Call AddRabbitMqMessageQueue() in ConfigureServices():

 using System;

 using InfinniPlatform.AspNetCore;

 using Microsoft.Extensions.DependencyInjection;

 public class Startup
 {
     public IServiceProvider ConfigureServices(IServiceCollection services)
     {
         services.AddRabbitMqMessageQueue();

         // ...

         return services.BuildProvider();
     }

     // ...
 }

Using Task Queue

To send messages in a task queue use the ITaskProducer interface:

 public class MyMessage
 {
     // ...
 }

 public class MyComponent
 {
     private readonly ITaskProducer _producer;

     public MyComponent(ITaskProducer producer)
     {
         _producer = producer;
     }

     public async Task DoSomething(MyMessage message)
     {
         MyMessage message;

         // ...

         await _producer.PublishAsync(message);

         // ...
     }
 }

To receive messages from a task queue implement the ITaskConsumer interface:

 public class MyConsumer : TaskConsumerBase<MyMessage>
 {
     protected override async Task Consume(Message<MyMessage> message)
     {
         // Message handling
     }
 }

Consumers of the task queue must be registered in IoC-container:

builder.RegisterType<MyConsumer>().As<ITaskConsumer>().SingleInstance();

Using Broadcast Queue

To send messages in a broadcast queues use the IBroadcastProducer interface:

 public class MyMessage
 {
     // ...
 }

 public class MyComponent
 {
     private readonly IBroadcastProducer _producer;

     public MyComponent(IBroadcastProducer producer)
     {
         _producer = producer;
     }

     public async Task DoSomething(MyMessage message)
     {
         MyMessage message;

         // ...

         await _producer.PublishAsync(message);

         // ...
     }
 }

To receive messages from a broadcast queues implement the IBroadcastConsumer interface:

 public class MyConsumer : BroadcastConsumerBase<MyMessage>
 {
     protected override async Task Consume(Message<MyMessage> message)
     {
         // Message handling
     }
 }

Consumers of the broadcast queues must be registered in IoC-container:

builder.RegisterType<MyConsumer>().As<IBroadcastConsumer>().SingleInstance();