АктивМК:как удалить из очереди старые сообщения?
Вопрос
Я учусь использовать ActiveMQ, и теперь мы столкнулись со следующей проблемой.
Предположим, что у меня есть тема с именем theme.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()
Другие советы
Есть что-то, называемое ретроактивный потребитель политику, которую вы также можете установить на брокере.Это для подписчиков тем, которые не являются долговечными, но могут захотеть получать «недавние» сообщения, которые они, возможно, пропустили – см. также Политика восстановления подписки