小编Ren*_*eno的帖子

如何使Azure服务总线客户端在发送消息时不参与环境事务

据我所知,Azure 服务总线不支持 DTC,如果您尝试这样做,您会收到如下异常:“其他资源管理器/DTC 不支持本地事务。” '

我的问题是,我需要向服务总线发送消息,并且代码可能与可能的数据库操作一起在事务范围内执行。但服务总线不需要特别成为该事务的一部分;因此,这里并不真正需要 DTC。然而,服务总线客户端似乎自动参与环境事务,从而将该事务提升为 DTC。

例子:

这运行正确(服务总线代码是事务中唯一的代码):

        using (var tx = new TransactionScope())
        {
            //A simple Azure Bus operation
            var builder = new ServiceBusConnectionStringBuilder(connectionString);
            var queueClient = new QueueClient(builder);
            var messageBody = new Message(Encoding.UTF8.GetBytes("Hello"));
            messageBody.MessageId = Guid.NewGuid().ToString("N");
            queueClient.SendAsync(messageBody).GetAwaiter().GetResult();                

            tx.Complete();
        }
Run Code Online (Sandbox Code Playgroud)

但从另一个系统参与(这里是 Sql 连接)的那一刻起,“ Azure 服务总线不支持 DTC ”-抛出异常:

        using (var tx = new TransactionScope())
        {
            //A simple DB operation
            SqlConnection sqlConnection = new SqlConnection(dbConnectionString);
            sqlConnection.Open();
            SqlCommand cmd = new SqlCommand("INSERT INTO [dbo].[Table_1]([Name]) values ('Hello')", sqlConnection);
            cmd.ExecuteNonQuery();

            //A …
Run Code Online (Sandbox Code Playgroud)

c# azure azureservicebus .net-core

3
推荐指数
1
解决办法
1030
查看次数

在 Azure Function 中按顺序处理服务总线消息(无并发调用)

我需要通过“Azure 函数”读取和处理来自 Azure 服务总线队列的消息。消息应该以正确的顺序处理,因此我需要避免并发调用。

我为此使用 Azure Function 服务总线触发器(它是队列的唯一订阅者)。根据文档,我将“servicebus/maxConcurrentCalls”(在 host.json 中)设置配置为 1。在此之上,我用“Singleton”属性装饰了该函数。除此之外,不同线程似乎以随机顺序处理消息。我在这里想念什么?或者我误解了什么?

我使用的文档: https ://github.com/Azure/azure-webjobs-sdk/wiki/Singleton

主机.json:

{
  "serviceBus": {
    "maxConcurrentCalls": 1
  }
}
Run Code Online (Sandbox Code Playgroud)

蔚蓝功能:

using System;
using System.Threading.Tasks;
using Microsoft.ServiceBus.Messaging;

[Singleton]
public static void Run(BrokeredMessage myQueueItem, TraceWriter log)
{
    Stream stream = myQueueItem.GetBody<Stream>();
    StreamReader reader = new StreamReader(stream);
    string messageContentStr = reader.ReadToEnd();

    log.Info($"New TEST message: {messageContentStr} on thread {System.Threading.Thread.CurrentThread.ManagedThreadId}");   

    System.Threading.Thread.Sleep(2000);     
}
Run Code Online (Sandbox Code Playgroud)

这是日志记录的摘录。正如您所看到的,有不同的线程。并且,例如,“消息19”出现在“消息10”之前。是的,我确信我将消息按正确的顺序放入队列中。

....
2018-05-09T09:09:33.686 [Info] New TEST message: Message 19 on thread 33
2018-05-09T09:09:35.702 [Info] Function completed (Success, Id=007eccd0-b5db-466a-91c1-4f53ec5a7b3a, Duration=2013ms)
2018-05-09T09:09:36.390 …
Run Code Online (Sandbox Code Playgroud)

c# concurrency azure azure-servicebus-queues azure-functions

2
推荐指数
1
解决办法
4093
查看次数