private StitchDataMessage AddressInstanceMessage(StitchDataMessage message) { var fullToId = new StitchFullId(message.ToNodeId, message.ToStitchInstanceId); IEnumerable <StitchSummary> query = _stitches; var toNodeId = message.ToNodeId; if (string.IsNullOrEmpty(toNodeId) && !fullToId.IsLocalOnly) { toNodeId = fullToId.NodeId; } if (!string.IsNullOrEmpty(toNodeId)) { query = query.Where(s => s.NodeId == toNodeId); } var stitch = query.FirstOrDefault(si => si.Id == fullToId.StitchInstanceId); if (stitch == null) { return(null); } message.ToNodeId = stitch.NodeId; message.ToNetworkId = stitch.NetworkNodeId; return(message); }
private IEnumerable <StitchDataMessage> AddressApplicationMessage(StitchDataMessage message) { var messages = new List <StitchDataMessage>(); var groupName = new StitchGroupName(message.ToStitchGroup); var stitches = _stitches .Where(si => groupName.Contains(si.GroupName)) .Where(si => si.Id != message.FromStitchInstanceId) .ToList(); foreach (var stitch in stitches) { messages.Add(new StitchDataMessage { // Leave the ToNodeID and NetworkID empty, so it gets routed locally Data = message.Data, ToStitchInstanceId = stitch.Id, FromNetworkId = message.FromNetworkId, FromNodeId = message.FromNodeId, FromStitchInstanceId = message.FromStitchInstanceId, ToNetworkId = stitch.NetworkNodeId, ToNodeId = stitch.NodeId }); } return(messages); }
public IEnumerable <StitchDataMessage> AddressMessage(StitchDataMessage message) { // TODO: Some kind of validation that we have all the necessary fields. var fullFromId = message.GetSenderId(); return(AddressMessageInternal(message) .Where(s => new StitchFullId(s.ToNodeId, s.ToStitchInstanceId).FullId != fullFromId.FullId)); }
public InstanceActionResult SendDataMessage(StitchFullId fullStitchId, StitchDataMessage message) { var adaptor = _adaptors.Get(fullStitchId.StitchInstanceId); if (adaptor == null) { return(InstanceActionResult.NotFound(fullStitchId.StitchInstanceId)); } adaptor.SendMessage(message.Id, message.DataChannelName, message.Data, message.FromNodeId, message.FromStitchInstanceId); return(InstanceActionResult.Result(fullStitchId.StitchInstanceId, true)); }
private IEnumerable <StitchDataMessage> AddressMessageInternal(StitchDataMessage message) { if (!string.IsNullOrEmpty(message.ToStitchInstanceId)) { message = AddressInstanceMessage(message); return(message == null?Enumerable.Empty <StitchDataMessage>() : new[] { message }); } if (!string.IsNullOrEmpty(message.ToStitchGroup)) { return(AddressApplicationMessage(message)); } return(Enumerable.Empty <StitchDataMessage>()); }
public void AddressMessage_NoAddressee() { var target = CreateTarget(); var message = new StitchDataMessage { Data = "ABC", FromNodeId = "FromNode1", FromStitchInstanceId = "FromStitch1" }; var result = target.AddressMessage(message).OrderBy(si => si.Id).ToList(); result.Count.Should().Be(0); }
public void AddressMessage_Instance_NotFound() { var target = CreateTarget(); var message = new StitchDataMessage { ToStitchInstanceId = "XXX", Data = "ABC", FromNodeId = "FromNode1", FromStitchInstanceId = "FromStitch1" }; var result = target.AddressMessage(message).ToList(); result.Count.Should().Be(0); }
public void SendStitchData(StitchDataMessage message, bool remote) { if (remote) { var envelope = new ClusterMessageBuilder() .ToNode(message.ToNetworkId) .FromNode() .WithObjectPayload(message) .Build(); _messageBus.Publish(ClusterMessage.SendEventName, envelope); } else { _messageBus.Publish(StitchDataMessage.ChannelSendLocal, message); } }
public void AddressMessage_Instance_FullToId() { var target = CreateTarget(); var message = new StitchDataMessage { ToStitchInstanceId = "1:1", Data = "ABC", FromNodeId = "FromNode1", FromStitchInstanceId = "FromStitch1" }; var result = target.AddressMessage(message).ToList(); result.Count.Should().Be(1); result[0].ToNodeId.Should().Be("1"); result[0].ToNetworkId.Should().Be("1N"); result[0].Data.Should().Be("ABC"); }
public void EnrichStitchDataMessageWithAddress(StitchDataMessage message) { message.FromNodeId = _core.NodeId; message.FromNetworkId = _networkNodeId; var stitches = _data.GetAllStitchSummaries(); var messages = new DataMessageAddresser(stitches).AddressMessage(message); foreach (var outMessage in messages) { bool isRemote = !string.IsNullOrEmpty(outMessage.ToNodeId) && outMessage.ToNodeId != _core.NodeId; _stitches.SendStitchData(outMessage, isRemote); if (isRemote) { _log.LogDebug("Routing StitchDataMessage to node Id={0}, StitchId={1}", outMessage.ToNodeId, outMessage.ToStitchInstanceId); } } }
public void SendDataMessageToStitch(StitchDataMessage message) { var fullStitchId = message.GetRecipientId(); if (!fullStitchId.IsLocalOnly && fullStitchId.NodeId != _core.NodeId) { _log.LogWarning("Received message for stitch on the wrong node NodeId={0}", fullStitchId.NodeId); } var result = _stitchInstanceManager.SendDataMessage(fullStitchId, message); if (result.Success) { _log.LogDebug("Sent message Id={0} to StitchInstanceId={1}", message.Id, fullStitchId.StitchInstanceId); } else { _log.LogWarning("Could not deliver message Id={0} to StitchInstanceId={1}", message.Id, fullStitchId.StitchInstanceId); } }
public void AddressMessage_Group() { var target = CreateTarget(); var message = new StitchDataMessage { ToStitchGroup = "A.B.1", Data = "ABC", FromNodeId = "FromNode1", FromStitchInstanceId = "FromStitch1" }; var result = target.AddressMessage(message).OrderBy(si => si.Id).ToList(); result.Count.Should().Be(2); result[0].ToStitchInstanceId.Should().Be("1"); result[0].ToNodeId.Should().Be("1"); result[0].ToNetworkId.Should().Be("1N"); result[1].ToStitchInstanceId.Should().Be("3"); result[1].ToNodeId.Should().Be("2"); result[1].ToNetworkId.Should().Be("2N"); }