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(); }