سؤال

لقد قمت بكتابة خدمة Windows باستخدام مكتبات Apache.NMS وApcahe.NMS.ActiveMQ (الإصدار 1.0).تستهلك الخدمة الرسائل من ActiveMQ من خادم البائع.

تقوم الخدمة بتدوير الاتصال والاستماع إلى الرسائل (أتعامل مع حدث OnMessage)

الاتصال عبارة عن اتصال يتم التعامل معه، لذا أتصل بالالتزام بعد كل رسالة.

عند بدء تشغيل الخدمة، يعمل كل شيء بشكل جيد جدًا ويظل كذلك لفترة من الوقت.ومع ذلك، بعد تشغيله لفترة من الوقت، فإنه لن يستهلك الرسائل بعد الآن.حتى لو قمت بإعادة ضبط الخدمة.عادةً ما يستغرق الأمر إعادة تشغيل الخدمة وخادم البائع (tomcat) لإعادة الأمور إلى طبيعتها مرة أخرى.يصر البائع على أنه لا يوجد شيء خاطئ من جانبهم.

لا يتم طرح أي استثناءات على أي من الجانبين (العميل أو الخادم) - إنه مجرد "عالق".

هل يجب أن أفكر في استخدام Spring.Messaging.Nms؟

هل كانت مفيدة؟

المحلول

ولقد اكتشفت المشكلة. بعد تأسيس اتصال والمستمع رسالة ذهبت الخدمة في حلقة مع Thread.Sleep (500). غبي. I ريفاكتوريد الخدمة لبدء كل شيء في OnStart والتخلص منها في OnStop.

ومنذ يفعل ذلك، كل شيء يعمل تماما.

والكلاسيكية خطأ ID-10-T التي تحدث بين لوحة المفاتيح وكرسي.

نصائح أخرى

ورمزي مختلف قليلا. بدلا من الاقتراع في حلقة أقوم بإعداد مستمع أن يستجيب لحدث "OnMessage". قانون بلدي يشبه رمز أدناه. قانون بلدي الفعلي لديها الكثير من الاشياء غير ذي صلة في ذلك، ولكن الروح هي نفسها - ويساعد هذا الأمل

factory = new Apache.NMS.ActiveMQ.ConnectionFactory("tcp://activemq:61616");

connection = factory.QueueConnection(factory, "MyQueue", AcknowledgementMode.AutoAcknowledge)

consumer = connection.Session.CreateConsumer(connection.Queue, "2 > 1"); //Get every msg

consumer.Listener += new MessageListener(OnMessage);


private void OnMessage(IMessage message)
{
  //Process message here.;
}

ولقد وصلنا للتو عبر بالضبط نفس المشكلة باستخدام خدمة صافي يتحدث إلى ActiveMQ، ولكن لنا حتى بعد اقفال الرسائل فقط حوالي 10-20 يجري تسليمها.

ولقد حاولت ذلك مع وبدون إطار الربيع وأنه من الأفضل قليلا دون (اذا لم اكن الأشياء تخيل).

هل تمانع فحص على هذا الرمز والسماح لي أن أعرف إذا كان يحمل أي تشابه بنفسك؟

ConnectionFactory connectionFactory = new ConnectionFactory("tcp://activemq:61616");

Connection connection = (Connection)connectionFactory.CreateConnection();
connection.Start();

Session session = (Session)connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
IDestination queue = session.GetQueue("test.queue");

MessageConsumer consumer = (MessageConsumer)session.CreateConsumer(queue);

for (int i = 0; i < 1000; i++)
{
    IMessage msg = consumer.Receive();
    if (msg != null)
        Console.WriteLine((msg as ITextMessage).Text);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top