ActiveMQ: сохранить сообщение JMS навсегда после потребления

#java #jms #activemq

#java #jms #activemq

Вопрос:

У меня есть настройка ActiveMQ и я могу создавать и потреблять MapMessage . Сообщение сохраняется в ACTIVEMQ_MSGS таблице в Oracle до тех пор, пока оно не будет использовано. После использования запись из базы данных удаляется.

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

Моя конфигурация из activemq.xml выглядит следующим образом:

     <bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
          <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
          <property name="url" value="jdbc:oracle:thin:@localhost/XE"/>
          <property name="username" value="USERNAME"/>
          <property name="password" value="PASSWORD"/>
          <property name="maxActive" value="200"/>
          <property name="poolPreparedStatements" value="true"/>
    </bean>


    <persistenceAdapter>
            <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#oracle-ds"/>
    </persistenceAdapter>
  

Мой Java-код выглядит так:

 // Getting JMS connection from the server and starting it
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(Constants.ACTIVEMQ_URL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

// Destination represents 'NIKHIL.QUEUE' on the JMS server.
Destination destination = session.createQueue("NIKHIL.QUEUE");

// MessageProducer is used for sending messages (as opposed to MessageConsumer which is used for receiving them)
producer = session.createProducer(destination);

//Message creation goes here...
  

Комментарии:

1. Не уверен, почему StackOverflow скрывает имя пользователя, который дал -1. По крайней мере, они должны поручить человеку написать комментарий об этом, которым анонимно можно поделиться со мной. Пожалуйста, дайте мне знать, что не так в моем вопросе. Спасибо! 🙂

2. Я думаю, что они, вероятно, сделали это, потому что вы на самом деле не задаете реальный вопрос. Чего вы надеетесь достичь? Что вы пробовали? Что не сработало? и т.д. и т.п.

3. Тим, я думаю, что то, что я пробовал, о каком подходе я думал и чего я хочу достичь, четко отражено в моем вопросе.

Ответ №1:

Учитывая информацию в вопросе, единственный подходящий ответ — нет. Нет свойства, позволяющего волшебным образом отправлять сообщения в какую-либо другую таблицу в вашей БД. Брокер работает так, как задумано, когда сообщения используются, они удаляются. Если вам нужно какое-то зеркальное отображение, вы могли бы попробовать создать составное назначение, чтобы сообщения, поступающие в одну очередь, отправлялись в две отдельные очереди, и вы потребляли из одной и сохраняли другую, но тогда вам нужно было бы каким-то образом управлять этим.

Комментарии:

1. В случае с темами я заметил, что если сообщение является постоянным и оно потребляется потребителями (и нет автономного постоянного потребителя), запись все еще сохраняется в activemq_msgs . Разве эта запись не должна быть удалена? или я что-то не так понимаю

2. Хорошо, я понял, что планировщик удаляет целые файлы из базы данных, это происходит не мгновенно, как я ожидал. Если вы включите отладку в журнале, вы сможете увидеть DEBUG | Executing SQL: DELETE FROM ACTIVEMQ_MSGS WHERE (PRIORITY=? AND ID <= ( SELECT min(ACTIVEMQ_ACKS.LAST_ACKED_ID) FROM ACTIVEMQ_ACKS WHERE ACTIVEMQ_ACKS.CONTAINER=ACTIVEMQ_MSGS.CONTAINER AND ACTIVEMQ_ACKS.PRIORITY=?) ) | org.apache.activemq.store.jdbc.adapter.DefaultJDBCAdapter | Persistence Adaptor Task-1