У меня есть получатель, который получает сообщение, ведет внутренний лог c и отправляет следующую очередь сообщений. Эти сообщения не могут быть отправлены дважды.
Пример кода: (C# потребитель / производитель, использующий RabbitMQ)
BasicDeliverEventArgs deliverEventArgs = _subscription.Next();
// Deserialize message
string message = Encoding.UTF8.GetString(deliverEventArgs.Body);
// Some logic that will create the message's to forward
string[] messagesToForwardToNextListner = message.Split(',');
for (int i = 0; i < messagesToForwardToNextListner.Length; i++)
{
IBasicProperties props = _model.CreateBasicProperties();
props.Persistent = true;
// Serialize message
byte[] messageToForward = Encoding.UTF8.GetBytes(messagesToForwardToNextListner[i]);
_model.BasicPublish("ForwardExchange", "", props, messageToForward);
}
_subscription.Ack(deliverEventArgs);
Два вопроса:
- Как можно я отправляю все сообщения в транзакции в RabbitMQ, чтобы избежать частичной публикации sh? Например: у меня есть 3 сообщения для отправки.
отправка M1 => Успех,
отправка M2 => Успех,
отправка M3 => Application Cra sh или сервер cra sh
Если программа пробьет sh между Ack и концом l oop, как я могу избежать повторной отправки этих сообщений на кролик-сервер? Есть ли идентификатор сеанса, который может помочь?