我们使用 Rebus 作为 Sql 服务器的队列系统。对于不同类型的消息,我们有多个收件人。每条消息都可以由特定类型的多个工作人员处理。一条消息只能由一名工人处理/处理(第一个拉出它的工人)。如果工作人员由于某种原因无法完成它,它会使用超时服务推迟消息。
如果我理解正确,它就会变成一个 TimeoutRequest 并放入超时表中。当需要重新运行时,它会在作为原始消息重新引入队列之前变成 TimeoutReply。
我们遇到的问题是,当它变成 TimeoutReply 时,所有工作人员都会拿起它并创建原始消息。当超时时,一条原始消息变成多条消息(与工作人员一样多)。
我们的 Rebus 设置如下:
“服务器端”:
var adapter = new BuiltinContainerAdapter();
Configure.With(adapter)
.Logging(l => l.Log4Net())
.Transport(t => t.UseSqlServerInOneWayClientMode(connectionString).EnsureTableIsCreated())
.CreateBus()
.Start();
return adapter;
Run Code Online (Sandbox Code Playgroud)
“工人方面”:
_adapter = new BuiltinContainerAdapter();
Configure.With(_adapter)
.Logging(l => l.Log4Net())
.Transport(t => t.UseSqlServer(_connectionString, _inputQueue, "error")
.EnsureTableIsCreated())
.Events(x => x.AfterMessage += ((bus, exception, message) => SendWorkerFinishedJob(exception, message)))
.Events(x => x.BeforeMessage += (bus, message) => SignalWorkerStartedJob(message))
.Behavior(x => x.SetMaxRetriesFor<Exception>(0))
.Timeouts(x => x.StoreInSqlServer(_connectionString, "timeouts").EnsureTableIsCreated())
.CreateBus().Start(numberOfWorkers);
Run Code Online (Sandbox Code Playgroud)
非常感谢在解决问题或提供理解方面的任何帮助!
在我们的数据模型中,我们有分层数据。例如,我们有以下结构:
Product : Category (one to many)
Category : CategoryType (one to many)
Run Code Online (Sandbox Code Playgroud)
如果我们想要某个产品的相关类别以及每个类别的相关类别类型,我们可以使用这样的 url 来构建它:
<urlbase>/Products(1)?$expand=Category($expand=CategoryType)
Run Code Online (Sandbox Code Playgroud)
这在浏览器中工作正常。问题是如何在 simple.odata.client OData v4 中做到这一点?我们正在尝试这个,但没有让它工作:
var client = new ODataClient(ConfigSettingsProvider.ODataBaseUri);
var client
.For<Product>()
.Filter(p=> p.Id == 1)
.Expand(p => p.Categories)
.Expand(c => c.CategoryTypes)
.FindEntriesAsync();
Run Code Online (Sandbox Code Playgroud)