سؤال

أنا أتعلم كيفية استخدام ActiveMQ والآن نحن نواجه المشكلة التالية.

لنفترض أن لدي موضوع اسمه Topic.Test على ActiveMQ الذي يحتوي على اثنين من المشتركين. في لحظة معينة، لدي واحد فقط من المشتركين الذين ينتظرون الرسائل، وأرسل المنتج رسالة حول الموضوع الذي ذكرته أعلاه.

موافق، المشترك المتصل يحصل على الرسالة، ولكن لا ينبغي أن يتلقى المشترك الآخر هذه الرسالة لاحقا عند توصيله؟ حسنا، في حالتي، لا يحدث: يتلقى المشتركون رسائل فقط أثناء الاتصال. جميع الرسائل الأخرى، التي تم إرسالها أثناء عدم توصيلها لا يتم استلامها من قبلها. ماذا يمكن أن أفعل الخطأ؟

فيما يلي بعض من التعليمات البرمجية المصدرية كتبت لاختبار ActiveMQ. ربما يمكنك أن تجد ما هو الخطأ في ذلك.

رمزي على أساس:

        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection connection = connectionFactory.createConnection();
        connection.setClientID("leitorTeste");
        conexao.start();
        Session sessao = conexao.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Topic fonte = sessao.createTopic("topic.test");
        MessageConsumer consumer = sessao.createConsumer(fonte);
        javax.jms.Message presente = null;
        while ((presente = consumer.receive()) != null) {
            System.out.println(((TextMessage) presente).getText());
        }
        consumer.setMessageListener(new LeitorMensagens());
        conexao.close();

وهنا رمز المنتج الخاص بي:

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection connection = connectionFactory.createConnection();
        Session sessao = conexao.createSession(true, Session.AUTO_ACKNOWLEDGE);
        connection.start();
        Destination destino = sessao.createTopic("topic.test");
        MessageProducer produtorMensagem = sessao.createProducer(destino);
        produtorMensagem.setDeliveryMode(DeliveryMode.PERSISTENT);
        TextMessage message = sessao.createTextMessage("Hi!");
        produtorMensagem.send(message);
        sessao.commit();
        connection.close();

هل هناك أي تكوين آخر يجب أن أضيف إلى ActiveMQ بحيث يمكن للمستهلكين الحصول على رسائل قديمة؟

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

المحلول

يجب أن تجعل المستهلكين "دائم". وإلا، AMQ "ينسى" عنها بمجرد إلغاء الاشتراك. للقيام بذلك، استخدم Session.createDurableSubscriber()

نصائح أخرى

هناك شيء يسمى المستهلك بأثر رجعي السياسة التي يمكنك أيضا ضبطها على الوسيط. هذا للمشتركين للموضوعات - والتي ليست متينة، ولكن قد ترغب في تلقي الرسائل "الأخيرة" التي ربما فاتهمها - انظر أيضا سياسة استعادة الاشتراك

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top