Search in sources :

Example 1 with QueueEntry

use of org.apache.qpid.server.queue.QueueEntry in project qpid-broker-j by apache.

the class SynchronousMessageStoreRecovererTest method testRecoveryOfSingleDequeueWithDistributedTransaction.

@Test
public void testRecoveryOfSingleDequeueWithDistributedTransaction() {
    final UUID queueId = UUID.randomUUID();
    final Queue<?> queue = createRegisteredMockQueue(queueId);
    final Transaction transaction = mock(Transaction.class);
    final StoredMessage<StorableMessageMetaData> storedMessage = createMockStoredMessage(1);
    final long messageId = storedMessage.getMessageNumber();
    Transaction.DequeueRecord dequeueRecord = createMockDequeueRecord(queueId, messageId);
    QueueEntry queueEntry = mock(QueueEntry.class);
    when(queueEntry.acquire()).thenReturn(true);
    when(queue.getMessageOnTheQueue(messageId)).thenReturn(queueEntry);
    final long format = 1;
    final byte[] globalId = new byte[] { 0 };
    final byte[] branchId = new byte[] { 0 };
    final EnqueueRecord[] enqueues = {};
    final Transaction.DequeueRecord[] dequeues = { dequeueRecord };
    MessageStore store = new NullMessageStore() {

        @Override
        public void visitMessages(MessageHandler handler) throws StoreException {
            handler.handle(storedMessage);
        }

        @Override
        public void visitMessageInstances(MessageInstanceHandler handler) throws StoreException {
            // We need the message to be enqueued onto the queue so that later the distributed transaction
            // can dequeue it.
            handler.handle(new TestMessageEnqueueRecord(queue.getId(), messageId));
        }

        @Override
        public void visitDistributedTransactions(DistributedTransactionHandler handler) throws StoreException {
            handler.handle(new Transaction.StoredXidRecord() {

                @Override
                public long getFormat() {
                    return format;
                }

                @Override
                public byte[] getGlobalId() {
                    return globalId;
                }

                @Override
                public byte[] getBranchId() {
                    return branchId;
                }
            }, enqueues, dequeues);
        }

        @Override
        public Transaction newTransaction() {
            return transaction;
        }
    };
    DtxRegistry dtxRegistry = new DtxRegistry(_virtualHost);
    when(_virtualHost.getMessageStore()).thenReturn(store);
    when(_virtualHost.getDtxRegistry()).thenReturn(dtxRegistry);
    SynchronousMessageStoreRecoverer recoverer = new SynchronousMessageStoreRecoverer();
    recoverer.recover(_virtualHost);
    DtxBranch branch = dtxRegistry.getBranch(new Xid(format, globalId, branchId));
    assertNotNull("Expected dtx branch to be created", branch);
    branch.commit();
    verify(queueEntry, times(1)).delete();
    verify(transaction).commitTran();
}
Also used : MessageStore(org.apache.qpid.server.store.MessageStore) NullMessageStore(org.apache.qpid.server.store.NullMessageStore) MessageHandler(org.apache.qpid.server.store.handler.MessageHandler) EnqueueRecord(org.apache.qpid.server.store.Transaction.EnqueueRecord) MessageEnqueueRecord(org.apache.qpid.server.store.MessageEnqueueRecord) UUID(java.util.UUID) StorableMessageMetaData(org.apache.qpid.server.store.StorableMessageMetaData) DistributedTransactionHandler(org.apache.qpid.server.store.handler.DistributedTransactionHandler) NullMessageStore(org.apache.qpid.server.store.NullMessageStore) QueueEntry(org.apache.qpid.server.queue.QueueEntry) Xid(org.apache.qpid.server.txn.Xid) Transaction(org.apache.qpid.server.store.Transaction) DtxRegistry(org.apache.qpid.server.txn.DtxRegistry) MessageInstanceHandler(org.apache.qpid.server.store.handler.MessageInstanceHandler) DtxBranch(org.apache.qpid.server.txn.DtxBranch) Test(org.junit.Test)

Example 2 with QueueEntry

use of org.apache.qpid.server.queue.QueueEntry in project qpid-broker-j by apache.

the class AbstractVirtualHost method executeTransaction.

@Override
public void executeTransaction(TransactionalOperation op) {
    final MessageStore store = getMessageStore();
    final LocalTransaction txn = new LocalTransaction(store);
    op.withinTransaction(new Transaction() {

        @Override
        public void dequeue(final QueueEntry messageInstance) {
            final ServerTransaction.Action deleteAction = new ServerTransaction.Action() {

                @Override
                public void postCommit() {
                    messageInstance.delete();
                }

                @Override
                public void onRollback() {
                }
            };
            boolean acquired = messageInstance.acquireOrSteal(new Runnable() {

                @Override
                public void run() {
                    ServerTransaction txn = new AutoCommitTransaction(store);
                    txn.dequeue(messageInstance.getEnqueueRecord(), deleteAction);
                }
            });
            if (acquired) {
                txn.dequeue(messageInstance.getEnqueueRecord(), deleteAction);
            }
        }

        @Override
        public void copy(QueueEntry entry, final Queue<?> queue) {
            final ServerMessage message = entry.getMessage();
            txn.enqueue(queue, message, new ServerTransaction.EnqueueAction() {

                @Override
                public void postCommit(MessageEnqueueRecord... records) {
                    queue.enqueue(message, null, records[0]);
                }

                @Override
                public void onRollback() {
                }
            });
        }

        @Override
        public void move(final QueueEntry entry, final Queue<?> queue) {
            final ServerMessage message = entry.getMessage();
            if (entry.acquire()) {
                txn.enqueue(queue, message, new ServerTransaction.EnqueueAction() {

                    @Override
                    public void postCommit(MessageEnqueueRecord... records) {
                        queue.enqueue(message, null, records[0]);
                    }

                    @Override
                    public void onRollback() {
                        entry.release();
                    }
                });
                txn.dequeue(entry.getEnqueueRecord(), new ServerTransaction.Action() {

                    @Override
                    public void postCommit() {
                        entry.delete();
                    }

                    @Override
                    public void onRollback() {
                    }
                });
            }
        }
    });
    txn.commit();
}
Also used : MessageStore(org.apache.qpid.server.store.MessageStore) AutoCommitTransaction(org.apache.qpid.server.txn.AutoCommitTransaction) PrivilegedAction(java.security.PrivilegedAction) LocalTransaction(org.apache.qpid.server.txn.LocalTransaction) ServerMessage(org.apache.qpid.server.message.ServerMessage) MessageEnqueueRecord(org.apache.qpid.server.store.MessageEnqueueRecord) QueueEntry(org.apache.qpid.server.queue.QueueEntry) AutoCommitTransaction(org.apache.qpid.server.txn.AutoCommitTransaction) LocalTransaction(org.apache.qpid.server.txn.LocalTransaction) ServerTransaction(org.apache.qpid.server.txn.ServerTransaction) ServerTransaction(org.apache.qpid.server.txn.ServerTransaction)

Example 3 with QueueEntry

use of org.apache.qpid.server.queue.QueueEntry in project qpid-broker-j by apache.

the class ReportRunnerTest method makeEntry.

private QueueEntry makeEntry(final Queue queue, final ServerMessage<?> message) {
    QueueEntry entry = mock(QueueEntry.class);
    when(entry.getQueue()).thenReturn(queue);
    when(entry.getMessage()).thenReturn(message);
    return entry;
}
Also used : QueueEntry(org.apache.qpid.server.queue.QueueEntry)

Aggregations

QueueEntry (org.apache.qpid.server.queue.QueueEntry)3 MessageEnqueueRecord (org.apache.qpid.server.store.MessageEnqueueRecord)2 MessageStore (org.apache.qpid.server.store.MessageStore)2 PrivilegedAction (java.security.PrivilegedAction)1 UUID (java.util.UUID)1 ServerMessage (org.apache.qpid.server.message.ServerMessage)1 NullMessageStore (org.apache.qpid.server.store.NullMessageStore)1 StorableMessageMetaData (org.apache.qpid.server.store.StorableMessageMetaData)1 Transaction (org.apache.qpid.server.store.Transaction)1 EnqueueRecord (org.apache.qpid.server.store.Transaction.EnqueueRecord)1 DistributedTransactionHandler (org.apache.qpid.server.store.handler.DistributedTransactionHandler)1 MessageHandler (org.apache.qpid.server.store.handler.MessageHandler)1 MessageInstanceHandler (org.apache.qpid.server.store.handler.MessageInstanceHandler)1 AutoCommitTransaction (org.apache.qpid.server.txn.AutoCommitTransaction)1 DtxBranch (org.apache.qpid.server.txn.DtxBranch)1 DtxRegistry (org.apache.qpid.server.txn.DtxRegistry)1 LocalTransaction (org.apache.qpid.server.txn.LocalTransaction)1 ServerTransaction (org.apache.qpid.server.txn.ServerTransaction)1 Xid (org.apache.qpid.server.txn.Xid)1 Test (org.junit.Test)1