Пример #1
0
        public static async Task <Handler> CreateAsync(ChaincodeID chaincodeId, IChaincodeAsync chaincode, CancellationToken token = default(CancellationToken))
        {
            Handler h = new Handler();

            h.chaincode = chaincode;
            h.State     = CCState.CREATED;
            await h.QueueOutboundChaincodeMessageAsync(NewRegisterChaincodeMessage(chaincodeId), token).ConfigureAwait(false);

            return(h);
        }
        public async Task ProcessAndBlockAsync(Channel connection, IChaincodeAsync chaincode, string id, CancellationToken token = default(CancellationToken))
        {
            ChaincodeSupport.ChaincodeSupportClient stub = new ChaincodeSupport.ChaincodeSupportClient(connection);
            logger.Information("Connecting to peer.");
            AsyncDuplexStreamingCall <ChaincodeMessage, ChaincodeMessage> requestObserver = stub.Register();
            CancellationTokenSource src = CancellationTokenSource.CreateLinkedTokenSource(token);

            Task.Run(async() =>
            {
                try
                {
                    while (await requestObserver.ResponseStream.MoveNext(src.Token).ConfigureAwait(false))
                    {
                        ChaincodeMessage message = requestObserver.ResponseStream.Current;
                        logger.Debug("Got message from peer: " + message.ToJsonString());
                        try
                        {
                            logger.Debug($"[{message.Txid}]Received message {message.Type} from org.hyperledger.fabric.shim");
                            await handler.OnChaincodeMessageAsync(message, src.Token).ConfigureAwait(false);
                        }
                        catch (Exception e)
                        {
                            logger.Error($"Server Error: {e.Message}");
                        }
                    }

                    src.Cancel();
                }
                catch (OperationCanceledException)
                {
                    //ignored
                }
                catch (Exception e)
                {
                    logger.Error($"Server Error: {e.Message}");
                    src.Cancel();
                }

                logger.Information("Chaincode stream is shutting down.");
            }, src.Token);


            // Create the org.hyperledger.fabric.shim handler responsible for all
            // control logic
            //Thread 2 Process Client Requests
            handler = await Handler.CreateAsync(new ChaincodeID { Name = id }, chaincode, src.Token).ConfigureAwait(false);

            while (true)
            {
                try
                {
                    ChaincodeMessage message = null;
                    try
                    {
                        message = await handler.NextOutboundChaincodeMessageAsync(src.Token).ConfigureAwait(false);
                    }
                    catch (OperationCanceledException)
                    {
                        //ignored processed below
                    }

                    if (src.Token.IsCancellationRequested)
                    {
                        try
                        {
                            await requestObserver.RequestStream.CompleteAsync().ConfigureAwait(false);
                        }
                        catch (Exception)
                        {
                            //Ignored (Server died)
                        }

                        return;
                    }

                    await requestObserver.RequestStream.WriteAsync(message).ConfigureAwait(false);
                }
                catch (OperationCanceledException)
                {
                    return;
                }
                catch (Exception e)
                {
                    logger.Error(e, e.Message);
                    break;
                }
            }
        }