MetaPubSub
is an implementation of the publish/subscribe pattern - when the publisher and subscriber know nothing of each other but can exchange messages. It's fast, lightweight and beside basic functionality has some cool features:
- interprocess communication - messages can be sent between different processes and computers
- awaitable methods, for example, you can await
Publish
and wait until all subscribers have finished processing the message - at least once delivery check - you can opt in to have an exception if no one subscribed to your message
- message filtering - you can define a predicate to subscribe only those messages you want to process
- timeout to wait for a subscriber - your message can be queued and wait until someone subscribed and processed it
- scheduling a message - your message can be queued and published after a time delay
- request-response pattern - send a message and wait for the response as a single awaitable method, without need to
Subscribe/Unsubscribe
to the response message - cancellation token support - you can cancel scheduling or waiting for the message
- exceptions handling - all exceptions raised when a message processing by subscribers can be caught by the publisher as an
AggregateException
MetaPipeServer
and MetaPipeConnection
are used to simplify inter-process communication using named pipes. The module utilizes NamedPipeServerStream
and NamedPipeClientStream
for message transmission. System.Text.Json
is used for object serialization before sending. The main features of the module include:
- automatic connection recovery in case of disconnection
- transmission of strings, byte arrays, and arbitrary objects
- sending an arbitrary object and waiting for the response in a single method call.
PubSubPipe
extends the capabilities of the MetaPubSub
module by adding the ability to exchange messages between processes or computers.
StateMachine
is a simple and easy to use state machine implementation. It is thread-safe and can be used in a concurrent environment. See the implementation of the MetaPipeConnection
class for an example of usage.
To install the Meta.Lib run the following command:
PM> Install-Package Meta.Lib
Note: this version has breaking changes. See migration guide.
- MetaPubSub has been separated into three modules - local
PubSub
,Pipe
, andPubSubPipe
.PubSub
– is a local publisher/subscriber implementation.Pipe
– is a wrapper onNamedPipeServerStream
andNamedPipeClientStream
to simplify interprocess communication.PubSubPipe
– is a wrapper on bothPubSub
andPipe
which adds interprocess communication ability forPubSub
viaPipe
. - Added
ConcurrentStateMachine
. - Custom
Logger
implementation replaced withILogger
from theMicrosoft.Extensions.Logging
namespace. - Removed
IPubSubMessage
interface. You don't need to derive your message classes from this interface anymore. - Performance improvements.
Note: this version has breaking changes.
IPubSubMessage.Timeout
renamed toWaitForSubscriberTimeout
.- Added
IPubSubMessage.ResponseTimeout
- Time interval during which the response message must be received otherwise theTimeoutException
will be thrown. Used inIMetaPubSub.Process()
andIMetaPubSub.ProcessOnServer()
. - Removed parameter
millisecondsTimeout
fromIMetaPubSub.Process()
andIMetaPubSub.ProcessOnServer()
. UseIPubSubMessage.ResponseTimeout
instead. - Fixed bug: timeout in
IMetaPubSub.Process()
andIMetaPubSub.ProcessOnServer()
always use it's default value of 5 sec.
- Added
TryConnectToServer
&TrySubscribeOnServer
. - Added a match predicate to
SubscribeOnServer
method. - Added
Connected/Disconnected
built-in messages. - Added a delegate method to create a pipe with non-default parameters.
- Interprocess communication implemented.