- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下申请:
1) Mvc app : Hangfire 客户端,我将从那里排队作业和主机 仪表板。此应用程序将包含我的类库的引用。
2) Console App : Hangfire 服务器将存在于这个控制台应用程序中。
3) 类库:hangfire 服务器(控制台应用程序)和 hangfire 客户端(asp.net mvc)之间的共享库,我的长期运行代码将驻留在其中。Hangfire 服务器 将执行该库的代码。
我在类库中的结构如下 strategy design pattern.
代码取自:Reference:
接口(interface):
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)
{
// Implementation
return new Output();
}
}
public class Multiply : IOperation
{
public bool AppliesTo(Type type)
{
return typeof(Multiply).Equals(type);
}
public Output Process(Input input)
{
// Implementation
return new Output();
}
}
策略:
public class OperationStrategy : IOperationStrategy
{
private readonly IOperation[] operations;
public OperationStrategy(params IOperation[] operations)
{
if (operations == null)
throw new ArgumentNullException(nameof(operations));
this.operations = operations;
}
public Output Process(Type type, Input input)
{
var op = operations.FirstOrDefault(o => o.AppliesTo(type));
if (op == null)
throw new InvalidOperationException($"{operation} not registered.");
return op.Process(input);
}
}
用法:
// Do this with your DI container in your composition
// root, and the instance would be created by injecting
// it somewhere.
var strategy = new OperationStrategy(
new Add(), // Inject any dependencies for operation here
new Multiply()); // Inject any dependencies for operation here
// And then once it is injected, you would simply do this.
var input = new Input { Value1 = 2, Value2 = 3 };
BackgroundJob.Enqueue(() => strategy.Process(typeof(Add), input));
但是 hangfire 服务器无法选择作业,当我检查 state table
时,我看到如下错误:
"FailedAt": "2018-03-21T13:14:46.0172303Z", "ExceptionType": "System.MissingMethodException", "ExceptionMessage": "No parameterless constructor defined for this object.", "ExceptionDetails": "System.MissingMethodException: No parameterless constructor defined for this object.\r\n at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)\r\n at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)\r\n at System.Activator.CreateInstance(Type type, Boolean nonPublic)\r\n at System.Activator.CreateInstance(Type type)\r\n at Hangfire.JobActivator.SimpleJobActivatorScope.Resolve(Type type)\r\n at Hangfire.Server.CoreBackgroundJobPerformer.Perform(PerformContext context)\r\n at Hangfire.Server.BackgroundJobPerformer.<>c__DisplayClass8_0.b__0()\r\n at Hangfire.Server.BackgroundJobPerformer.InvokePerformFilter(IServerFilter filter, PerformingContext preContext, Func 1 continuation)\r\n at Hangfire.Server.BackgroundJobPerformer.PerformJobWithFilters(PerformContext context, IEnumerable`1 filters)\r\n at Hangfire.Server.BackgroundJobPerformer.Perform(PerformContext context)\r\n at Hangfire.Server.Worker.PerformJob(BackgroundProcessContext context, IStorageConnection connection, String jobId)"
我不知道应该为这个结构设置什么 hangfire,因为我这里没有涉及任何 IOC 容器。
有人可以帮我解决这个问题吗?
演示项目:https://www.dropbox.com/s/bfjr58y6azgmm3w/HFDemo.zip?dl=0
最佳答案
答案就在异常中
没有为此对象定义无参数构造函数。
您的 OperationStrategy
没有无参数构造函数,因此当 Hangfire 尝试创建此对象时,它不能 - 它通过反射来创建。Hangfire 无法访问您在安排作业时使用的实例,它会尝试重新创建它。这是它做不到的。
您可以添加一个无参数的构造函数,并使 Operations
成为一个公共(public)集合。
这将使您能够像当前一样使用您的 ctor,但也允许对象被序列化,由 Hangfire 存储,然后在它尝试运行时反序列化和创建。
public class OperationStrategy : IOperationStrategy
{
// paramaterless ctor
public OperationStrategy()
{
Operations = new List<Operation>();
}
public OperationStrategy(params IOperation[] operations)
{
if (operations == null)
throw new ArgumentNullException(nameof(operations));
Operations = operations;
}
public Output Process(Type type, Input input)
{
var op = Operations.FirstOrDefault(o => o.AppliesTo(type));
if (op == null)
throw new InvalidOperationException($"{operation} not registered.");
return op.Process(input);
}
//property - this can be deserialized by Hangfire
public List<IOperation> Operations {get; set;}
}
关于c# - 在策略设计模式的情况下,Hangfire 服务器无法选择工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49514099/
我有一个非常复杂的 sql 脚本来清理我的数据库,并且会不时手动运行。脚本运行后,我必须立即启动一个经常性的 hangfire 作业,该作业通常每天只执行一次。 为了不忘记运行脚本,我想直接从sql脚
我有 2 个 hangfire 实例/服务器在运行。两者都指向同一个 hangfire 数据库。如何限制其中一个 hangfire 实例仅从特定队列中获取作业并忽略其他队列? 谢谢 最佳答案 启动实例
我有 2 个 hangfire 实例/服务器在运行。两者都指向同一个 hangfire 数据库。如何限制其中一个 hangfire 实例仅从特定队列中获取作业并忽略其他队列? 谢谢 最佳答案 启动实例
我在使用相同数据库的两台服务器上运行了几个 Hangfire 实例。每个实例根据基于服务器名称的某些标准提交要运行的作业,以便没有两个实例运行相同的作业。我注意到它们正在运行相同的作业,这意味着当一个
nuget 包之间有什么区别 HangFire.AspNetCore和 HangFire和 HangFire.core ? 看来我可以将 hangfire 与 ASP .NET MVC Core 项目
我是 hangfire 的新手,我正在尝试设置一种方法来使用我现有的 serilog 记录器在 asp.net web api 中记录事件。这是我的记录器类: public static class
出于冗余原因,我需要使用相同的数据库运行同一服务的多个实例。 我发现了一些关于“Hangfire 多个实例”的问题,但出于不同的目的,然后是我的:通常是关于在同一数据库上为不同的任务运行多个实例,或与
此 documentation说你可以使用 Queue 指定一个队列要调用的方法的属性。这假设您总是希望在同一个队列上执行一个方法。调用 Enqueue 的进程有没有办法指定将作业放入的队列名称(有效
我有一个现有的 api,它按线程存储数据,并使用 HttpContext.Current 进行检索。 . 我正在尝试重构这个类以从 hangfire 作业中调用——我想知道是否有一个等效的静态方法来检
迁移到 asp.net core 2.1 破坏了我们的 Hangfire 作业设置。 在 Program.cs 的 Main 方法中,我们有类似的内容 var webHost = BuildWebHo
根据 hangfire documentation Starting from Hangfire 1.3.0, you are not required to do anything, if your
我刚刚开始使用Hangfire,现在我很喜欢它。 我了解到,Hangfire将成功工作的历史记录保留了1天,之后将其清除。 有没有一种方法可以自定义此默认行为并将历史记录保留任何持续时间(例如7天)?
我们的网络应用程序允许最终用户在 UI 上设置重复作业的队列。 (我们为每个服务器创建一个队列(使用服务器名称)并允许用户选择要运行的服务器)作业的注册方式: RecurringJob.AddOrUp
我有一个应用程序,具有 Multi-Tenancy 。我想在用户上下文下创建后台作业,但我找不到实现它的好方法。 我将解释一下我的架构。我正在使用包含 UserID 的接口(interface) IC
我想将 QUARTZ 作业转换为 hangfire 我有一个带有 Execute 方法的类。 如何在Hangfire中调用该方法。我尝试类似的事情 public static string CRON_
当使用 Hangfire 排队和处理后台作业时,我能够导致发生可重现的内存不足异常。 . 这些作业是简单的 Console.WriteLine 调用,因此我不希望堆内存以这种方式增加。 我的配置是否不
我有 ASP.NET Web API 应用程序。该应用程序使用 Unity 作为 IoC 容器。该应用程序也在使用 Hangfire,我正在尝试配置 Hangfire 以使用 Unity。 所以基于d
从 1.7.8 版本开始,可以将结果从父作业传递到 Hangfire 中的延续作业。但是没有提供文档或示例。在浏览代码时,我意识到我需要使用带有 pushResults: true 参数的 Conti
有没有人使用过 Hangfire 的多个实例? (在不同的应用程序中)使用相同的 SQL DB 进行配置。因此,我不想为每个 hangfire 实例创建新的 SQL 数据库,而是想与多个实例共享同一个
从 1.7.8 版本开始,可以将结果从父作业传递到 Hangfire 中的延续作业。但是没有提供文档或示例。在浏览代码时,我意识到我需要使用带有 pushResults: true 参数的 Conti
我是一名优秀的程序员,十分优秀!