#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