Я новичок в activeMq. Я попытался создать простой запрос, например.запрос ответа с activemq - всегда отправлять двойной ответ
public Listener(string destination)
{
// set factory
ConnectionFactory factory = new ConnectionFactory(URL);
IConnection connection;
try
{
connection = factory.CreateConnection();
connection.Start();
ISession session = connection.CreateSession();
// create consumer for designated destination
IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue(destination));
consumer.Listener += new MessageListener(consumer_Listener);
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw new Exception("Exception in Listening ", ex);
}
}
OnMessage
static void consumer_Listener(IMessage message)
{
IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616/");
using (IConnection connection = factory.CreateConnection())
{
//Create the Session
using (ISession session = connection.CreateSession())
{
//Create the Producer for the topic/queue
// IMessageProducer prod = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQTempQueue(message.NMSDestination));
IMessageProducer producer = session.CreateProducer(message.NMSDestination);
// Create Response
// IMessage response = session.CreateMessage();
ITextMessage response = producer.CreateTextMessage("Replied from VS2010 Test");
//response.NMSReplyTo = new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("testQ1");
response.NMSCorrelationID = message.NMSCorrelationID;
if (message.NMSReplyTo != null)
{
producer.Send(message.NMSReplyTo, response);
Console.WriteLine("Receive: " + ((ITextMessage)message).NMSCorrelationID);
Console.WriteLine("Received from : " + message.NMSDestination.ToString());
Console.WriteLine("----------------------------------------------------");
}
}
}
}
Каждый раз, когда я пытался отправить запрос на слушателя, то ответ всегда посылают неоднократно. Первый ответ будет иметь свойства NMSReplyTo, а другой - нет.
Мой обходной путь, чтобы остановить эту ситуацию cheking от свойств NMSReplyTo
if (message.NMSReplyTo != null)
{
producer.Send(message.NMSReplyTo, response);
Console.WriteLine("Receive: " + ((ITextMessage)message).NMSCorrelationID);
Console.WriteLine("Received from : " + message.NMSDestination.ToString());
Console.WriteLine("----------------------------------------------------");
}
В моем понимании, это произошло потому, что был круговой ответ отправить в слушателю же очереди.
Не могли бы вы, ребята, помочь мне, как это исправить?
Большое спасибо, Chris
Привет Тим; Параметр назначения - это имя очереди, используется как параметр конструктора, поэтому я могу сделать слушатель для одной очереди. Что я хотел бы сделать, это прослушиватель, который отслеживает очередь назначения, а затем откликнется на него, отправив сообщение. надеюсь, что это поможет, и спасибо за ответ Тим. :) –
В общем запросе/ответе участвуют два отдельных адресата, один обычно является стандартным темой или очередью, которая получает запрос, а другая - обычно временным назначением, на которое обработчик запроса отправляет ответ. Отправка запроса и ответа в одном и том же месте - это то, что приводит вас в круговые циклы. –