Nano Hash - криптовалюты, майнинг, программирование

Установка приоритета MessageProducer не влияет на сообщения

У меня есть сообщения с высоким приоритетом, которые необходимо обрабатывать по сравнению с сообщениями с более низким приоритетом, но установка приоритета для MessageProducer, похоже, не влияет, и сообщения потребляются в том же порядке, в котором они отправляются в очередь.

Ниже мой код:

package com.example.jms;

import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.config.JmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.ProducerCallback;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;

@SpringBootApplication
public class JmsPriorityApplication {

    private static final Logger logger= LoggerFactory.getLogger(JmsPriorityApplication.class);

    public static void main(String[] args) {

        // Launch the application
        ConfigurableApplicationContext context = SpringApplication.run(JmsPriorityApplication.class, args);

        JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class);
        // Send a message with a POJO - the template reuse the message converter
        System.out.println("Sending an email message.");

        jmsTemplate.execute("mailbox", new ProducerCallback<Object>() {

            @Override 
            public Object doInJms(Session session, MessageProducer producer) throws JMSException { 
                String text = "Hello this msg1";
                int priority=1;
                TextMessage message1 = session.createTextMessage(text);
                producer.send(message1, DeliveryMode.PERSISTENT, priority, 0);
                logger.info("{} sent with priority={}", text, priority);

                text = "Hello this msg2";
                priority=9;
                TextMessage message2 = session.createTextMessage(text);
                producer.send(message2, DeliveryMode.PERSISTENT, priority, 0);
                logger.info("{} sent with priority={}", text, priority);
                return null;
            }

        } );

    }


    @Bean
    public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
            DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        // This provides all boot's default to this factory, including the message converter
        configurer.configure(factory, connectionFactory);
        // You could still override some of Boot's default if necessary.
        return factory;
    }

}

Ресивер.java

package com.example.jms;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
public class Receiver {

    @JmsListener(destination = "mailbox", containerFactory = "myFactory")
    public void receiveMessage(String msg) {
        System.out.println("Received <" + msg + ">");
    }

}

Ниже приведен вывод:

Sending an email message.
2019-02-05 17:42:44.161  INFO 7828 --- [           main] com.example.jms.JmsPriorityApplication   : Hello this msg1 sent with priority=1
2019-02-05 17:42:44.161  INFO 7828 --- [           main] com.example.jms.JmsPriorityApplication   : Hello this msg2 sent with priority=9
Received <Hello this msg1>
Received <Hello this msg2>

Я ожидал, что msg2 будет получен до msg1. Я не уверен, что мне здесь не хватает. Примечание: потребитель активен во время отправки сообщений.

05.02.2019

  • Активен ли потребитель при отправке сообщений? Если да, то первое сообщение может быть отправлено потребителю раньше, чем придет второе. 05.02.2019
  • Да, потребитель активен, так что же здесь можно сделать? есть ли способ заставить получателя ждать, пока все сообщения не поступят в очередь? 06.02.2019

Ответы:


1

Поскольку потребитель активен, когда сообщения отправляются, почти наверняка брокер отправляет первое сообщение клиенту до того, как второе поступит брокеру. Это означает, что у сообщения с более высоким приоритетом практически нет времени для вытеснения сообщения с более низким приоритетом, поскольку клиент уже получил сообщение с более низким приоритетом.

Как правило, идея приоритетной доставки имеет смысл только при наличии большого количества сообщений в очереди. Для вашего теста вы должны либо не активировать потребителя до тех пор, пока все сообщения не будут отправлены (задача, которая потребует какой-то внешней координации или ручного вмешательства), либо увеличить объем сообщений, чтобы в очереди накопилось достаточно сообщений для приоритетной доставки. на самом деле случиться.

06.02.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..