如何检查阅读器是否正在使用服务总线的MessageSession?

时间:2017-11-22 06:31:03

标签: c# azure queue servicebus azure-servicebus-queues

我的公司需要一种方法来同步"我们的客户和远程服务之间的数据。我目前正在审查服务总线以解决这一挑战。最重要的部分是同步必须以完全相同的顺序发生。所以我们假设一个实体是createad - >更新 - >更新 - >删除然后重要的是队列中的所有消息将以相同的顺序执行。

队列中将有大约100个编写器,每个编写器将写入单独的会话,因此将有大约100个会话。

我正在尝试从不同的会话中读取多个读者。

据我所知,当AcceptMessageSession被调用时,该呼叫返回的会话被锁定"对于当前的读者,这是我所期望的,但是当我呼叫GetMessageSessions时,会返回锁定的会话。有没有办法让GetMessageSessions只返回未锁定的会话?

这是客户端代码

var client = QueueClient.CreateFromConnectionString(connectionString, ReceiveMode.ReceiveAndDelete);
            Console.WriteLine("Reader Started");

            while (true)
            {
                var lockId = Guid.NewGuid();
                var sessions = client.GetMessageSessions();

                foreach (var item in sessions)
                {
                    StartSessionReading(client, item, lockId);
                }
                Thread.Sleep(50);
            }

这是实际锁定会话并从中读取的方法

public static void StartSessionReading(QueueClient client, MessageSession s, Guid lockId)
{

    Task.Factory.StartNew(() =>
    {
        Console.WriteLine("started thread");
        try
        {
            var session = client.AcceptMessageSession(s.SessionId, true);

            var x = client.GetMessageSessions();

            var message = session.Receive();
            while (message != null)
            {
                printLine(message, session);
                message = session.Receive(new TimeSpan(5));
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.InnerException.Message);
        }
    });
}

0 个答案:

没有答案