public Worker(string name, IpAddress ipAddress, int port, IReplyServer electionReplyServer, string primaryDirectory, IDirectoryPreparerAsync directoryPreparer, IElectionRequester electionRequester, IMasterFileReader masterFileReader, IMasterFileWriter masterFileWriter, IUnitOfWorkFileReader unitOfWorkFileReader, IUnitOfWorkFileWriter unitOfWorkFileWriter, IWorkerLogger logger = null, IWorkProcessor workProcessor = null ) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentNullException("name", string.Format(Messages.StringNullEmptyOrWhiteSpace, "name")); } Connection = new WorkerConnection { Name = name, IpAddress = ipAddress ?? throw new ArgumentNullException("ipAddress", string.Format(Messages.ObjectNull, "ipAddress")), Port = (port > 1024 && port < 65536) ? port : throw new ArgumentNullException("port", Messages.PortNoInRange) }; _DirectoryPreparer = directoryPreparer ?? throw new ArgumentNullException("directoryPreparer", string.Format(Messages.ObjectNull, "directoryPreparer"));; _PrimaryDirectory = primaryDirectory; _ReplyServer = electionReplyServer ?? throw new ArgumentNullException("electionReplyServer", string.Format(Messages.ObjectNull, "electionReplyServer")); _ElectionRequester = electionRequester ?? throw new ArgumentNullException("electionRequester", string.Format(Messages.ObjectNull, "electionRequester")); _MasterFileReader = masterFileReader ?? throw new ArgumentNullException("masterFileReader", string.Format(Messages.ObjectNull, "masterFileReader")); _MasterFileWriter = masterFileWriter ?? throw new ArgumentNullException("masterFileWriter", string.Format(Messages.ObjectNull, "masterFileWriter")); _UnitOfWorkFileReader = unitOfWorkFileReader ?? throw new ArgumentNullException("unitOfWorkFileReader", string.Format(Messages.ObjectNull, "unitOfWorkFileReader")); _UnitOfWorkFileWriter = unitOfWorkFileWriter ?? throw new ArgumentNullException("unitOfWorkFileWriter", string.Format(Messages.ObjectNull, "unitOfWorkFileWriter")); _Logger = logger; if (_Logger == null) { _Logger = new MultiLogger(name, new ConsoleLogger(), new Log4NetLogger(LogManager.GetLogger(Assembly.GetExecutingAssembly(), $"{Connection.Name}.log"))); } _WorkProcessor = workProcessor ?? new WorkProcessor(_Logger); _WorkProcessor.OnComplete += OnWorkComplete; }
static async Task Main(string[] args) { IWorker worker = null; try { new ArgsManager <ArgsHandler>().Start(args); var appender = new FileAppender { Layout = new SimpleLayout(), File = Assembly.GetExecutingAssembly().Location + ".log", Encoding = Encoding.UTF8, AppendToFile = true, LockingModel = new FileAppender.MinimalLock() }; appender.ActivateOptions(); var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly()); BasicConfigurator.Configure(logRepo, appender); var primaryDirectory = Args.Value(ArgsHandler.PrimaryDirectory); var name = Args.Value(ArgsHandler.Name); var ip = Args.Value(ArgsHandler.IpAddress); var port = Args.Value(ArgsHandler.Port).To <int>(); if (string.IsNullOrWhiteSpace(name)) { name = $"{ip}:{port}"; } var repoType = Args.Value(ArgsHandler.Repo); IDirectoryPreparerAsync directoryPreparer = null; IRepo repo = null; if (repoType == "Local") { directoryPreparer = new LocalDirectoryPreparerAsync(); repo = new LocalRepo(); } if (repoType == "S3") { var region = RegionEndpoint.GetBySystemName(ConfigurationManager.AppSettings["AWSRegion"]); var client = new AmazonS3Client(Args.Value("AccessKey"), Args.Value("SecretKey"), region); var bucket = Args.Value(ArgsHandler.Bucket); repo = new S3Repo(client, bucket); directoryPreparer = new S3DirectoryPreparerAsync(client, bucket); } var isPrepared = await directoryPreparer.PrepareAync(primaryDirectory, Folders.SubDirs); if (!isPrepared) { throw new Exception(Messages.FolderStructureNotPrepared); } worker = new Worker(name, ip, port, new ReplyServer(), primaryDirectory, directoryPreparer, new ElectionRequester(new RequestClient()), repo.Reader, repo.Writer, repo.UnitOfWorkReader, repo.UnitOfWorkWriter); await worker.StartAsync(); var task = (worker as Worker)?.ListenerTask; if (task != null) { await Task.WhenAll(task); } } catch (Exception e) { (worker as Worker)._Logger.Debug(e.ToString()); } }