private IMessageChannel ResolveErrorChannel(IMessage failedMessage)
        {
            if (_defaultErrorChannel == null && _channelResolver != null)
            {
                _defaultErrorChannel = _channelResolver.ResolveChannelName(IntegrationContextUtils.ErrorChannelObjectName);
            }

            if (failedMessage == null || failedMessage.Headers.ErrorChannel == null)
            {
                return(_defaultErrorChannel);
            }

            IMessageChannel errorChannel = failedMessage.Headers.ErrorChannel as IMessageChannel;

            if (errorChannel != null)
            {
                return(errorChannel);
            }

            string errorChannelName = failedMessage.Headers.ErrorChannel as string;

            if (errorChannelName == null)
            {
                throw new ArgumentException("Unsupported error channel header type. Expected IMessageChannel or string");
            }

            if (_channelResolver == null)
            {
                throw new ApplicationException("channelResolver must not be null");
            }

            return(_channelResolver.ResolveChannelName(errorChannelName));
        }
 private void AddChannel(object channelOrName, ICollection <IMessageChannel> channels)
 {
     if (channelOrName == null)
     {
         return;
     }
     if (channelOrName is IMessageChannel)
     {
         channels.Add((IMessageChannel)channelOrName);
     }
     else if (channelOrName is string)
     {
         string channelName = (string)channelOrName;
         AssertUtils.State(_channelResolver != null, "unable to resolve channel names, no ChannelResolver available");
         IMessageChannel channel = _channelResolver.ResolveChannelName(channelName);
         if (channel == null)
         {
             throw new MessagingException("failed to resolve channel name '" + channelName + "'");
         }
         channels.Add(channel);
     }
     else
     {
         throw new MessagingException("unsupported return type for router [" + channelOrName.GetType() + "]");
     }
 }
        private IMessageChannel ResolveReplyChannel(IMessage requestMessage)
        {
            IMessageChannel replyChannel = OutputChannel;

            if (replyChannel == null)
            {
                object replyChannelHeader = requestMessage.Headers.ReplyChannel;
                if (replyChannelHeader != null)
                {
                    if (replyChannelHeader is IMessageChannel)
                    {
                        replyChannel = (IMessageChannel)replyChannelHeader;
                    }
                    else if (replyChannelHeader is string)
                    {
                        if (_channelResolver == null)
                        {
                            throw new InvalidOperationException("ChannelResolver is required for resolving a reply channel by name");
                        }

                        replyChannel = _channelResolver.ResolveChannelName((string)replyChannelHeader);
                    }
                    else
                    {
                        throw new ChannelResolutionException("expected a IMessageChannel or string for 'replyChannel', but type is [" + replyChannelHeader.GetType() + "]");
                    }
                }
            }
            if (replyChannel == null)
            {
                throw new ChannelResolutionException("unable to resolve reply channel for message: " + requestMessage);
            }
            return(replyChannel);
        }
示例#4
0
        protected override ICollection <IMessageChannel> DetermineTargetChannels(IMessage message)
        {
            AfterPropertiesSet();
            ICollection <IMessageChannel> channels = new List <IMessageChannel>();

            string[] channelNames = DetermineTargetChannelNames(message);
            if (channelNames == null)
            {
                return(null);
            }
            foreach (string channelName in channelNames)
            {
                if (channelName == null)
                {
                    continue;
                }
                if (_channelResolver == null)
                {
                    throw new InvalidOperationException("unable to resolve channel names, no ChannelResolver available");
                }

                string name = channelName;
                if (_prefix != null)
                {
                    name = _prefix + name;
                }
                if (_suffix != null)
                {
                    name = name + _suffix;
                }
                IMessageChannel channel = _channelResolver.ResolveChannelName(name);
                if (channel == null)
                {
                    throw new MessagingException(message, "failed to resolve channel name '" + name + "'");
                }
                channels.Add(channel);
            }
            return(channels);
        }