我目前正在使用SignalR和ASP.Net MVC 4应用程序。我正在使用来自RabbitMQ的消息,实质上需要在新消息到达队列时通过SignalR进行广播。问题是在正常使用情况下,没有一个长寿命对象可以在IIS中存在的地方。我每秒收到大约1000封邮件,因此通过从外部队列监控服务/应用程序发出请求将邮件推送到IIS的标准方法几乎会杀死我的IIS。
我总体想到在后台线程上创建单例实例。不确定在iis中执行此操作的最佳方法是什么,如果应用程序死亡,则希望自动重新创建单例。
答案 0 :(得分:1)
你是否认为你会在后台线程中有一些东西会经常检查邮件?
我过去曾使用quartz.net创建预定作业。它们设置起来相当简单。你基本上可以说,从y时开始每隔x个间隔执行一次这个工作。无论您使用何种解决方案,您都可能需要添加错误处理。我认为你的石英作业会继续尝试执行每个x间隔,即使它抛出一个异常,但你需要确保你首先清除导致异常的任何东西。否则每次运行都会失败。 I.E.就好像你的信息有问题,每次尝试播放时都会出错。
注意您的应用程序的IdleTimeout。如果IIS让您的Web应用程序处于睡眠状态,那么您的后台工作者/石英作业中的单例也会进入睡眠状态。如果将IdleTimeout设置为0,您的应用程序将永远不会睡眠。
如果您在Global.asax.cs Application_Start()中初始化您的工作/工作人员,您的工作将始终在您的网络应用程序启动时启动。
首次部署应用程序或更新应用程序或重新启动应用程序时,您需要确保应用程序正在运行。不确定IIS中是否有此设置。但通常您的应用程序在发出请求之前不会启动。祝好运。如果您找到解决方案,请告诉我。
如果您因某些其他原因导致应用崩溃,那么同样的交易。您需要一些东西来重新启动您的网络应用。
希望有所帮助!