public static IServiceCollection UseTransactionsManager(this IServiceCollection services, IConfiguration Configuration, ILoggerFactory loggerFactory) { string eosNodeUrl = Configuration.GetValue <string>("EosNodeUrl", ""); var abiService = new ABIService(loggerFactory, eosNodeUrl + "/v1/chain/abi_bin_to_json", eosNodeUrl + "/v1/chain/get_info"); string connectionString = Configuration.GetValue <string>("MongoClientConnectionString", ""); if (string.IsNullOrEmpty(connectionString)) { throw new ArgumentNullException("mongoClientConnectionString is required"); } string databaseName = Configuration.GetValue <string>("MongoClientDatabaseName", ""); string transactionCollectionName = Configuration.GetValue <string>("MongoClientTransactionsName", ""); string transferCollectionName = Configuration.GetValue <string>("MongoClientTransfersName", ""); var eosConfig = new EosConfigurator() { HttpEndpoint = eosNodeUrl, ExpireSeconds = 60 }; AbiSerializationProvider.Prefix = "VHKD"; TransactionsManager implementationInstance = new TransactionsManager(eosConfig, abiService, connectionString, databaseName, transactionCollectionName, transferCollectionName); services.AddSingleton <TransactionsManager>(implementationInstance); return(services); }
static void Main(string[] args) { args = new[] { "61f57e03b30dd494c83272f1c19c6481d9e1593a138bff3e84e82ac6018bfe7f" }; var loggerFactory = new LoggerFactory(); loggerFactory.AddConsole(); var logger = loggerFactory.CreateLogger("extool"); if (args == null || args.Length == 0) { logger.LogInformation("please input block number"); return; } var trxId = args[0].Trim(); var configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("appsettings.json"); var configuration = configurationBuilder.Build(); var settings = new EXToolSettings(); configuration.GetSection(nameof(EXToolSettings)).Bind(settings); var abiService = new ABIService(loggerFactory, settings.AbiBinToJsonUrl, settings.GetInfoUrl); IChainTrxRepository chainTrxRepository = new MongoChainTrxRepository(abiService, settings.MongoClientConnectionString /*"mongodb://192.168.1.162:27017"*/, settings.DatabaseName /*"EOSTEST"*/, settings.TrxActionsCollectionName, settings.AppliedTransactionCollectionName, settings.AcceptTransactionCollectionName, settings.Actionfilters); string message = JsonConvert.SerializeObject((object)settings); logger.LogInformation(message); logger.LogInformation("extool start ..."); using (var httpClient = new HttpClient()) { httpClient.DefaultRequestHeaders.Connection.Add("keep-alive"); var httpResponseMessage = httpClient.PostAsync(settings.GetTransactionUrl, ABIService.CreateStringContent(JsonConvert.SerializeObject((object)new { id = trxId }))).Result; var responseString = httpResponseMessage.Content.ReadAsStringAsync().Result; logger.LogInformation(responseString); if (httpResponseMessage.IsSuccessStatusCode) { chainTrxRepository.SetAppliedTransactionAsync(responseString).Wait(); } } }
public TransactionsManager( EosConfigurator eosConfig, ABIService abiService, string connectionString, string databaseName, string transactionCollectionName, string transferCollectionName) { this.m_EosConfig = eosConfig; this.m_ABIService = abiService; this.m_MongoClient = (IMongoClient) new MongoClient(connectionString); this.m_MongoDatabase = this.m_MongoClient.GetDatabase(databaseName, (MongoDatabaseSettings)null); this.m_TransactionCollectionName = transactionCollectionName; this.m_TransferCollectionName = transferCollectionName; this.m_EosApi = new EosApi(this.m_EosConfig, new HttpHandler()); this.m_AbiSerializer = new core.Services.AbiSerializationProvider(this.m_EosApi); }
public MongoChainTrxRepository(ABIService abiService, string connectionString, string databaseName, string trxActionsCollectionName, string appliedTransactionCollectionName, string acceptTransactionCollectionName, string actionFilters) { m_ABIService = abiService; m_MongoClient = new MongoClient(connectionString); m_Database = m_MongoClient.GetDatabase(databaseName); m_TrxActionsCollectionName = trxActionsCollectionName; m_AppliedTransactionCollectionName = appliedTransactionCollectionName; m_AcceptTransactionCollectionName = acceptTransactionCollectionName; m_ActionFilters = actionFilters.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries) .Select(m => m.Split(new char[] { ':' }, StringSplitOptions.None)) .Where(m => m.Length == 2).Select(m => new ActionFilter() { Account = m[0], Name = m[1] }).ToArray <ActionFilter>(); }
static void Main(string[] args) { var loggerFactory = new LoggerFactory(); loggerFactory.AddConsole(); var logger = loggerFactory.CreateLogger("Eosio.KafkaClient"); var configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddJsonFile("appsettings.json"); var configuration = configurationBuilder.Build(); var settings = new KafkaClientSettings(); configuration.GetSection(nameof(KafkaClientSettings)).Bind(settings); var conf = new Dictionary <string, object> { { "group.id", settings.ConsumerGroupId /*"eos-consumer-group"*/ }, { "bootstrap.servers", settings.ConsumerBootstrapServers /*"192.168.1.234:9092"*/ }, { "auto.commit.interval.ms", settings.ConsumerCommitInterval /*5000*/ }, { "auto.offset.reset", settings.ConsumerOffsetReset /*"earliest"*/ } }; var abiService = new ABIService(loggerFactory, settings.AbiBinToJsonUrl, settings.GetInfoUrl); IChainTrxRepository chainTrxRepository = new MongoChainTrxRepository(abiService, settings.MongoClientConnectionString /*"mongodb://192.168.1.162:27017"*/, settings.DatabaseName /*"EOSTEST"*/, settings.TrxActionsCollectionName, settings.AppliedTransactionCollectionName, settings.AcceptTransactionCollectionName, settings.Actionfilters); Dictionary <string, Func <string, Task> > consumerActions = new Dictionary <string, Func <string, Task> >(); consumerActions.Add(settings.ConsumerAcceptTopic, (Func <string, Task>)(msgValue => chainTrxRepository.SetAcceptTransactionAsync(msgValue))); consumerActions.Add(settings.ConsumerAppliedTopic, (Func <string, Task>)(msgValue => chainTrxRepository.SetAppliedTransactionAsync(msgValue))); string message = JsonConvert.SerializeObject((object)settings); logger.LogInformation(message); logger.LogInformation("Consumer start ..."); Task.Run(() => { Dictionary <string, Func <Task> > reSetFuncs = new Dictionary <string, Func <Task> >(); reSetFuncs.Add(settings.ConsumerAcceptTopic, () => chainTrxRepository.ReSetAcceptTransactionsAsync()); reSetFuncs.Add(settings.ConsumerAppliedTopic, () => chainTrxRepository.ReSetAppliedTransactionsAsync()); while (true) { try { reSetFuncs[settings.ConsumerSubscribeTopic]().Wait(); } catch (Exception ex) { logger.LogError((EventId)0, ex, "ReSetError"); } finally { Thread.Sleep(60000); } } }); using (Consumer <Null, string> consumer = new Consumer <Null, string>(conf, null, new StringDeserializer(Encoding.UTF8))) { consumer.OnMessage += (_, msg) => { consumerActions[settings.ConsumerSubscribeTopic](msg.Value).Wait(); logger.LogInformation(string.Format("Read '{0}-{1}' from: {2}", (object)msg.Topic, (object)msg.Timestamp.UtcDateTime.ToLongTimeString(), (object)msg.TopicPartitionOffset)); }; consumer.OnError += (_, error) => logger.LogInformation(string.Format("Error: {0}", (object)error)); consumer.OnConsumeError += (_, msg) => logger.LogInformation(string.Format("Consume error ({0}): {1}", (object)msg.TopicPartitionOffset, (object)msg.Error)); consumer.Subscribe(settings.ConsumerSubscribeTopic); while (true) { consumer.Poll(TimeSpan.FromMilliseconds(100.0)); } } }