Beispiel #1
0
        /// <summary>
        /// 通过模式2提交到监听者
        /// 通过HTTP协议Post消息到ListenerWebUrl的web接口,提交的对象类型为SMessagePostData
        /// 其中Signature为Id+Type+Data+CurrentTime的字符串格式(yyyy-MM-dd hh:mm:ss)通过ListenerWebSignature签名后的字符串
        /// 接收方需要对此进行校验
        /// </summary>
        /// <param name="listener"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        private async Task <ValidateResult> PostToListenerByMode2(SMessageTypeListener listener, SMessage message)
        {
            ValidateResult result = new ValidateResult()
            {
                Result = true
            };
            var expireTime        = DateTime.UtcNow.AddSeconds(300);
            var strContent        = $"{message.ID.ToString()}{message.Type}{message.Data}{expireTime.ToString("yyyy-MM-dd hh:mm:ss")}";
            var strSignature      = _securityService.SignByKey(strContent, listener.ListenerWebSignature);
            SMessagePostData data = new SMessagePostData()
            {
                ID         = message.ID,
                ExpireTime = expireTime,
                Type       = message.Type,
                Data       = message.Data,
                Signature  = strSignature
            };

            try
            {
                await HttpClinetHelper.PostAsync(data, listener.ListenerWebUrl);
            }
            catch (Exception ex)
            {
                result.Result      = false;
                result.Description = ex.Message;
            }

            return(result);
        }
Beispiel #2
0
 public async Task <ValidateResult> PostToListener(SMessageTypeListener listener, SMessage message)
 {
     //检查监听者模式
     //不同的模式执行不同的处理
     if (listener.Mode == 0)
     {
         return(await PostToListenerByMode1(listener, message));
     }
     else
     {
         return(await PostToListenerByMode2(listener, message));
     }
 }
Beispiel #3
0
        /// <summary>
        /// 通过模式1提交到监听者
        /// 检查是否在缓存中已经存在相应的工厂类,
        //  如果不存在,根据ListenerFactoryTypeUseDI决定是通过DIContainerContainer获取工厂类,
        //  还是使用反射创建工厂类
        //  将创建出来的工厂类缓存在缓存中
        /// </summary>
        /// <param name="listener"></param>
        /// <param name="message"></param>
        /// <returns></returns>
        private async Task <ValidateResult> PostToListenerByMode1(SMessageTypeListener listener, SMessage message)
        {
            if (!_listenerFactorys.TryGetValue(listener.ListenerFactoryType, out IFactory <ISMessageListener> listenerFactory))
            {
                lock (_listenerFactorys)
                {
                    Type listenerFactoryType = Type.GetType(listener.ListenerFactoryType);

                    if (!_listenerFactorys.TryGetValue(listener.ListenerFactoryType, out listenerFactory))
                    {
                        object objListenerFactory;
                        if (listener.ListenerFactoryTypeUseDI == true)
                        {
                            //通过DI容器创建
                            //objListenerFactory = DIContainerContainer.Get(listenerFactoryType);
                            objListenerFactory = DIContainerGetHelper.Get().Get(listenerFactoryType);
                        }
                        else
                        {
                            //通过反射创建
                            objListenerFactory = listenerFactoryType.Assembly.CreateInstance(listenerFactoryType.FullName);
                        }

                        if (!(objListenerFactory is IFactory <ISMessageListener>))
                        {
                            var fragment = new TextFragment()
                            {
                                Code = TextCodes.SMessageTypeListenerTypeError,
                                DefaultFormatting = "消息类型{0}中,名称为{1}的监听者工厂的类型{2}未实现接口IFactory<ISMessageListener>",
                                ReplaceParameters = new List <object>()
                                {
                                    listener.MessageType.Name, listener.Name, listener.ListenerFactoryType
                                }
                            };

                            throw new UtilityException((int)Errors.SMessageTypeListenerTypeError, fragment);
                        }

                        listenerFactory = (IFactory <ISMessageListener>)objListenerFactory;
                        _listenerFactorys.Add(listener.ListenerFactoryType, listenerFactory);
                    }
                }
            }

            var listenerObj = listenerFactory.Create();

            return(await listenerObj.Execute(message));
        }
Beispiel #4
0
 public async Task <string> Generate(string originalMessageKey, SMessageTypeListener listener)
 {
     return($"{listener.QueueGroupName}-{originalMessageKey}");
 }