async Task Startup() { try { await _context.TransportProvider.StartupTask.OrCanceled(Stopping).ConfigureAwait(false); await _context.Dependencies.OrCanceled(Stopping).ConfigureAwait(false); var hostNodeContext = _context.TransportProvider.HostNodeContext; var queue = _context.MessageFabric.GetQueue(hostNodeContext, _queueName); IDeadLetterTransport deadLetterTransport = new GrpcDeadLetterTransport(_context.MessageFabric.GetExchange(hostNodeContext, $"{_queueName}_skipped")); _context.AddOrUpdatePayload(() => deadLetterTransport, _ => deadLetterTransport); IErrorTransport errorTransport = new GrpcErrorTransport(_context.MessageFabric.GetExchange(hostNodeContext, $"{_queueName}_error")); _context.AddOrUpdatePayload(() => errorTransport, _ => errorTransport); _context.ConfigureTopology(hostNodeContext); _topologyHandle = queue.ConnectMessageReceiver(hostNodeContext, this); await _context.TransportObservers.Ready(new ReceiveTransportReadyEvent(_context.InputAddress)); } catch (Exception exception) { SetNotReady(exception); throw; } }
TopologyHandle Send(NodeContext context, Topology topology, TopologyHandle handle = default) { try { handle = _hostNode.AddTopology(topology, handle); var transportMessage = new TransportMessage { MessageId = NewId.NextGuid().ToString(), Topology = topology }; foreach (var node in _nodes.Where(x => x.NodeAddress != context.NodeAddress)) { if (!node.Writer.TryWrite(transportMessage)) { LogContext.Error?.Log("Failed to Send Topology {Topology} to {Address}", topology.ChangeCase, node.NodeAddress); } } return(handle); } catch (Exception exception) { LogContext.Error?.Log(exception, "Failed to send topology message"); throw; } }
public TopologyHandle ConsumerConnected(NodeContext context, TopologyHandle handle, string queueName) { All(x => { handle = x.ConsumerConnected(context, handle, queueName); return(true); }); return(handle); }
public TopologyHandle ConsumerConnected(NodeContext context, TopologyHandle handle, string queueName) { if (context.NodeType != NodeType.Host) { return(handle); } return(Send(context, new Topology { Receiver = new Receiver { QueueName = queueName, ReceiverId = handle.Id } }, handle)); }
public TopologyHandle Add(Topology topology, TopologyHandle handle) { if (topology == null) { throw new ArgumentNullException(nameof(topology)); } lock (_entries) { var sequenceNumber = ++_nextSequenceNumber; topology.SequenceNumber = sequenceNumber; var entry = new TopologyEntry(topology, handle); _entries.Add(sequenceNumber, entry); return(entry); } }
public TopologyEntry(Topology topology, TopologyHandle handle) { _handle = handle; Topology = topology; }
public TopologyHandle AddTopology(Topology topology, TopologyHandle handle) { return(_hostTopology.Add(topology, handle)); }