@Override public void flushWorks(TransactionContext transactionContext) { if (transactionContext.isTransactionInProgress()) { Object transaction = transactionContext.getTransactionIdentifier(); WorkQueueSynchronization txSync = synchronizationPerTransaction.get(transaction); if (txSync != null && !txSync.isConsumed()) { txSync.flushWorks(); } } }
@Override public void performWork(Work work, TransactionContext transactionContext) { final Class<?> entityType = instanceInitializer.getClassFromWork(work); EntityIndexBinding indexBindingForEntity = factory.getIndexBinding(entityType); if (indexBindingForEntity == null && factory.getDocumentBuilderContainedEntity(entityType) == null) { throw new SearchException( "Unable to perform work. Entity Class is not @Indexed nor hosts @ContainedIn: " + entityType); } work = interceptWork(indexBindingForEntity, work); if (work == null) { // nothing to do return; } if (transactionContext.isTransactionInProgress()) { final Object transactionIdentifier = transactionContext.getTransactionIdentifier(); WorkQueueSynchronization txSync = synchronizationPerTransaction.get(transactionIdentifier); if (txSync == null || txSync.isConsumed()) { txSync = createTransactionWorkQueueSynchronization(transactionIdentifier); transactionContext.registerSynchronization(txSync); synchronizationPerTransaction.put(transactionIdentifier, txSync); } txSync.add(work); } else { if (transactionExpected) { // this is a workaround: isTransactionInProgress should return "true" // for correct configurations. log.pushedChangesOutOfTransaction(); } WorkQueue queue = new WorkQueue(factory); queueingProcessor.add(work, queue); queueingProcessor.prepareWorks(queue); queueingProcessor.performWorks(queue); } }