让nihbernate会议永远开放?(Keep an nihbernate session open forever?)
我正在使用石英和nhibernate并遇到了问题。 通常情况下,我的所有nhibernate会话都在Web请求结束时关闭,但是我有一个调度程序在应用程序启动时启动,我需要传入一个我认为永远不应该关闭的nhibernate会话。
我不确定该怎么做。
Ninject
public class NhibernateSessionFactoryProvider : Provider<ISessionFactory> { protected override ISessionFactory CreateInstance(IContext context) { var sessionFactory = new NhibernateSessionFactory(); return sessionFactory.GetSessionFactory(); } } public class NhibernateModule : NinjectModule { public override void Load() { Bind<ISessionFactory>().ToProvider<NhibernateSessionFactoryProvider>().InSingletonScope(); Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope(); } }
Global.aspx
protected void Application_Start() { // Hook our DI stuff when application starts IKernel kernel = SetupDependencyInjection(); // get the reminder service HERE IS WHERE THE PROBLEMS START IScheduledRemindersService scheduledRemindersService = kernel.Get<IScheduledRemindersService>(); scheduledRemindersService.StartTaskRemindersSchedule(); RegisterMaps.Register(); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } public IKernel SetupDependencyInjection() { IKernel kernel = CreateKernel(); // Tell ASP.NET MVC 3 to use our Ninject DI Container DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); return kernel; } protected IKernel CreateKernel() { var modules = new INinjectModule[] { new NhibernateModule(), new ServiceModule(), new RepoModule() }; return new StandardKernel(modules); }
//导致我出现问题的服务 Ninject将绑定reminderRepo并给它一个nihbernate会话。
private readonly IReminderRepo reminderRepo; private readonly ISchedulerFactory schedulerFactory; public ScheduledRemindersService(IReminderRepo reminderRepo) { this.reminderRepo = reminderRepo; schedulerFactory = new StdSchedulerFactory(); } public void StartTaskRemindersSchedule() { IScheduler scheduler = schedulerFactory.GetScheduler(); scheduler.Start(); JobDetail jobDetail = new JobDetail("TaskRemindersJob",null,typeof(TaskReminderJob)); jobDetail.JobDataMap["reminderRepo"] = reminderRepo; DateTime evenMinuteDate = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow); SimpleTrigger trigger = new SimpleTrigger("TaskRemindersTrigger", null, DateTime.UtcNow, null, SimpleTrigger.RepeatIndefinitely, TimeSpan.FromMinutes(1)); scheduler.ScheduleJob(jobDetail, trigger); }
因此,我需要将提醒Repo传递到上面的工作中
jobDetail.JobDataMap["reminderRepo"] = reminderRepo;
这是你将一些东西传递给工作的唯一方法。 每次执行计划时都会重新创建一个作业,我假设它使用了我发送的相同提醒。
我的服务层中的代码永远不会再次执行,当然应用程序也会启动(除非我重新部署该站点)
工作
public class TaskReminderJob : IJob { public void Execute(JobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; ReminderRepo reminderRepo = dataMap["reminderRepo"] as ReminderRepo; if (context.ScheduledFireTimeUtc.HasValue && context.NextFireTimeUtc.HasValue && reminderRepo != null) { DateTime start = context.ScheduledFireTimeUtc.Value; DateTime end = context.NextFireTimeUtc.Value; List<PersonalTaskReminder> personalTaskReminders = reminderRepo.GetPersonalTaskReminders(start, end); if (personalTaskReminders.Count > 0) { reminderRepo.DeletePersonalTaskReminders(personalTaskReminders.Select(x => x.ReminderId).ToList()); } } }
提醒回购。 (当这个repo被实例化时,应该给出一个会持续到请求结束的会话)
public class ReminderRepo : IReminderRepo { private readonly ISession session; public ReminderRepo(ISession session) { this.session = session; } public List<PersonalTaskReminder> GetPersonalTaskReminders(DateTime start, DateTime end) { List<PersonalTaskReminder> personalTaskReminders = session.Query<PersonalTaskReminder>().Where(x => x.DateToBeSent <= start && x.DateToBeSent <= end).ToList(); return personalTaskReminders; } public void DeletePersonalTaskReminders(List<int> reminderId) { const string query = "DELETE FROM PersonalTaskReminder WHERE ReminderId IN (:reminderId)"; session.CreateQuery(query).SetParameterList("reminderId", reminderId).ExecuteUpdate(); } public void Commit() { using (ITransaction transaction = session.BeginTransaction()) { transaction.Commit(); } } }
所以我需要一些方法让我的提醒保持会话活着。 我所有其他回购的所有其他会议应该像我现在一样。 只有这一个似乎需要永远活着。
编辑
我试图每次都有一个新的会话,所以我传递了IsessionFactory。 可能不是100%最好,但这是我能弄清楚如何获得一些新会议的唯一方法。
但是我不知道我的会话是否仍在通过ninject关闭,因为我现在手动传递会话。 我现在想,但无法验证。
**private readonly ISessionFactory sessionFactory;** private readonly ISchedulerFactory schedulerFactory; public ScheduledRemindersService(ISessionFactory sessionFactory) { **this.sessionFactory = sessionFactory;** schedulerFactory = new StdSchedulerFactory(); } public void StartTaskRemindersSchedule() { IScheduler scheduler = schedulerFactory.GetScheduler(); scheduler.Start(); JobDetail jobDetail = new JobDetail("TaskRemindersJob",null,typeof(TaskReminderJob)); **jobDetail.JobDataMap["reminderRepo"] = sessionFactory;** DateTime evenMinuteDate = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow); SimpleTrigger trigger = new SimpleTrigger("TaskRemindersTrigger", null, DateTime.UtcNow, null, SimpleTrigger.RepeatIndefinitely, TimeSpan.FromMinutes(1)); scheduler.ScheduleJob(jobDetail, trigger); }
所以我的global.aspx是一样的但是因为ninject现在看到“ScheduledRemindersService”现在接受了一个nhibernate会话工厂,它为我绑定了一个我可以使用的工具。
然后我把它传递给工作。
public void Execute(JobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; ISessionFactory sessionFactory = dataMap["reminderRepo"] as ISessionFactory; if (sessionFactory != null) { ISession openSession = sessionFactory.OpenSession(); ReminderRepo reminderRepo = new ReminderRepo(openSession); } }
然后我将它传递给我的ReminderRepo所以我猜它忽略了来自ninject的自动会话绑定但是我不是100%肯定因此我不确定我的会话是否被关闭。
I am using quartz and nhibernate and ran into a problem. Normally I have all my nhibernate sessions close on finish of a web request but I have a scheduler that starts on application start and I need to pass in a nhibernate session that I think should never be closed.
I am unsure how to do that.
Ninject
public class NhibernateSessionFactoryProvider : Provider<ISessionFactory> { protected override ISessionFactory CreateInstance(IContext context) { var sessionFactory = new NhibernateSessionFactory(); return sessionFactory.GetSessionFactory(); } } public class NhibernateModule : NinjectModule { public override void Load() { Bind<ISessionFactory>().ToProvider<NhibernateSessionFactoryProvider>().InSingletonScope(); Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope(); } }
Global.aspx
protected void Application_Start() { // Hook our DI stuff when application starts IKernel kernel = SetupDependencyInjection(); // get the reminder service HERE IS WHERE THE PROBLEMS START IScheduledRemindersService scheduledRemindersService = kernel.Get<IScheduledRemindersService>(); scheduledRemindersService.StartTaskRemindersSchedule(); RegisterMaps.Register(); AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); } public IKernel SetupDependencyInjection() { IKernel kernel = CreateKernel(); // Tell ASP.NET MVC 3 to use our Ninject DI Container DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); return kernel; } protected IKernel CreateKernel() { var modules = new INinjectModule[] { new NhibernateModule(), new ServiceModule(), new RepoModule() }; return new StandardKernel(modules); }
// service that is causing me the problems. Ninject will bind reminderRepo and give it an nihbernate session.
private readonly IReminderRepo reminderRepo; private readonly ISchedulerFactory schedulerFactory; public ScheduledRemindersService(IReminderRepo reminderRepo) { this.reminderRepo = reminderRepo; schedulerFactory = new StdSchedulerFactory(); } public void StartTaskRemindersSchedule() { IScheduler scheduler = schedulerFactory.GetScheduler(); scheduler.Start(); JobDetail jobDetail = new JobDetail("TaskRemindersJob",null,typeof(TaskReminderJob)); jobDetail.JobDataMap["reminderRepo"] = reminderRepo; DateTime evenMinuteDate = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow); SimpleTrigger trigger = new SimpleTrigger("TaskRemindersTrigger", null, DateTime.UtcNow, null, SimpleTrigger.RepeatIndefinitely, TimeSpan.FromMinutes(1)); scheduler.ScheduleJob(jobDetail, trigger); }
So I need to pass in the reminderRepo into the job as I am doing above
jobDetail.JobDataMap["reminderRepo"] = reminderRepo;
It's the only way you can pass something into a job. Everytime the schedule gets executed a job is recreated and I am assuming it uses the same reminderRepo that I sent in.
My code in the service layer never gets executed again and of course the application start as well(unless I redeploy the site)
Job
public class TaskReminderJob : IJob { public void Execute(JobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; ReminderRepo reminderRepo = dataMap["reminderRepo"] as ReminderRepo; if (context.ScheduledFireTimeUtc.HasValue && context.NextFireTimeUtc.HasValue && reminderRepo != null) { DateTime start = context.ScheduledFireTimeUtc.Value; DateTime end = context.NextFireTimeUtc.Value; List<PersonalTaskReminder> personalTaskReminders = reminderRepo.GetPersonalTaskReminders(start, end); if (personalTaskReminders.Count > 0) { reminderRepo.DeletePersonalTaskReminders(personalTaskReminders.Select(x => x.ReminderId).ToList()); } } }
Reminder Repo. (When this repo gets instantiated a session should be given that will live till the end of the request)
public class ReminderRepo : IReminderRepo { private readonly ISession session; public ReminderRepo(ISession session) { this.session = session; } public List<PersonalTaskReminder> GetPersonalTaskReminders(DateTime start, DateTime end) { List<PersonalTaskReminder> personalTaskReminders = session.Query<PersonalTaskReminder>().Where(x => x.DateToBeSent <= start && x.DateToBeSent <= end).ToList(); return personalTaskReminders; } public void DeletePersonalTaskReminders(List<int> reminderId) { const string query = "DELETE FROM PersonalTaskReminder WHERE ReminderId IN (:reminderId)"; session.CreateQuery(query).SetParameterList("reminderId", reminderId).ExecuteUpdate(); } public void Commit() { using (ITransaction transaction = session.BeginTransaction()) { transaction.Commit(); } } }
So I need some way of keeping the session alive for my reminders. All my other sessions for all my other repos should be as I have it now. It's only this one that seems to need to live forever.
Edit
I tried to get a new session each time so I am passing the IsessionFactory around. Probably not 100% best but it was the only way I could figure out how to get some new sessions.
I however do not know if my session are being closed through ninject still since I am manually passing in the session now. I thinking now but cannot verify.
**private readonly ISessionFactory sessionFactory;** private readonly ISchedulerFactory schedulerFactory; public ScheduledRemindersService(ISessionFactory sessionFactory) { **this.sessionFactory = sessionFactory;** schedulerFactory = new StdSchedulerFactory(); } public void StartTaskRemindersSchedule() { IScheduler scheduler = schedulerFactory.GetScheduler(); scheduler.Start(); JobDetail jobDetail = new JobDetail("TaskRemindersJob",null,typeof(TaskReminderJob)); **jobDetail.JobDataMap["reminderRepo"] = sessionFactory;** DateTime evenMinuteDate = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow); SimpleTrigger trigger = new SimpleTrigger("TaskRemindersTrigger", null, DateTime.UtcNow, null, SimpleTrigger.RepeatIndefinitely, TimeSpan.FromMinutes(1)); scheduler.ScheduleJob(jobDetail, trigger); }
So my global.aspx is the same but since ninject now sees that "ScheduledRemindersService" now takes in a nhibernate session factory it binds one for me that I can use.
I then pass it off to the job.
public void Execute(JobExecutionContext context) { JobDataMap dataMap = context.JobDetail.JobDataMap; ISessionFactory sessionFactory = dataMap["reminderRepo"] as ISessionFactory; if (sessionFactory != null) { ISession openSession = sessionFactory.OpenSession(); ReminderRepo reminderRepo = new ReminderRepo(openSession); } }
I then pass it into my ReminderRepo so I am guessing it ignores the auto session binding from ninject but I am not 100% sure thus I am not sure if my sessions are being closed.
原文:https://stackoverflow.com/questions/6012291
最满意答案
使用
script2.text = "..."
或script2.innerHTML = "..."
而不是script2.value = "..."
。这是一个使用以下代码测试所有三个赋值的jsfiddle: http : //jsfiddle.net/7nsGp/
var script2 = document.createElement( 'script' ); script2.value = 'alert("assign value worked");'; $('head').prepend(script2); var script1 = document.createElement( 'script' ); script1.text = 'alert("assign text worked");'; $('head').prepend(script1); var script0 = document.createElement( 'script' ); script0.innerHTML = 'alert("assign innerHTML worked");'; $('head').prepend(script0);
在Chrome和Firefox上,分配
.text
或.innerHTML
,但不是.value
。建议:通过在测试期间向脚本文本的末尾附加
alert('script ran')
来验证脚本片段是否正在执行。script2.value = "var _gaq = _gaq || []; ... ; alert('script ran');";
Use
script2.text = "..."
orscript2.innerHTML = "..."
instead ofscript2.value = "..."
.Here's a jsfiddle that tests using all three assignments with the following code: http://jsfiddle.net/7nsGp/
var script2 = document.createElement( 'script' ); script2.value = 'alert("assign value worked");'; $('head').prepend(script2); var script1 = document.createElement( 'script' ); script1.text = 'alert("assign text worked");'; $('head').prepend(script1); var script0 = document.createElement( 'script' ); script0.innerHTML = 'alert("assign innerHTML worked");'; $('head').prepend(script0);
On both Chrome and Firefox, assigned either
.text
or.innerHTML
, but not.value
.Suggestion: Verify that your script snippet is executing by appending an
alert('script ran')
to the end of your script text during testing.script2.value = "var _gaq = _gaq || []; ... ; alert('script ran');";
相关问答
更多-
我已实施了测量协议( https://developers.google.com/analytics/devguides/collection/protocol/v1/reference )。 I have implemented the Measurement Protocol (https://developers.google.com/analytics/devguides/collection/protocol/v1/reference).
-
谷歌分析 - 一个页面上的多个跟踪器(cookie冲突)(google analytics - multiple trackers on one page (cookie conflict))[2022-05-18]
现在使用新的异步跟踪代码变得简单。 :) https://developers.google.com/analytics/devguides/collection/gajs/#MultipleCommands Now made easy with the new asynchronous tracking code. :) https://developers.google.com/analytics/devguides/collection/gajs/#MultipleCommands -
我首先会在Analytics中使用自己的跟踪代码创建一个新属性。 然后,在您添加到客户网站的JS代码段中,添加您的Google Analytics跟踪代码。 这样您就可以在自己的网站上看到任何内容。 下一步是添加分析事件跟踪。 您可以捕获搜索词并将其发送到事件中的分析。 然后使用cxApi.chooseVariation(); 获取变量的数字(将为返回的访问者返回相同的数字)并加载小部件的相应版本。 如果全部正确实施, ...
-
尝试这个: $(document).ready(function() { $('.wp-social-login-provider-facebook').on('click', function() { ga('send', 'event', 'Navigation', 'WSL-Facebook'); }); }); 基本上,不是试图通过属性值将事件添加到onclick属性,而是直接通过jQuery添加单击处理程序。 Try this: $(document).ready(functio ...