ActiveMQ - отправка сообщения во временную очередь, указанную с использованием строки (NMS в C #) - PullRequest
3 голосов
/ 18 января 2011

У меня есть синхронная транзакция сообщений в моей системе, и процесс в целом следует этому потоку:

  1. «Точка A» создает временную очередь («пункт назначения 2») в посреднике сообщений;
  2. Сообщение, отправленное из точки A в пункт назначения 1 (обычная очередь в посреднике сообщений) с адресом ReplyTo, установленным в качестве пункта назначения 2;
  3. точка A Блоки, ожидающие ответа в пункте назначения 2;
  4. точка B получает сообщение от пункта назначения 1;
  5. точка B создает рабочий объект, свойством которого является имя пункта назначения 2 (полученное с помощью .ToString () ". Этот рабочий объект сериализуется ихранится в БД;

...

  1. Объект, извлеченный из БД при выполнении определенных параметров, изменяет ocurr и отправляет ответ в пункт назначения 2 - с помощью SessionUtilполучить новый объект IDestination из адреса replyto, хранящегося как строковое свойство рабочего объекта;
  2. «Точка A» получает сообщение из пункта назначения 2 и продолжаетвкл.

Этот процесс может занять от доли секунды до нескольких секунд.

Мне нужно использовать имя пункта назначения возврата (пункт назначения 2), а неполный объект IDestination, так как я должен сериализовать объект и сохранить его в БД.

Если я использую постоянную очередь или тему в качестве пункта назначения 2, процесс работает нормально.Тем не менее, он всегда терпит неудачу при попытке создать его, используя строковое имя временной очереди.

Нет ошибок, просто не приходит сообщение

Есть идеи, почему?

Пример кода для отправки сообщения возврата показан:

IDestination myDestination = SessionUtil.GetDestination(stateSession, instance.ReplyTo, DestinationType.Queue);

stateConnection.Start();

using (IMessageProducer myProducer = stateSession.CreateProducer(myDestination))
{
myProducer.DeliveryMode = MsgDeliveryMode.NonPersistent;
var response = myProducer.CreateTextMessage();

response.NMSCorrelationID = instance.CorrelationID;
response.Properties["RoutingDestination"] = instance.RoutingOriginator;
response.Text = "Test Response";

try
{
    myProducerBroadcast.Send(response);
    myProducer.Send(response);

    Log.InfoFormat("Sent response {0} to {1}", instance.UniqueId, instance.ReplyTo);
}
catch (Exception ex)
{
    Log.Error("Unable to send execution update onwards", ex);
}                
}

(«instance» - рабочий объект, который содержит адрес ReplyTo и другую информацию)

Ответы [ 2 ]

4 голосов
/ 19 января 2011

Временный пункт назначения - только это, временный.Как только объект Connection, создавший временное назначение, закрывается, назначение автоматически удаляется из посредника.Сохранение временного пункта назначения для последующего использования не является хорошей идеей по этой причине.Кроме того, только Соединение, которое создало временное назначение, может использовать его.

0 голосов
/ 14 октября 2013

Я заметил, что временные очереди не работают, если брокер настроен так, чтобы не использовать "advisorySupport"

Повторное включение, которое заставило очереди работать на меня.

...