Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Diagnostics;
- using Akka.Actor;
- namespace TestMonitoring
- {
- public interface IMonitorActor
- {
- ActorTask OnStartReceive(string actorTypeName, string actorPath, object message);
- void OnFinishReceive(ActorTask actorTask);
- }
- public class ConsoleMonitorActor : IMonitorActor
- {
- public ActorTask OnStartReceive(string actorTypeName, string actorPath, object message)
- {
- var actorTask = new ActorTask(Guid.NewGuid().ToString("N"), Stopwatch.StartNew());
- Console.WriteLine($"MonitorActor => {actorTypeName} - OnStartReceive: {message} - TaskId: {actorTask.TaskId}");
- return actorTask;
- }
- public void OnFinishReceive(ActorTask actorTask)
- {
- actorTask.Stopwatch.Stop();
- Console.WriteLine($"MonitorActor => OnFinishReceive: {actorTask.Stopwatch.Elapsed}");
- }
- }
- public sealed class ActorTask
- {
- public ActorTask(string taskId, Stopwatch stopwatch)
- {
- TaskId = taskId;
- Stopwatch = stopwatch;
- }
- public string TaskId { get; }
- public Stopwatch Stopwatch { get; }
- }
- public abstract class MonitoredReceiveActor : ReceiveActor
- {
- private readonly IMonitorActor _monitorActor;
- protected MonitoredReceiveActor(IMonitorActor monitorActor)
- {
- _monitorActor = monitorActor;
- }
- protected void MonitoredReceive<T>(Action<T> action)
- {
- Receive<T>(value =>
- {
- var actorTask = _monitorActor.OnStartReceive(nameof(MonitoredReceiveActor), Self.Path.ToString(), value);
- action(value);
- _monitorActor.OnFinishReceive(actorTask);
- });
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement