/// <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); }
public async Task <ValidateResult> PostToListener(SMessageTypeListener listener, SMessage message) { //检查监听者模式 //不同的模式执行不同的处理 if (listener.Mode == 0) { return(await PostToListenerByMode1(listener, message)); } else { return(await PostToListenerByMode2(listener, message)); } }
/// <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)); }
public async Task <string> Generate(string originalMessageKey, SMessageTypeListener listener) { return($"{listener.QueueGroupName}-{originalMessageKey}"); }