我正在尝试排队或安排作业(例如发送邮件)。这是我在试错过程中观察到的:
- 在开发和生产环境中,我们使用相同的 Redis 服务器。 Redis 配置相同,双方只使用一个队列:
default
.因此,当其他开发人员调试代码时,他们成为监听默认队列的服务器。 - 当我尝试对我最近在我的机器上开发的作业进行排队或调度并对其进行调试时,它没有执行,它出现在“重试”部分。根本找不到方法。重试 10 次后,它失败了。 (顺便说一下,我正在使用
Enqueue<T>
和Schedule<T>
方法。) - 当我在 Startup.cs 中引入一个新队列(例如测试),并使用
BackgroundJobClient
将新作业加入队列时并使用EnqueuedState("test")
指定队列名称, 立即执行。
在所有这些之后,我没有得到作业(函数)和队列之间的关系。有人可以解释为什么我的作业在“默认”队列中执行时会失败,以及为什么在不同队列中执行时会成功吗?
另外,有人能解释一下为什么我在尝试运行作业时遇到“找不到方法”的问题吗?
我问这些问题,是因为我想了解所有这些问题背后的真正原因,而不是去推断。
最佳答案
不确定这是否会回答,但我遇到了同样的问题并发现了一些事情
当您使用
Schedule
(或 Recurring Jobs)时不支持队列名称,只有当您直接Enqueue
时才支持它们(除非您自定义创建一个系统来支持它). See this ,它很旧但应该仍然有效。如果您有多个运行 hangfire 的服务来管理不同类型的作业,请确保为每个服务提供不同的 hangfire 数据库来存储它们的数据。如果将它们全部放在同一个数据库中,当作业需要时启动 HF 将搜索默认队列以运行它(除非您指定队列名称,但..请参见上文)。
但每个服务都会有一个带有默认队列的 HF 服务器,并且没有指示哪一个是正确的......所以 HF 可能会结束尝试在另一个服务的服务器上运行它,但不会有任何了解作业调用的内容,因为它没有链接到正确的代码库 (again,see this) . 另一方面,如果您指定队列的名称,并且该名称仅在“链接”到正确代码的服务器上,HF 将在该队列上运行该作业(同样,只要您没有安排它),找到它需要的东西,一切都会起作用
希望能帮到你
关于c# - 使用默认队列时类型不包含方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47486767/