3

我的系统中有一个同步消息事务,该过程大致遵循以下流程:

  1. “A 点”在消息代理上创建一个临时队列(“目的地 2”);
  2. 消息从 A 点发送到目标 1(消息代理上的普通队列),ReplyTo 地址设置为目标 2;
  3. A点阻塞等待目的地2的响应;
  4. B点收到来自目的地1的消息;
  5. B 点创建一个工作对象 - 其属性是目标 2 的名称(使用 .ToString() 派生)。该工作对象被序列化并存储在数据库中;

...

  1. 当满足某些参数时从 DB 检索对象,发生更改,并将响应发送到目标 2 - 使用 SessionUtil 从作为工作对象的字符串属性存储的回复地址中派生新的 Idestination 对象;
  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);
}                
}

(“实例”是工作对象——它包含回复地址和其他信息)

4

2 回答 2

4

临时目的地就是这样,临时的。一旦创建临时目标的连接对象关闭,目标就会自动从代理中删除。出于这个原因,存储临时目标以供以后使用并不是一个好主意。此外,仅允许创建临时目标的 Connection 使用它。

于 2011-01-18T21:48:59.757 回答
0

如果代理配置为不使用“advisorySupport”,我确实注意到临时队列不起作用

重新启用它让队列为我工作。

于 2013-10-14T19:49:26.993 回答