Прочитать сообщение от MSMQ по метке - PullRequest
1 голос
/ 24 февраля 2020

Мне нужно создать среду MSMQ на основе C#, где я должен иметь возможность читать сообщения из очереди на основе некоторого уникального значения, которое было предоставлено внешним процессом. т.е. в идеале что-то вроде ReceiveByLabel ("1234"). Я могу расположить вещи так, чтобы лейбл был уникальным, но, похоже, нет простого способа сделать это. Я мог бы использовать перечислитель GetAllMessage, но, поскольку здесь может быть 30000 сообщений в очереди, это, вероятно, будет очень медленным.

Любые предложения идей будут высоко оценены.

1 Ответ

1 голос
/ 24 февраля 2020

Я бы предложил использовать идентификатор корреляции. 1. Необходимо построить идентификатор корреляции (длина 38-42 символов). Можно построить любым способом, например, построить его по GUID

    /// <summary>
    /// Generate random correlation ID(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\xxxxx)
    /// </summary>
    /// <returns>string</returns>
    /// <param name="id">if want specific id in end of generated id, else it will be random forom 1- 10000</param>
    public string GenerateId(int id = 0)
    {
        if (id == 0)
        {
            Random r = new Random();
            id = r.Next(1, 10000);
            id = r.Next(1, 10000);
        }
        return $"{Guid.NewGuid().ToString()}\\{id.ToString()}";
    }

Укажите сообщение с созданным идентификатором корреляции.

Message message = new Message();
string messageUniqueID =  GenerateId();
message.CorrelationId = messageUniqueID;

Получите его по этому идентификатору корреляции.

string yourQueuePath= "...";
MessageQueue queue = new MessageQueue(yourQueuePath);
Message myMessage = queue.ReceiveByCorrelationId(messageUniqueID);

Идентификаторы можно указывать и генерировать в коде или любым другим способом (сохранить в БД и т. Д. c.)

...