Я хочу настроить таблицу базы данных, которая будет использоваться в качестве очереди сообщений.В таблицу будут вставлены сообщения с уникальным идентификатором, отметкой времени и состоянием «ОЖИДАНИЕ».
Если предположить, что вставка в эту таблицу выполнена правильно, я хочу знать, каков наилучший способобрабатывать сообщения из этой таблицы с использованием простой базы данных HSQLDB 2.0 (хотя этот вопрос должен применяться ко всем базам данных, поддерживающим транзакции).
Я хочу прочитать следующее сообщение со статусом «в ожидании» и убедиться, что нетдругой обработчик очереди также может обработать ту же запись, а затем либо зафиксировать, либо выполнить откат.
Я включил несколько фрагментов кода, чтобы узнать, как я планирую добиться этого с использованием старого старого JDBC.
- Будет ли это работать?
- Есть ли лучшие альтернативы?
DDL:
create table message_queue (
qidx integer,
message varchar(120),
status varchar(20),
inserted_date timestamp,
inserted_by varchar(20),
processed_date timestamp,
processed_by varchar(20),
)
insert into message_queue values (1,'Important message here','PENDING','2010-08-10 00:01:00', 'BOB', null,null)
Вот моя очередь, читающая SQL:
SET AUTOCOMMIT FALSE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
START TRANSACTION
DECLARE nextID INTEGER DEFAULT 0
SET nextID = select max(qidx) from message_queue where status = 'PENDING'
update message_queue set status = 'CONSUMED' where QIDX = nextID
select * from message_queue where QIDX = nextID
ROLLBACK
Вотмои фрагменты кода подключения:
conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
try {
String message = getNextMessage(conn); // uses sql in snippet
processMessage(message);
conn.commit(); // should commit
} catch (Exception e) {
conn.rollback(); // should rollback update
}