【问题标题】:ActiveMQ - Sending a message to a temporary queue specified using a string (NMS in C#)ActiveMQ - 将消息发送到使用字符串指定的临时队列(C# 中的 NMS)
【发布时间】:2015-10-25 00:20:57
【问题描述】:

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

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

...

  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);
}                
}

(“instance”是工作对象-包含ReplyTo地址和其他信息)

【问题讨论】:

  • instance.ReplyTo 在本例中设置为“temp-queue://ID:HL003323-52604-634308828390407226-1:1:1”

标签: c# nms


【解决方案1】:

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

【讨论】:

  • 非常感谢蒂姆的回复。我确实明白你在说什么,但我正在查看几秒钟的跨度,在此期间,调用者将保持打开临时队列等待响应。如果目的地不再存在,我希望看到(并且确实看到)引发异常。但是,当发送到一个临时队列(即使它仍然存在)时,使用这个字符串引用作为源,它似乎没有发送并且没有引发异常。
  • 好吧,没有测试用例我很难说。创建临时队列实际上是通过 Session.CreateTemporaryQueue 完成的,而不是使用从 ToString 获得的字符串值,所以它不起作用对我来说并不奇怪。如果您可以创建一个测试用例并打开一个新的 Jira 问题,我可以对其进行调查并确定它是否有效或可能。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 2018-02-20
    • 2015-02-19
    • 2011-03-07
    • 2013-08-31
    相关资源
    最近更新 更多