Tag: hangfire

hangfire在每台服务器上重复工作

我有一种情况,我需要在hangfire中注册的定期作业,以便在群集中的每台服务器上运行。 (工作是在本地复制一些文件,因此需要定期在每台服务器上运行) 到目前为止,我已经尝试使用服务器名称的id注册相同的作业,从而导致n个服务器的n作业: RecurringJob.AddOrUpdate(Environment.MachineName, () => CopyFiles(Environment.MachineName), Cron.MinuteInterval(_delay)); 并且作业本身会检查它是否是正确的服务器,并且仅在以下情况下执行以下操作: public static void CopyFiles(string taskId) { if (string.IsNullOrWhiteSpace(taskId) || !taskId.Equals(Environment.MachineName)) { return; } // do stuff here if it matches our taskname } 这样做的问题是所有作业在第一台服务器上执行,标记为完成,因此其他服务器不执行。 有没有办法确保作业在所有服务器上运行? 或者有没有办法确保只有一台服务器可以处理给定的工作? 即在创建它的服务器上定位作业

我应该在哪里开始ASP.NET Core中的持久后台任务?

在我的Web应用程序(ASP.NET Core)中,我想在后台运行一个正在侦听远程服务器的作业,计算一些结果并将其推送到Pusher上的客户端(websocket)。 我不确定我应该在哪里开始这项任务。 目前我在最后开始 public void Configure(IApplicationBuilder app, IHostingEnvironment env) 在Startup.cs中 但我认为这有一些问题,在一个名为“Configure”的方法中启动后台作业是没有意义的。 我期待在某个地方找到一个Start方法 此外,当我尝试使用EF Core 生成初始数据库迁移文件时 ,它实际上执行该方法并启动我的任务..这显然没有任何意义: dotnet ef migrations add InitialCreate 从控制台运行它会创建迁移代码,该代码将用于根据我的数据模型在SQL Server上创建数据库。 为什么没有一种方法我可以开始一个任务? 我不希望这是一个单独的进程,它实际上不需要自己的进程,它本质上是Web服务器的一部分,因为它确实通过websocket与客户端(浏览器)进行通信,所以它是有道理的将其作为Web服务器的一部分运行。

.Net框架,用于管理单独机器上的后台运行流程

我有一个asp.mvc应用程序驻留在服务器上。从这个应用程序,我想启动一个有点长时间运行的进程,将是资源密集型操作。 所以我想要做的是我希望有一些像3这样的用户代理将在3台机器上运行,这个用户代理只会使用各自机器的资源。 就像在Hadoop中一样,我们有主节点和集群,其中任务在单个集群上运行,并且有1个主节点跟踪所有这些集群。 在Azure中,我们有运行任务的虚拟机,如果需要,Azure可以通过启动新实例来自动扩展以加速任务。 所以我想创建这样的基础设施,我可以从mvc应用程序向3个用户代理提交我的任务,我的应用程序将跟踪这些代理,例如哪个代理是免费的,哪个是被占用的,哪个不是这样的。 我希望从每个用户代理接收进度并在我的MVC应用程序上显示。 在.net中是否有任何框架可以管理这些后台运行操作(跟踪,启动,停止等等)或者应该采用什么方法? 更新:我不想为这个长时间运行的操作加载大量服务器,而且我想跟踪这个长时间运行的进程,就像他们正在做的那样,错误等等。 以下是我正在思考的方法,我不知道哪个更有意义: 1)以2-3计算机内部代理的forms安装Windows服务,以利用resp资源并打开与此代理的tcp / ip连接,除非并且直到长时间运行的过程完成。 2)使用hangfire在IIS线程之外运行这个长时间运行的进程,但我想这会将负载放在服务器上。 我想知道上述方法可能存在的问题,以及是否有更好的方法。

在策略设计模式的情况下,Hangfire服务器无法选择作业

我有以下申请: 1) Mvc应用程序 :Hangfire客户端,我将在那里排队作业和主持仪表板。这个应用程序将包含我的类库的参考。 2) 控制台应用程序 :Hangfire服务器将存在于此控制台应用程序中。 3) 类库 :hangfire服务器(控制台应用程序)和hangfire客户端(asp.net mvc)之间的共享库,我的长时间运行的代码将驻留在该库中.Hangfire服务器将执行该库的代码。 我在战略设计模式下的类库中有如下结构。 代码取自以下: 参考: 接口: public interface IOperation { Output Process(Input input); bool AppliesTo(Type type); } public interface IOperationStrategy { Output Process(Type type,Input input); } 操作: public class Add : IOperation { public bool AppliesTo(Type type) { return typeof(Add).Equals(type); } public Output Process(Input input) { […]

使用不带HTTP请求的PerRequestLifetimeManager解析类型

我有一个使用IoC与Unity的MVC应用程序,我有一个使用PerRequestLifetimeManager定义的DbContext实现。 该对象通过工作单元实现注入控制器。 container.RegisterType(new PerRequestLifetimeManager()); 到目前为止,一切都运行良好,应用程序有相当数量的模型和控制器。 现在我最近要做的是为这个应用程序添加一些自动化任务,为此我想使用HangFire 。 我在我的项目中设置了这个库并创建了一个简单的任务,我想在其中调用一个需要DBContext的动作。 RecurringJob.AddOrUpdate(() => MyTask(), Cron.Daily); 和MyTask()定义如下 public void MyTask() { var taskManager = container.Resolve(); taskManager.DoSomething(); } 任务管理器需要一个DBContext实例(通过Unit of Work对象) public class TaskManager : ITaskManager { public TaskManager(IUnitOfWork uow) { … } } public class UnitOfWork : IUnitOfWork { public class UnitOfWork(DBContext context) { … } } 现在我遇到的问题是每当任务运行时我都会得到exception,说PerRequestLifetimeManager can […]