예제 #1
0
        /// <summary>
        /// 发布通知
        /// </summary>
        /// <param name="provider">通知发布者</param>
        /// <param name="notificationInfo">通知信息</param>
        /// <param name="subscriptionUserIdentifiers">订阅用户列表</param>
        /// <returns></returns>
        protected async Task PublishAsync(INotificationPublishProvider provider, NotificationInfo notificationInfo,
                                          IEnumerable <UserIdentifier> subscriptionUserIdentifiers)
        {
            try
            {
                Logger.LogDebug($"Sending notification with provider {provider.Name}");
                var notifacationDataMapping = Options.NotificationDataMappings
                                              .GetMapItemOrNull(provider.Name, notificationInfo.CateGory);
                if (notifacationDataMapping != null)
                {
                    notificationInfo.Data = notifacationDataMapping.MappingFunc(notificationInfo.Data);
                }
                // 发布
                await provider.PublishAsync(notificationInfo, subscriptionUserIdentifiers);

                Logger.LogDebug($"Send notification {notificationInfo.Name} with provider {provider.Name} was successful");
            }
            catch (Exception ex)
            {
                Logger.LogWarning($"Send notification error with provider {provider.Name}");
                Logger.LogWarning($"Error message:{ex.Message}");

                Logger.LogTrace(ex, $"Send notification error with provider { provider.Name}");

                Logger.LogDebug($"Send notification error, notification {notificationInfo.Name} entry queue");
                // 发送失败的消息进入后台队列
                await BackgroundJobManager.EnqueueAsync(
                    new NotificationPublishJobArgs(notificationInfo.GetId(),
                                                   provider.GetType().AssemblyQualifiedName,
                                                   subscriptionUserIdentifiers.ToList(),
                                                   notificationInfo.TenantId));
            }
        }
예제 #2
0
 public SamplesController(ILogger <SamplesController> logger, IConfiguration configuration, BackgroundJobManager backgroundJobManager, IMetrics metrics)
 {
     _logger               = logger;
     _configuration        = configuration;
     _backgroundJobManager = backgroundJobManager;
     _metrics              = metrics;
 }
예제 #3
0
        public void BackgroundJobManagerTest()
        {
            IIocManager iocResolver = new IocManager();

            // 注册服务
            iocResolver.Register <SimpleSendEmailJob>(DependencyLifeStyle.Transient);
            IBackgroundJobStore   jobStore = new InMemoryBackgroundJobStore();
            IBackgroundJobManager _backgroundJobManager = new BackgroundJobManager(iocResolver, jobStore, new Enterprises.Framework.Threading.AbpTimer());

            _backgroundJobManager.Enqueue <SimpleSendEmailJob, SimpleSendEmailJobArgs>(
                new SimpleSendEmailJobArgs
            {
                Subject      = "邮件主题",
                Body         = "测试邮件",
                SenderUserId = 1000,
                TargetUserId = 2000
            });


            _backgroundJobManager.Enqueue <SimpleSendEmailJob, SimpleSendEmailJobArgs>(
                new SimpleSendEmailJobArgs
            {
                Subject      = "邮件主题2",
                Body         = "测试邮件2",
                SenderUserId = 1000,
                TargetUserId = 2000
            }, BackgroundJobPriority.Normal, TimeSpan.FromSeconds(10));

            _backgroundJobManager.Start();

            Console.WriteLine($"datetime={DateTime.Now} end send Email ");
        }
예제 #4
0
        public async Task <SiteViewModelWithChilds> SaveSite(SiteViewModelWithChilds model)
        {
            var res = await _configurationService.SaveSite(model);

            await BackgroundJobManager.UpdateWorker(res.Id, _configurationService);

            return(res);
        }
예제 #5
0
 protected virtual void Dispose(bool isDisposing)
 {
     if (_backgroundJobManager != null)
     {
         _backgroundJobManager.Dispose();
         _backgroundJobManager = null;
     }
 }
예제 #6
0
 public SamplesController(ILogger <SamplesController> logger, IConfiguration configuration, BackgroundJobManager backgroundJobManager, AppSettings appSettings, IDateTimeProvider dateTimeProvider)
 {
     _logger               = logger;
     _configuration        = configuration;
     _backgroundJobManager = backgroundJobManager;
     _appSettings          = appSettings;
     _dateTimeProvider     = dateTimeProvider;
 }
예제 #7
0
 public SamplesController(ILogger <SamplesController> logger, IConfiguration configuration, BackgroundJobManager backgroundJobManager, AppSettings appSettings, IDateTimeProvider dateTimeProvider, IEnumerable <IService> services)
 {
     _logger               = logger;
     _configuration        = configuration;
     _backgroundJobManager = backgroundJobManager;
     _appSettings          = appSettings;
     _dateTimeProvider     = dateTimeProvider;
     _services             = services;
 }
        public void Start(StartContext context)
        {
            var adapter = new DependencyInjectionAdapter(context.ServiceProvider);

            _backgroundJobManager = new BackgroundJobManager(adapter);
            _backgroundJobManager.ExecuteSequentially = true;
            _backgroundJobManager.JobFailed          += OnBackgroundJobFailed;
            _backgroundJobManager.StartInterval       = TimeSpan.FromSeconds(Debugger.IsAttached ? 0 : 10);
            _backgroundJobManager.ExecuteInterval     = TimeSpan.FromSeconds(Debugger.IsAttached ? 0 : 30);
            _backgroundJobManager.ScopeClosing       += OnBackgroundJobScopeClosing;
            _backgroundJobManager.Start();
        }
예제 #9
0
        private void BuildServices()
        {
            _appManager = new ApplicationServiceManager(CompositionRoot.Container)
            {
                Settings = new ApplicationServiceManagerSettingsWithDefaultOn()
            };
            _appManager.ServiceFailed += OnServiceFailed;

            _backgroundJobManager                 = new BackgroundJobManager(CompositionRoot.Container);
            _backgroundJobManager.JobFailed      += OnJobFailed;
            _backgroundJobManager.StartInterval   = TimeSpan.FromSeconds(Debugger.IsAttached ? 0 : 10);
            _backgroundJobManager.ExecuteInterval = TimeSpan.FromMinutes(5);

            _backgroundJobManager.ScopeClosing += OnScopeClosing;
        }
예제 #10
0
        protected override async Task SendEmailAsync()
        {
            var publicationState = EventData.Entity.IsPublished ? "Published" : "Unpublished";
            var time             = EventData.Entity.LastModificationTime.Humanize();
            var message          = $"your product named {EventData.Entity.Title} was {publicationState} {time}";

            if (ToUser != null)
            {
                await BackgroundJobManager.EnqueueAsync(new EmailSendingArgs()
                {
                    EmailAddress = ToUser.Email,
                    Subject      = $"Product {publicationState}",
                    Body         = message
                });
            }
        }
        public void execute_found_job()
        {
            var sl    = Substitute.For <IContainer>();
            var scope = Substitute.For <IContainerScope>();
            var job   = Substitute.For <IBackgroundJob>();

            sl.CreateScope().Returns(scope);
            scope.Resolve(job.GetType()).Returns(job);
            scope.ResolveAll <IBackgroundJob>().Returns(new[] { job });

            var sut = new BackgroundJobManager(sl);

            sut.StartInterval = TimeSpan.FromSeconds(0);
            sut.Start();
            Thread.Sleep(100);

            job.Received().Execute();
        }
        public void trigger_ScopeClosed_before_closing_it_even_if_job_execution_fails()
        {
            var sl    = Substitute.For <IContainer>();
            var scope = Substitute.For <IContainerScope>();
            var job   = Substitute.For <IBackgroundJob>();

            sl.CreateScope().Returns(scope);
            scope.Resolve(job.GetType()).Returns(job);
            scope.ResolveAll <IBackgroundJob>().Returns(new[] { job });

            var sut = new BackgroundJobManager(sl);

            sut.StartInterval = TimeSpan.FromSeconds(0);
            sut.Start();
            Thread.Sleep(100);

            job.Received().Execute();
        }
예제 #13
0
        private void BuildServices()
        {
            _appManager = new ApplicationServiceManager(CompositionRoot.Container);
            _appManager.ServiceFailed += OnServiceFailed;

            _backgroundJobManager            = new BackgroundJobManager(CompositionRoot.Container);
            _backgroundJobManager.JobFailed += OnJobFailed;
            if (Debugger.IsAttached)
            {
                _backgroundJobManager.StartInterval = TimeSpan.FromSeconds(0);
            }
            else
            {
                _backgroundJobManager.StartInterval = TimeSpan.FromSeconds(10);
            }
            _backgroundJobManager.ExecuteInterval = TimeSpan.FromMinutes(5);

            _backgroundJobManager.ScopeClosing += OnScopeClosing;
        }
예제 #14
0
        /// <summary>
        /// 开单审核提醒
        /// </summary>
        /// <param name="processTask"></param>
        /// <returns></returns>
        public virtual async Task SendTaskConfirmRemind(ProcessTask processTask)
        {
            var remindLogManager = Resolve <RemindLogManager>();
            //所有有审核权限的用户
            var users = await Resolve <UserManager>().FindByPermission("Module.JGKD.Button.ConfirmProcess");

            //如果任务设定了审核人,只发送给此审核人员
            if (!string.IsNullOrEmpty(processTask.Verifier) && users.Exists(o => o.Name == processTask.Verifier))
            {
                users = users.Where(o => o.Name == processTask.Verifier).ToList();
            }
            //获取对应用户的微信登录信息
            var userLogins = await UserLoginRepository.GetAll()
                             .Where(o => users.Select(u => u.Id).Contains(o.UserId))
                             .Where(o => o.LoginProvider == WeChatAuthProviderApi.Name)
                             .Select(o => new { o.ProviderKey, o.UserId })
                             .ToListAsync();

            foreach (var userLogin in userLogins)
            {
                var openid = userLogin.ProviderKey;
                var name   = users.Where(o => o.Id == userLogin.UserId).Single().Name;
                //先产生一条提醒记录
                var remindLog = new RemindLog()
                {
                    RemindType = "开单审核提醒",
                    Name       = name,
                    TenantId   = AbpSession.TenantId,
                    Message    = processTask.Part?.Project?.ProjectSN + processTask.Part?.PartName + processTask.ProcessType?.ProcessTypeName,
                };
                var remindLogId = await remindLogManager.InsertAndGetIdAsync(remindLog);

                var arg = new SendWeiXinMessageJobArgs()
                {
                    OpenId      = openid,
                    DataId      = processTask.Id,
                    RemindLogId = remindLogId,
                };

                BackgroundJobManager.Enqueue <TaskConfirmMessageJob, SendWeiXinMessageJobArgs>(arg);
            }
        }
        public void trigger_ScopeClosed_before_closing_it_after_job_Execution()
        {
            var sl    = Substitute.For <IContainer>();
            var job   = Substitute.For <IBackgroundJob>();
            var scope = Substitute.For <IContainerScope>();

            sl.CreateScope().Returns(scope);
            scope.Resolve(job.GetType()).Returns(job);
            scope.ResolveAll <IBackgroundJob>().Returns(new[] { job });
            ScopeClosingEventArgs actual = null;

            var sut = new BackgroundJobManager(sl);

            sut.StartInterval = TimeSpan.FromSeconds(0);
            sut.ScopeClosing += (o, e) => actual = e;
            sut.Start();
            Thread.Sleep(100);

            actual.Should().NotBeNull();
        }
        public void report_job_failure_using_the_event_and_include_NoJob_if_type_cant_be_resolved()
        {
            var sl    = Substitute.For <IContainer>();
            var scope = Substitute.For <IContainerScope>();
            var job   = Substitute.For <IBackgroundJob>();
            BackgroundJobFailedEventArgs actual = null;

            job.When(x => x.Execute()).Do(x => { throw new InvalidDataException(); });
            sl.CreateScope().Returns(scope);
            scope.ResolveAll <IBackgroundJob>().Returns(new[] { job });

            var sut = new BackgroundJobManager(sl);

            sut.StartInterval = TimeSpan.FromSeconds(0);
            sut.Start();
            sut.JobFailed += (sender, args) => actual = args;
            Thread.Sleep(100);

            actual.Exception.Should().BeOfType <InvalidOperationException>();
            actual.Job.Should().BeOfType <BackgroundJobManager.NoJob>();
        }
        public void run_next_async_job_even_if_first_fails()
        {
            var sl    = Substitute.For <IContainer>();
            var scope = Substitute.For <IContainerScope>();
            var job   = Substitute.For <IBackgroundJobAsync>();
            var job2  = Substitute.For <IBackgroundJobAsync>();

            job.When(x => x.ExecuteAsync()).Do(x => { throw new SqlNullValueException(); });
            sl.CreateScope().Returns(scope);
            scope.Resolve(job.GetType()).Returns(job);
            scope.Resolve(job2.GetType()).Returns(job2);
            scope.ResolveAll <IBackgroundJobAsync>().Returns(new[] { job, job2 });

            var sut = new BackgroundJobManager(sl);

            sut.StartInterval = TimeSpan.FromSeconds(0);
            sut.Start();
            Thread.Sleep(10000);

            job2.Received().ExecuteAsync();
        }
예제 #18
0
        /// <summary>
        /// 发送往来单位公告
        /// </summary>
        /// <param name="units"></param>
        /// <param name="notice"></param>
        /// <returns></returns>
        public virtual async Task SendUnitsNotice(IEnumerable <Unit> units, Notice notice)
        {
            var remindLogManager = Resolve <RemindLogManager>();

            foreach (var unit in units)
            {
                //被提醒人微信openid
                var openId = "";
                try
                {
                    openId = (await FindUnitOpenId(unit))[0];
                }
                catch (Exception ex)
                {
                }
                if (!string.IsNullOrEmpty(openId))
                {
                    //进行发送提醒
                    //先产生一条提醒记录
                    var remindLog = new RemindLog()
                    {
                        RemindType = "往来单位公告提醒",
                        Name       = unit.UnitName,
                        Message    = notice.NoticeTitle,
                        TenantId   = AbpSession.TenantId
                    };
                    var remindLogId = await remindLogManager.InsertAndGetIdAsync(remindLog);

                    var arg = new SendWeiXinMessageJobArgs()
                    {
                        OpenId      = openId,
                        DataId      = notice.Id,
                        RemindLogId = remindLogId
                    };

                    BackgroundJobManager.Enqueue <SendUnitNoticeMessageJob, SendWeiXinMessageJobArgs>(arg);
                }
            }
        }
예제 #19
0
        private void RunDemo()
        {
            var adapter = CreateContainer();

            _serviceManager = new ApplicationServiceManager(adapter);
            _serviceManager.ServiceFailed += OnApplicationFailure;
            _serviceManager.Start();

            _jobManager            = new BackgroundJobManager(adapter);
            _jobManager.JobFailed += OnJobFailed;
            _jobManager.Start();


            //Press enter to shut down
            Console.ReadLine();

            _jobManager.Stop();
            _serviceManager.Stop();

            Console.WriteLine("Done, press enter to exit");
            Console.ReadLine();
        }
        public void consume_exceptions_thrown_by_event_subscribers()
        {
            var sl    = Substitute.For <IContainer>();
            var scope = Substitute.For <IContainerScope>();
            var job   = Substitute.For <IBackgroundJob>();
            var job2  = Substitute.For <IBackgroundJob>();

            job.When(x => x.Execute()).Do(x => { throw new SqlNullValueException(); });
            sl.CreateScope().Returns(scope);
            scope.ResolveAll <IBackgroundJob>().Returns(new[] { job, job2 });
            scope.Resolve(job.GetType()).Returns(job);
            scope.Resolve(job2.GetType()).Returns(job2);

            var sut = new BackgroundJobManager(sl);

            sut.StartInterval = TimeSpan.FromSeconds(0);
            sut.JobFailed    += (o, e) => { throw new Exception(); };
            sut.Start();
            Thread.Sleep(100);

            job2.Received().Execute();
        }
예제 #21
0
        public static void UseAutofacActivator(this BackgroundJobManager backgroundJobManager)
        {
            AutofacActivator autofacActivator = new AutofacActivator();

            backgroundJobManager.SetJobActivator(autofacActivator);
        }
예제 #22
0
 public Service(BackgroundJobManager backgroundJobManager)
 {
     _backgroundJobManager = backgroundJobManager;
 }
예제 #23
0
        public async Task RemoveSite(long id)
        {
            await _configurationService.RemoveSite(id);

            BackgroundJobManager.RemoveWorker(id);
        }
 public override void Stop()
 {
     BackgroundJobManager.Stop();
 }
 public override void Start()
 {
     BackgroundJobManager.Register <TestJob>(5000);
     BackgroundJobManager.Start();
 }
예제 #26
0
 public HelpController(IServiceScopeFactory scopeFactory, ILogger <HelpController> logger, BackgroundJobManager backgroundJobManager)
 {
     _scopeFactory         = scopeFactory;
     _logger               = logger;
     _backgroundJobManager = backgroundJobManager;
 }