/// <summary>
        /// Convert message off the wire from byte[] into a concrete implementation of IIntegrationMessage
        /// delegates to custom extractors and defaults to Json deserialization
        /// </summary>
        private IIntegrationMessage _extractMessage(byte[] messageData, MessageTypeProperties props)
        {
            IIntegrationMessage message;

            if (props.HasCustomExtractor)
            {
                IMessageExtractor extractor = null;
                if (_messageExtractorCache.ContainsKey(props.MessageTypeIdentifier))
                {
                    extractor = _messageExtractorCache[props.MessageTypeIdentifier];
                }
                else
                {
                    extractor = (IMessageExtractor)Activator.CreateInstance(props.Type, true);
                    _messageExtractorCache.Add(props.MessageTypeIdentifier, extractor);
                }
                message = extractor.Extract(messageData);
            }
            else
            {
                //by default the message is json and will be deserialized to the type with a matching MessageTypeIdentifier property:"MessageType"
                var json = Encoding.UTF8.GetString(messageData);
                message = (IIntegrationMessage)JsonConvert.DeserializeObject(json, props.Type, _serializerSettings);
            }
            return(message);
        }