示例#1
0
        private static void StartAutoActiveWalletConsumer()
        {
            var thread = new Thread(new ThreadStart(() =>
            {
                IModel channel;
                var consumer = GetUserRegisteredConsumer(out channel);

                Log.Info("用户注册-钱包自动激活监控器启动!");

                while (true)
                {
                    if (Program.Fusing)
                    {
                        Log.Info("发生熔断事件,用户注册-钱包自动激活监控器停止运行");
                        _cancelTokenSource.Cancel();
                        break;
                    }
                    Log.Info("正在监听用户注册消息...");
                    BasicDeliverEventArgs ea = null;
                    try
                    {
                        ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                        var body = ea.Body;
                        var message = Encoding.UTF8.GetString(body);

                        var registerMessage = IoC.Resolve<IJsonSerializer>().Deserialize<UserReisterMessage>(message);

                        Log.Info("收到用户注册消息:{0}", message);

                        var exist = string.Empty;
                        if (!Cache.TryGet("active_ripple_wallet" + registerMessage.UserID, out exist))
                        {
                            var rippleClient = IoC.Resolve<IRippleClient>();
                            var activeAmount = 25;
                            int transferFee = (int)(0.01 * 1000000);

                            var transaction = new Transaction
                            {
                                Flags = TransactionFlags.tfFullyCanonicalSig,
                                DestinationTag = 110,
                                Fee = transferFee,
                                TransactionType = TransactionType.Payment,
                                Account = Config.RippleAccount,
                                Destination = registerMessage.RippleAddress,
                                Amount = new RippleCurrencyValue { Currency = "XRP", Issuer = string.Empty, Value = activeAmount }
                            };

                            rippleClient.Sign(transaction, Config.RippleSecret, (signError, result) =>
                            {
                                if (signError == null)
                                {
                                    //记录转账交易数据
                                    var cmd = new RecordActiveWalletTx(result.Transaction.Hash, result.TxBlob, Config.RippleAccount, registerMessage.RippleAddress, activeAmount, transferFee);
                                    IoC.Resolve<ICommandBus>().Send(cmd);
                                    var recordID = cmd.Result;
                                    Log.Info("SIGN OK" + result.Transaction.Hash);
                                    rippleClient.Submit(result.TxBlob, (submitError, payment) =>
                                    {
                                        try
                                        {
                                            if (submitError != null)
                                            {
                                                Log.Error("激活钱包过程中出现了错误,原消息为:" + message, submitError);
                                                //记录转账失败
                                                var activeSuccessCmd = new ActiveWalletTxSubmitFail(recordID, submitError.Error + submitError.Message);
                                                IoC.Resolve<ICommandBus>().Send(activeSuccessCmd);

                                                if (channel.IsOpen)
                                                    channel.BasicNack(ea.DeliveryTag, false, true);
                                            }
                                            else
                                            {
                                                Log.Info("激活钱包成功" + message);
                                                Cache.Add("active_ripple_wallet" + registerMessage.UserID, string.Empty);
                                                //记录转账成功
                                                var activeSuccessCmd = new ActiveWalletTxSubmitSuccess(recordID);
                                                IoC.Resolve<ICommandBus>().Send(activeSuccessCmd);

                                                if (channel.IsOpen)
                                                    channel.BasicAck(ea.DeliveryTag, false);
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            Log.Error("激活钱包回到过程中出现未处理的异常:" + message, ex);
                                        }
                                    });
                                }
                                else
                                {
                                    Log.Error("激活钱包过程中出现了发送xrp交易签名错误,原消息为:" + message, signError);
                                    if (channel.IsOpen)
                                        channel.BasicNack(ea.DeliveryTag, false, true);
                                }
                            });
                        }
                        else
                        {
                            channel.BasicAck(ea.DeliveryTag, false);
                        }
                    }
                    catch (System.IO.EndOfStreamException ex)
                    {
                        if (ex.Message.Equals("SharedQueue closed", StringComparison.OrdinalIgnoreCase))
                        {
                            Log.Warn("激活用户钱包时,消息队列的链接断开了,准备自动重连", ex);

                            consumer = GetUserRegisteredConsumer(out channel);
                            if (ea != null)
                                channel.BasicNack(ea.DeliveryTag, false, true);
                        }
                    }
                    catch (Exception ex)
                    {
                        if (ea != null)
                        {
                            channel.BasicNack(ea.DeliveryTag, false, true);
                        }
                        Log.Error("发送完成消息时出现错误", ex);
                    }
                }
            }));

            thread.Start();
        }
        private static void StartSignWatcher()
        {
            if (RippleOutboundTransferWatcher.SignerStarted)
            {
                Log.Info("Ripple转出交易SignMonitor已启动");
                return;
            }

            var thread = new Thread(new ThreadStart(() =>
            {
                IModel channel;

                var consumer = GetOutboundTransferTransactionForSignConsumer(out channel);

                Log.Info("Ripple转出交易SignMonitor启动成功");

                while (true)
                {
                    Log.Info("正在监听Ripple转出交易Sign命令...");
                    BasicDeliverEventArgs ea = null;
                    var cmdTypeDesc = string.Empty;
                    try
                    {
                        ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();

                        var body = ea.Body;
                        var message = Encoding.UTF8.GetString(body);

                        var outboundTxMsg = IoC.Resolve<IJsonSerializer>().Deserialize<RippleOutboundTxMessage>(message);

                        Log.Info("收到新的Ripple Outbound Tx sign指令:{0}", message);

                        var tx = new Transaction()
                        {
                            Account = Config.RippleAccount,
                            Destination = outboundTxMsg.Destination,
                            DestinationTag = outboundTxMsg.DestinationTag,
                            Amount = new RippleCurrencyValue()
                            {
                                _Value = outboundTxMsg.Amount.ToString(),
                                Issuer = outboundTxMsg.Destination,
                                Currency = outboundTxMsg.Currency
                            },
                            TransactionType = TransactionType.Payment,
                            Paths = outboundTxMsg.Paths
                        };

                        IoC.Resolve<IRippleClientAsync>().Sign(tx, Config.RippleSecret)
                           .ContinueWith((data) =>
                           {
                               //如果sign成功了
                               if (data.Result.Item1 == null)
                               {
                                   //直接执行sign成功cmd
                                   var cmd = new SignRippleOutboundTx(outboundTxMsg.OutboundTxId, data.Result.Item2.Transaction.Hash, data.Result.Item2.Transaction.TxBlob);
                                   try
                                   {
                                       IoC.Resolve<ICommandBus>().Send(cmd);

                                       Log.Info("成功处理OutboundTxSign");
                                   }

                                   catch (CommandExecutionException ex)
                                   {
                                       if (ex.ErrorCode == (int)ErrorCode.RippleTransactionNotInit)
                                       {
                                           Log.Info("out bound sign已处理完毕,不在重复处理:" + message);
                                       }
                                   }
                                   catch (Exception ex)
                                   {
                                       Log.Error("outboundtx sign cmd{0}执行时出现错误".FormatWith(IoC.Resolve<IJsonSerializer>().Serialize(cmd)), ex);
                                   }
                               }
                               //如果没有sign成功,重新发送消息到消息队列,等待再次sign
                               else
                               {
                                   RetrySendSignMessage(message);
                               }
                           })
                           .Start();

                        Log.Info("提交sign" + message);
                    }

                    catch (System.IO.EndOfStreamException ex)
                    {
                        if (ex.Message.Equals("SharedQueue closed", StringComparison.OrdinalIgnoreCase))
                        {
                            Log.Warn("处理" + cmdTypeDesc + "时,消息队列的链接断开了,准备自动重连", ex);

                            consumer = GetOutboundTransferTransactionForSignConsumer(out channel);
                        }
                    }
                    catch (Exception ex)
                    {

                        Log.Error(cmdTypeDesc + "处理过程中出现错误:" + ex.Message, ex);
                    }
                }
            }));

            thread.Start();
        }