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));
        }
Exemplo n.º 5
0
        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);
            }
        }
Exemplo n.º 6
0
            public TopologyEntry(Topology topology, TopologyHandle handle)
            {
                _handle = handle;

                Topology = topology;
            }
Exemplo n.º 7
0
 public TopologyHandle AddTopology(Topology topology, TopologyHandle handle)
 {
     return(_hostTopology.Add(topology, handle));
 }