public void TestRouteIsRemoved_BySocketIdentifier() { var logger = new Mock<ILogger>(); var externalRoutingTable = new ExternalRoutingTable(logger.Object); var messageHandlerIdentifier1 = new MessageIdentifier(Message.CurrentVersion, SimpleMessage.MessageIdentity); var messageHandlerIdentifier2 = new MessageIdentifier(Message.CurrentVersion, AsyncMessage.MessageIdentity); var socketIdentifier1 = new SocketIdentifier(Guid.NewGuid().ToByteArray()); var socketIdentifier2 = new SocketIdentifier(Guid.NewGuid().ToByteArray()); var uri1 = new Uri("tcp://127.0.0.1:40"); var uri2 = new Uri("tcp://127.0.0.2:40"); var node1 = new Node(uri1, socketIdentifier1.Identity); var node2 = new Node(uri2, socketIdentifier2.Identity); externalRoutingTable.AddMessageRoute(messageHandlerIdentifier1, socketIdentifier1, uri1); externalRoutingTable.AddMessageRoute(messageHandlerIdentifier2, socketIdentifier1, uri1); externalRoutingTable.AddMessageRoute(messageHandlerIdentifier1, socketIdentifier2, uri2); Assert.AreEqual(node1, externalRoutingTable.FindRoute(messageHandlerIdentifier1)); externalRoutingTable.RemoveNodeRoute(socketIdentifier1); Assert.AreEqual(node2, externalRoutingTable.FindRoute(messageHandlerIdentifier1)); Assert.AreEqual(node2, externalRoutingTable.FindRoute(messageHandlerIdentifier1)); Assert.IsNull(externalRoutingTable.FindRoute(messageHandlerIdentifier2)); }
public void TestTwoExternalRegistrationsForSameMessage_AreReturnedInRoundRobinWay() { var logger = new Mock<ILogger>(); var externalRoutingTable = new ExternalRoutingTable(logger.Object); var messageHandlerIdentifier = new MessageIdentifier(Message.CurrentVersion, SimpleMessage.MessageIdentity); var socketIdentifier1 = new SocketIdentifier(Guid.NewGuid().ToByteArray()); var socketIdentifier2 = new SocketIdentifier(Guid.NewGuid().ToByteArray()); var uri1 = new Uri("tcp://127.0.0.1:40"); var uri2 = new Uri("tcp://127.0.0.2:40"); var node1 = new Node(uri1, socketIdentifier1.Identity); var node2 = new Node(uri2, socketIdentifier2.Identity); externalRoutingTable.AddMessageRoute(messageHandlerIdentifier, socketIdentifier1, uri1); externalRoutingTable.AddMessageRoute(messageHandlerIdentifier, socketIdentifier2, uri2); Assert.AreEqual(node1, externalRoutingTable.FindRoute(messageHandlerIdentifier)); Assert.AreEqual(node2, externalRoutingTable.FindRoute(messageHandlerIdentifier)); Assert.AreEqual(node1, externalRoutingTable.FindRoute(messageHandlerIdentifier)); }
public void TestRemoveMessageRoute_RemovesOnlyProvidedMessageIdentifiers() { var logger = new Mock<ILogger>(); var externalRoutingTable = new ExternalRoutingTable(logger.Object); var messageHandlerIdentifier1 = new MessageIdentifier(Message.CurrentVersion, SimpleMessage.MessageIdentity); var messageHandlerIdentifier2 = new MessageIdentifier(Message.CurrentVersion, AsyncMessage.MessageIdentity); var messageHandlerIdentifier3 = new MessageIdentifier(Message.CurrentVersion, AsyncExceptionMessage.MessageIdentity); var socketIdentifier = new SocketIdentifier(Guid.NewGuid().ToByteArray()); var uri = new Uri("tcp://127.0.0.1:40"); var node = new Node(uri, socketIdentifier.Identity); externalRoutingTable.AddMessageRoute(messageHandlerIdentifier1, socketIdentifier, uri); externalRoutingTable.AddMessageRoute(messageHandlerIdentifier2, socketIdentifier, uri); externalRoutingTable.AddMessageRoute(messageHandlerIdentifier3, socketIdentifier, uri); Assert.AreEqual(node, externalRoutingTable.FindRoute(messageHandlerIdentifier3)); externalRoutingTable.RemoveMessageRoute(new[] {messageHandlerIdentifier2, messageHandlerIdentifier3}, socketIdentifier); Assert.AreEqual(node, externalRoutingTable.FindRoute(messageHandlerIdentifier1)); Assert.IsNull(externalRoutingTable.FindRoute(messageHandlerIdentifier2)); Assert.IsNull(externalRoutingTable.FindRoute(messageHandlerIdentifier3)); }
private IEnumerable<MessageIdentifier> UpdateLocalRoutingTable(RegisterInternalMessageRouteMessage payload, SocketIdentifier socketIdentifier) { var handlers = new List<MessageIdentifier>(); foreach (var registration in payload.MessageContracts) { try { var messageIdentifier = new MessageIdentifier(registration.Version, registration.Identity); internalRoutingTable.AddMessageRoute(messageIdentifier, socketIdentifier); handlers.Add(messageIdentifier); } catch (Exception err) { logger.Error(err); } } return handlers; }
private bool RegisterInternalMessageRoutes(IMessage message) { var shouldHandle = IsInternalMessageRoutingRegistration(message); if (shouldHandle) { var payload = message.GetPayload<RegisterInternalMessageRouteMessage>(); var handlerSocketIdentifier = new SocketIdentifier(payload.SocketIdentity); var handlers = UpdateLocalRoutingTable(payload, handlerSocketIdentifier); clusterMonitor.RegisterSelf(handlers); } return shouldHandle; }
private bool RegisterExternalRoutes(IMessage message, ISocket scaleOutBackend) { var shouldHandle = IsExternalRouteRegistration(message); if (shouldHandle) { var payload = message.GetPayload<RegisterExternalMessageRouteMessage>(); var handlerSocketIdentifier = new SocketIdentifier(payload.SocketIdentity); var uri = new Uri(payload.Uri); foreach (var registration in payload.MessageContracts) { try { var messageHandlerIdentifier = new MessageIdentifier(registration.Version, registration.Identity); externalRoutingTable.AddMessageRoute(messageHandlerIdentifier, handlerSocketIdentifier, uri); scaleOutBackend.Connect(uri); } catch (Exception err) { logger.Error(err); } } } return shouldHandle; }
public void TestMessageIsRouted_BasedOnHandlerIdentities() { var actorSocketIdentity = new SocketIdentifier(Guid.NewGuid().ToString().GetBytes()); var actorIdentifier = new MessageIdentifier(Message.CurrentVersion, SimpleMessage.MessageIdentity); var messageHandlerStack = new Mock<IInternalRoutingTable>(); messageHandlerStack.Setup(m => m.FindRoute(It.Is<MessageIdentifier>(mhi => mhi.Equals(actorIdentifier)))) .Returns(actorSocketIdentity); var router = new MessageRouter(socketFactory.Object, messageHandlerStack.Object, new ExternalRoutingTable(logger), routerConfiguration, clusterMonitor.Object, messageTracer.Object, logger); try { StartMessageRouter(router); var message = Message.Create(new SimpleMessage(), SimpleMessage.MessageIdentity); messageRouterSocketFactory.GetRouterSocket().DeliverMessage(message); Thread.Sleep(AsyncOpCompletionDelay); messageHandlerStack.Verify(m => m.FindRoute(It.Is<MessageIdentifier>(mhi => mhi.Equals(actorIdentifier))), Times.Once()); } finally { router.Stop(); } }