예제 #1
0
        protected TcpConnection(Action onConnectedCallback = null)
        {
            Socket = new TcpSocket(AddressFamily.InterNetwork)
            {
                NoDelay = true
            };

            OnConnected       = onConnectedCallback;
            _incomingPipeline = new IncomingMessagePipeline(this, _cts.Token);
            _outboundPipeline = new OutboundMessagePipeline(this, _cts.Token);

            _incomingPipeline.Start();
            _outboundPipeline.Start();
        }
예제 #2
0
        public Task Dispatch(IIntegrationMessage message, MessageMetaData metaData, IEndpoint endpoint, IOutboxSession outboxSession = null)
        {
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            if (endpoint == null)
            {
                throw new ArgumentNullException(nameof(endpoint));
            }

            OutboundMessagePipeline messagePipeline = null;

            if (_endpointOutboundPipeline.ContainsKey(endpoint))
            {
                messagePipeline = _endpointOutboundPipeline[endpoint];
            }
            else
            {
                messagePipeline = new OutboundMessagePipeline(endpoint.Settings.OutboundIntegrationFilters, endpoint.Settings.OutboundTransportFilters);
                _endpointOutboundPipeline[endpoint] = messagePipeline;
            }
            var resultContext = messagePipeline.Process(new IntegrationMessageFilterContext(message, metaData, endpoint, FilterDirection.Outbound, null));

            if (outboxSession != null)//dispatch through the outbox
            {
                OutboxDispatchOptions options = new OutboxDispatchOptions()
                {
                };
                if (metaData != null)
                {
                    if (metaData.DispatchDelay.HasValue && !endpoint.SupportsDelayedDispatch)
                    {
                        options.Delay = metaData.DispatchDelay;
                        options.SkipTransientDispatch = true; // for safety because we set delay
                    }
                    else
                    {
                        options.SkipTransientDispatch = metaData.SkipTransientDispatch;
                    }

                    options.ExpiresAtUtc = metaData.ExpiresAtUtc;
                }
                return(outboxSession.Dispatch(message.MessageType, resultContext.TransportMessage.Data, resultContext.TransportMessage.MetaData, endpoint, options));
            }
            //dispatch to the endpoint
            return(DispatchCore(message.MessageType, resultContext.TransportMessage.Data, resultContext.TransportMessage.MetaData, endpoint));
        }
예제 #3
0
        protected bool Inspect(OutboundMessagePipeline pipeline)
        {
            InsertAfter = (sink => pipeline.ReplaceOutputSink(sink));

            return(false);
        }
예제 #4
0
        public bool Inspect(OutboundMessagePipeline pipeline)
        {
            Append("Pipeline");

            return(true);
        }