问题标签 [rebus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - SqlConnection 和避免升级到 MSDTC
当我们需要在应用程序中进行数据库访问时,我们使用以下模式:
- 对于查询,我们有一个静态工厂类,它的方法
CreateOpenConnection
无非就是new SqlConnection(myConnectionString)
调用Open()
它。在我们进行查询之前调用此方法,并在查询返回后释放连接。 - 对于插入/更新/删除,我们使用工作单元模式,其中更改被批量化并通过如下调用提交到数据库
work.Commit()
:
工作。提交:
这似乎非常适合作为 Web 服务的一部分的一般用途,但是当我尝试将它与 Rebus 结合使用时,这给我带来了 MSDTC 麻烦。
据我所知,Rebus(当它处理队列中的消息时)创建一个新的TransactionScope
,以便在处理消息失败的情况下,可以回滚内容。现在,这本身到目前为止运行良好。我可以SqlConnection
在 Rebus 消息处理程序中打开一个新的,没有任何问题(但是,在同一个 Rebus 中使用我们的旧实体框架查询和手动 SqlConnectionsTransactionScope
不起作用,但我现在不认为这是一个问题)。但是昨天我问了以下问题:
答案似乎是使用 Rebus 的 saga 功能。我尝试实现它并对其进行配置,以便将 Rebus 传奇持久化到一个新的 SQL Server 数据库(具有不同的连接字符串)。据推测,使用该 SQL Server 持久性会打开SqlConnection
它自己的一个,因为任何时候我现在尝试创建一个SqlConnection
,我都会得到以下异常:
分布式事务管理器 (MSDTC) 的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 以进行网络访问。
就配置和性能开销而言,启用 MSDTC 是我非常非常想避免的事情。我可能错了,但这似乎也没有必要。
我认为这里发生的事情是 Rebus 创建了一个环境TransactionScope
,并且SqlConnection
它创建了该范围。当我尝试创建自己的SqlConnection
时,它也尝试加入该环境范围,并且由于涉及多个连接,它被提升为 MSDTC,但失败了。
我对如何解决这个问题有一个想法,但我不知道这是否是正确的做法。我会做的是:
- 添加
Enlist=false
到我的应用程序的连接字符串,以便它永远不会加入环境事务。 - 修改该
Commit
方法,使其不会创建新的TransactionScope
(我的连接将不再订阅该方法,因为我刚刚告诉过它不应该),但它使用conn.BeginTransaction
.
像这样:
我只是不确定这是否是正确的方法以及可能的缺点是什么。
有小费吗?
更新:澄清一下,这不是work.Commit()
给我带来问题的原因,我很确定它会起作用,但我从来没有到达那里,因为我的查询失败了。
失败的一个例子:
当 aTransactionScope
被 Rebus 创建时,以及 aSqlConnection
被 Rebus 打开后,它会被调用。打开my SqlConnection
后,它会尝试注册并崩溃
rebus - 如何让 Rebus 确定接口的端点而不是该接口的实现
当我发送由 AutoMapper.Mapper.DynamicMap() 创建的实例时,我遇到了一个错误,Rebus 似乎想要确定 DynamicMap 返回的代理类型的端点。这个实例将包含一个 T 的实现,假设 T 是一个接口类型。
有没有一种方法可以让 Rebus 确定接口类型 T 的端点,而不是 DynamicMap() 返回的实现类型?
我尝试使用 IDetermineMessageOwnership,但到目前为止没有运气。
提前致谢!
asp.net-mvc - 远程机器上的 Rebus MVC 订阅者
我在一台机器上运行了一个 rebus 服务器进程,在另一台机器上运行了一个 MVC 网站。我在 MVC 网站中使用本地输入和错误队列以及指向队列 myinputqueue@BusServer 的目标配置消息路由,当它运行时它发送订阅消息没有错误,但目标队列上似乎没有出现任何内容。接收总线从不确认它或创建订阅条目。
它使用 msmq 作为传输,所有队列都对所有人组具有完全权限。
我假设我没有正确配置某些东西,所以我希望这是提出问题的正确论坛。
感谢任何帮助。
c# - NServiceBus RegisterWebCallback 的 Rebus 等价物是什么?(如有)
我习惯于在 ASP/MVC 应用程序中注册回调,以便收到对事件发送/发布的响应的通知。为此,NServiceBus 提供了一些方法(Register/RegisterWebCallback),这些方法可以在由 bus.Send(..) 返回的 IAsync 上下文中调用。
Rebus方面是否有任何等价物?我可以定义一个 IHandleMessage,然后手动对收到的响应进行内部调度,但这似乎有点矫枉过正。
c# - Rebus pub/sub:从订阅者那里回复消息的异步方式?
我一直在尝试在我的一个应用程序中调整 Rebus。易于配置,一切正常。必须实现 PUB/SUB 通信以实现来自多个来源的响应。所以我所做的是,
Saga(Publisher)
SearchProductSaga : Saga<ProductSagaData>, IAmInitiatedBy<SearchProduct>, IHandleMessages<SearchStarted>, IHandleMessages<SearchProductResponse>, IHandleMessages<SearchCompleted>
Saga 的输入队列是 -ProductSaga.Queue
/li>Subscriber 1
包含以下执行顺序:Subscriber 2
包含相同的执行顺序但不同的业务逻辑:
现在,在这个实现之后,我期待的是:我现在应该能够通过接收SearchStarted
消息来计算正在执行的订阅者的数量SearchProductSaga
;一旦订阅者完成了业务逻辑,就会发送SearchCompleted
消息来指示 saga - 我们完成了。并MarkAsComplete();
在 saga 上执行。
但是我得到的结果非常失望。我发现,如果您要多次回复(如我的订阅者逻辑中的执行顺序),则从处理程序中,一旦处理程序执行范围结束,所有消息都会一起发送到发布者队列。
如果我错了,请纠正,如果有人有,请提出任何解决方案。我可以通过线程实现相同的目标。但我不想自己管理它,所以有什么异步方法可以在代码回复时将消息推送到队列中。
rebus - 如何手动配置 Rebus 以使用外部服务器
我有一个 Rebus 的 app.config 配置,它可以工作:
现在我想在代码而不是配置文件中设置地址和端点:
这不被接受,我不确定如何设置 IP 地址。欢迎任何帮助!
rebus - 为 rebus 设置用户名以用于连接到 messagebus
我有一个具有自定义登录的 MVC 应用程序。登录到 Web 应用程序后,显示名称将设置为要在应用程序中使用的用户名。
当我尝试连接到队列时,我收到消息队列无法解析我的用户名的异常。我希望消息队列通过 ApplicationPool 标识或站点标识而不是应用程序的登录用户连接。如何配置 rebus 以使用不同的用户(例如设置凭据)?
该错误给了我以下堆栈跟踪:
c# - 使用 Rebus 时,是否有一种获取消息(传输)ID 的干净方法?
在使用 Rebus+RabbitMq 时,我想访问传输级消息的 Id,这样我就可以跟踪我已经处理了哪些消息(通过持久化 Id)以实现某种幂等机制。
但是,我找不到一种“干净”的方式来访问消息的唯一 ID(在 RabbitMq 的标头中可用的 ID)。
看起来这是不可能的,但是,我可能会遗漏一些东西......就像隐藏在 Bus.Advanced.*..
;)
rebus - FakeMessageContext 抛出 NullReferenceException
我正在尝试为我的传奇编写单元测试。我使用 SagaFixture 来托管我的 Saga 并使用 FakeBus。我还使用了 FakeMessageContext,因为在 Saga 执行中我使用 MessageContext 来获取返回地址。
现在,当我试图在 Fixture 上调用 Handle 方法时,它会抛出 NullReferenceException 类型的异常。
粘贴代码如下:
搜索佐贺
SagaUnitTest
错误堆栈跟踪:在 Rebus.SagaContext..ctor(Guid id) 在 Rebus.Bus.Dispatcher.DispatchToHandler[TMessage](TMessage 消息,IHandleMessages 1 handler) at Rebus.Testing.SagaFixture
1.Handle[TMessage](TMessage 消息)
rebus - 从 rebus 处理程序发送响应时内存泄漏
我在我的 rebus 处理程序中看到了一个非常奇怪的行为,它自托管在 exe 中。在使用 bus.send 方法发送响应后,它会立即添加一些进程消耗的内存。我尝试使用内存配置文件查找对象图,发现 rebus 在某处以序列化格式保存响应消息。对象图显示在根的层次结构之下。
System.Message --> CachedBodyMessage --> 流
如果有人知道这件事,请给我一些指示。