예제 #1
0
        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;
        }
예제 #2
0
        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());
            }
        }