예제 #1
0
 public ProducerConfiguration(IDictionary <string, string> configuration, MessageIdGenerator messageIdGenerator, IOutgoingMessageRegistry outgoingMessageRegistry, IKafkaProducerFactory kafkaProducerFactory)
 {
     _configuration          = configuration;
     MessageIdGenerator      = messageIdGenerator;
     OutgoingMessageRegistry = outgoingMessageRegistry;
     KafkaProducerFactory    = kafkaProducerFactory;
 }
예제 #2
0
 internal OutboxQueue(MessageIdGenerator messageIdGenerator, OutgoingMessageRegistry outgoingMessageRegistry, IOutboxEntryRepository repository, IOutboxNotifier outboxNotifier, TopicPayloadSerializerRegistry serializerRegistry)
 {
     _repository               = repository;
     _outboxNotifier           = outboxNotifier;
     _serializerRegistry       = serializerRegistry;
     _payloadDescriptorFactory = new PayloadDescriptorFactory(outgoingMessageRegistry, messageIdGenerator);
 }
        public RpcTransportMessageRequest BuidRpcTransportMessage(LegancyISellerConfiguration configuration)
        {
            string messageId = MessageIdGenerator.CreateMessageId();

            return(new RpcTransportMessageRequest(messageId)
            {
                MessageHeader = new RpcTransportMessageHeader() /*TODO: 请求上下文*/ }
                {
예제 #4
0
        protected async Task <OperationResult <TResult> > SendOperation <TOp, TResult>(TOp operation, IEnumerable <Session> receivers, CancellationToken token) where TOp : IOperation <TResult>
        {
            var description = Model.GetDescriptionBy(typeof(TOp));

            Logger.LogDebug("Start send operation {operation}, code: {code}", operation, description.Code);
            var context = receivers?.FirstOrDefault();
            var op      = new TRequest
            {
                OperationCode = description.Code,
                OperationData = description.UseAsyncSerialize
                    ? await _serializer.SerializeAsync(operation, context)
                    : _serializer.Serialize(operation, context),
                Id = MessageIdGenerator.Generate()
            };

            MessagePlaceHolder?.Fill(ref op, operation);
            op.Type = TypeMessage.Request;

            Logger.LogDebug("Operation serialized {operation}", operation);

            var rawResult = _serializer.Serialize(op, context);

            await SendRequest(receivers, rawResult, description.ForRequest);

            Logger.LogDebug("Operation sent {operation}", operation);

            if (description.WaitResponse)
            {
                using (var composite = CancellationTokenSource.CreateLinkedTokenSource(token, GlobalToken))
                {
                    Task <OperationResult <TResult> > response = null;
                    try
                    {
                        var state = StatesPool.Get();
                        state.Context = context;
                        response      = new Task <OperationResult <TResult> >(OperationResultHandle <TResult>, state, composite.Token, TaskCreationOptions.PreferFairness);
                        _responseQueue.TryAdd(new OperationId(op.Id, op.OperationCode), response);
                        return(await response);
                    }
                    catch (OperationCanceledException)
                    {
                        await SendCancel(receivers, op);

                        throw;
                    }
                    catch (Exception)
                    {
                        if (response != null)
                        {
                            _responseQueue.TryRemove(new OperationId(op.Id, op.OperationCode), out _);
                            StatesPool.Return((State)response.AsyncState);
                        }
                        throw;
                    }
                }
            }
            return(new OperationResult <TResult>(default, BuiltInOperationState.NoWaiting));
        public ActionResult CancelMandateResult(CancellationRequest model)
        {
            if (String.IsNullOrEmpty(model.MessageId))
            {
                model.MessageId = MessageIdGenerator.New();
            }

            var response = b2bCommunicator.Cancel(model);

            return(View(response));
        }
        /// <summary>
        /// 响应远程请求
        /// </summary>
        public RpcTransportMessageResponse ProcessCommand(RpcTransportMessageRequest rpcRequest /*TODO: 请求上下文信息*/)
        {
            //本地服务发现
            ServiceCommandTypeInfo localCommandInfo = null;
            bool isLocalCommand = this.serviceBusRegistry.IsLocalServiceCommand(rpcRequest.ServiceUniqueName, out localCommandInfo);

            string responseMessageContent = null;

            if (isLocalCommand)
            {
                using (performanceCounter.BeginStopwatch(string.Format("localInvoke: {0}", rpcRequest.ServiceUniqueName.FullServiceUniqueName)))
                {
                    //本地服务
                    IServiceCommandResult commandResult = null;
                    var  commandData    = (IServiceCommand)this.serializer.DeserializeString(localCommandInfo.CommandType, rpcRequest.MessageContent);
                    bool triggeredLocal = serviceBus.triggerLocalCommand(localCommandInfo.CommandType, localCommandInfo.CommandResultType, commandData, out commandResult);
                    if (!triggeredLocal)
                    {
                        throw new WindServiceBusLocalServiceNotFoundException(rpcRequest.ServiceUniqueName.FullServiceUniqueName);
                    }

                    // 去除null判断,允许数据内容为null
                    //if (commandResult == null)
                    //{
                    //    throw new WindServiceBusException(string.Format("service command [{0}] process error!", rpcRequest.ServiceUniqueName.FullServiceUniqueName));
                    //}

                    responseMessageContent = this.serializer.SerializeString(commandResult);
                }
            }
            else
            {
                using (performanceCounter.BeginStopwatch(string.Format("remoteInvoke: {0}", rpcRequest.ServiceUniqueName.FullServiceUniqueName)))
                {
                    //远程服务
                    var resultWithContext = serviceBus.triggerRemoteCommand(rpcRequest.ServiceUniqueName, rpcRequest.MessageContent);
                    responseMessageContent = resultWithContext.ResponseMessageContent;
                }
            }

            //构建响应输出
            var messageHeader = new RpcTransportMessageHeader();
            var rpcResponse   = new RpcTransportMessageResponse(MessageIdGenerator.CreateMessageId())
            {
                MessageHeader        = messageHeader,
                CorrelationMessageId = rpcRequest.MessageId,
                ServiceUniqueName    = rpcRequest.ServiceUniqueName,
                MessageContent       = responseMessageContent
            };

            return(rpcResponse);
        }
        /// <summary>
        /// 响应远程广播请求
        /// </summary>
        /// <param name="rpcRequest"></param>
        /// <returns></returns>
        public RpcTransportMessageResponse ProcessBroadcastCommand(RpcTransportMessageRequest rpcRequest)
        {
            List <string> resultList = new List <string>();

            //1. 本地调用
            using (performanceCounter.BeginStopwatch(string.Format("localBroadcastInvoke: {0}", rpcRequest.ServiceUniqueName.FullServiceUniqueName)))
            {
                ServiceCommandTypeInfo localCommandInfo = null;
                bool isLocalCommand = this.serviceBusRegistry.IsLocalServiceCommand(rpcRequest.ServiceUniqueName, out localCommandInfo);

                if (isLocalCommand)
                {
                    IServiceCommandResult commandResult = null;
                    var  commandData    = (IServiceCommand)this.serializer.DeserializeString(localCommandInfo.CommandType, rpcRequest.MessageContent);
                    bool triggeredLocal = serviceBus.triggerLocalCommand(localCommandInfo.CommandType, localCommandInfo.CommandResultType, commandData, out commandResult);

                    if (triggeredLocal)
                    {
                        string responseMessageContent = this.serializer.SerializeString(commandResult);
                        resultList.Add(responseMessageContent);
                    }
                }
            }

            using (performanceCounter.BeginStopwatch(string.Format("remoteBroadcastInvoke: {0}", rpcRequest.ServiceUniqueName.FullServiceUniqueName)))
            {
                //2. 远程调用
                var resultWithContext = serviceBus.broadcastRemoteCommand(rpcRequest.ServiceUniqueName, rpcRequest.MessageContent);
                resultList.AddRange(resultWithContext.Select(r => r.ResponseMessageContent));
            }

            //3. 构建响应输出
            var contentResult = this.serializer.CombineToArray(resultList);

            var messageHeader = new RpcTransportMessageHeader();
            var rpcResponse   = new RpcTransportMessageResponse(MessageIdGenerator.CreateMessageId())
            {
                MessageHeader        = messageHeader,
                CorrelationMessageId = rpcRequest.MessageId,
                ServiceUniqueName    = rpcRequest.ServiceUniqueName,
                MessageContent       = contentResult
            };

            return(rpcResponse);
        }
예제 #8
0
        private static MTProtoClientBuilder CreateDefault()
        {
            var clientTransportFactory = new ClientTransportFactory();
            var tlRig = new TLRig();
            var messageIdGenerator = new MessageIdGenerator();
            var hashServices = new HashServices();
            var encryptionServices = new EncryptionServices();
            var randomGenerator = new RandomGenerator();
            var messageCodec = new MessageCodec(tlRig, hashServices, encryptionServices, randomGenerator);
            var keyChain = new KeyChain(tlRig, hashServices);
            var nonceGenerator = new NonceGenerator();

            return new MTProtoClientBuilder(clientTransportFactory,
                tlRig,
                messageIdGenerator,
                messageCodec,
                hashServices,
                encryptionServices,
                nonceGenerator,
                keyChain);
        }
        public ActionResult NewMandateResult(NewMandateRequestViewModel model)
        {
            if (String.IsNullOrEmpty(model.Source.MessageId))
            {
                model.Source.MessageId = MessageIdGenerator.New();
            }

            if (model.Instrumentation == Instrumentation.Core)
            {
                return(View(new NewMandateResponseViewModel {
                    Source = coreCommunicator.NewMandate(model.Source), Instrumentation = Instrumentation.Core
                }));
            }
            if (model.Instrumentation == Instrumentation.B2B)
            {
                return(View(new NewMandateResponseViewModel {
                    Source = b2bCommunicator.NewMandate(model.Source), Instrumentation = Instrumentation.B2B
                }));
            }

            throw new Exception("Instrumentation should either be Core or B2B.");
        }
예제 #10
0
        protected void Page_Load(object sender, EventArgs e)
        {
            DataTable ships = DataBaseHandler.getActiveShips();

            messageIdGenerator = new MessageIdGenerator();
            shipList           = new List <Vessel>();
            dateHandler        = new DateHandler();
            foreach (DataRow ship in ships.Rows)
            {
                var v = new Vessel
                {
                    imo        = ship["imoNumber"].ToString(),
                    name       = ship["name"].ToString(),
                    photoURL   = ship["imgURL"].ToString(),
                    portCallId = ship["portCallID"].ToString()
                };
                shipList.Add(v);
            }

            if (!IsPostBack)
            {
                initPage();
            }
        }
예제 #11
0
 public void WithMessageIdGenerator(MessageIdGenerator messageIdGenerator)
 {
     _messageIdGenerator = messageIdGenerator;
 }
예제 #12
0
 public OutboxMessageCollector(MessageIdGenerator messageIdGenerator, IOutgoingMessageRegistry outgoingMessageRegistry, IOutboxMessageRepository repository)
 {
     _outgoingMessageFactory = new OutgoingMessageFactory(outgoingMessageRegistry, messageIdGenerator);
     _repository             = repository;
 }
예제 #13
0
 public OutboxConfiguration(MessageIdGenerator messageIdGenerator, IOutboxNotifier notifier, TopicPayloadSerializerRegistry topicPayloadSerializerRegistry)
 {
     MessageIdGenerator             = messageIdGenerator;
     Notifier                       = notifier;
     TopicPayloadSerializerRegistry = topicPayloadSerializerRegistry;
 }
예제 #14
0
 public OutboxConfiguration(MessageIdGenerator messageIdGenerator)
 {
     MessageIdGenerator = messageIdGenerator;
 }
예제 #15
0
 public ProducerConfiguration(IDictionary <string, string> configuration, MessageIdGenerator messageIdGenerator, Func <ILoggerFactory, KafkaProducer> kafkaProducerFactory)
 {
     KafkaConfiguration   = configuration;
     MessageIdGenerator   = messageIdGenerator;
     KafkaProducerFactory = kafkaProducerFactory;
 }
        private bool dispatchCommand(
            ServiceUniqueNameInfo commandUniqueName, IRpcMessageSenderContext context, string requestMessageContent,
            out RemoteServiceBusResponseContext responseContext, out string responseMessageContent, out WindServiceBusRpcException rpcException)
        {
            // 创建响应上下文
            responseMessageContent = null;
            rpcException           = null;
            responseContext        = new RemoteServiceBusResponseContext();
            context.FillRemoteContext(responseContext);

            // 通过RPC框架执行远程调用
            try
            {
                RpcTransportMessageRequest requestMessage = new RpcTransportMessageRequest(MessageIdGenerator.CreateMessageId())
                {
                    ServiceUniqueName = commandUniqueName,
                    MessageHeader     = new RpcTransportMessageHeader
                    {
                        //TODO: 其他消息头
                    },
                    MessageContent = requestMessageContent,
                };
                RpcTransportMessageResponse responseMessage = this.rpcServerManager.SendMessage(requestMessage, context);

                //响应上下文
                if (responseMessage != null)
                {
                    responseContext.FillRemoteContext(responseMessage.MessageHeader);   //服务响应信息填入RemoteContext
                }

                //响应消息验证
                if (responseMessage == null || responseMessage.CorrelationMessageId == null ||
                    responseMessage.CorrelationMessageId != requestMessage.MessageId ||
                    responseMessage.MessageContent == null)
                {
                    throw new WindServiceBusException(string.Format("request [{0}] get error response !", requestMessage.MessageId));
                }

                if (responseMessage.ResponseCode != RpcTransportResponseCode.Success)
                {
                    throw new WindServiceBusException(string.Format("request [{0}] get error response: {1}", requestMessage.MessageId, responseMessage.ErrorInfo));
                }

                responseMessageContent = responseMessage.MessageContent;
                return(true);    //请求成功
            }
            catch (Exception serviceBusException)
            {
                this._logger.Error("WindServiceBusException: " + commandUniqueName, serviceBusException);
                rpcException = new WindServiceBusRpcException(responseContext, serviceBusException);

                return(false);   //请求失败
            }
        }
 public ProducerConfigurationBuilder WithMessageIdGenerator(MessageIdGenerator messageIdGenerator)
 {
     _messageIdGenerator = messageIdGenerator;
     return(this);
 }
예제 #18
0
 public ProducerBuilder With(MessageIdGenerator messageIdGenerator)
 {
     _messageIdGenerator = messageIdGenerator;
     return(this);
 }
예제 #19
0
 public void WithMessageIdGenerator(MessageIdGenerator messageIdGenerator)
 {
     _builder.WithMessageIdGenerator(messageIdGenerator);
 }
        /// <summary>
        /// 广播命令
        /// </summary>
        internal ICollection <ServiceResponseMessageWithResponseContext> BroadcastCommand(ServiceUniqueNameInfo commandUniqueName, string requestMessageContent)
        {
            //1. 服务发现(找到所有可以请求的目标)
            var remoteContextList = this.rpcServerManager.DiscoverRemoteService(commandUniqueName);

            if (remoteContextList == null || remoteContextList.Count < 1)
            {
                return(new ServiceResponseMessageWithResponseContext[0]);
                //throw new WindServiceBusRemoteServiceNotFoundException(commandUniqueName.FullServiceUniqueName);
            }

            //2. 广播请求
            RpcTransportMessageRequest requestMessage = new RpcTransportMessageRequest(MessageIdGenerator.CreateMessageId())
            {
                ServiceUniqueName = commandUniqueName,
                MessageHeader     = new RpcTransportMessageHeader
                {
                    //TODO: 其他消息头
                },
                MessageContent = requestMessageContent,
            };

            ICollection <RpcTransportErrorResponse> errorCollection;
            var responseCollection = this.rpcServerManager.BroadcastMessage(requestMessage, remoteContextList, out errorCollection);

            var resultList = responseCollection.Select(resp =>
                                                       new ServiceResponseMessageWithResponseContext(resp.MessageContent, new RemoteServiceBusResponseContext(resp.MessageHeader))).ToList();

            if (errorCollection != null && errorCollection.Count > 0)
            {
                //TODO: 异常列表返回处理
            }

            return(resultList);
        }