Search in sources :

Example 1 with IntegrationResourceHolderSynchronization

use of org.springframework.integration.transaction.IntegrationResourceHolderSynchronization in project spring-integration by spring-projects.

the class AbstractPollingEndpoint method bindResourceHolderIfNecessary.

private IntegrationResourceHolder bindResourceHolderIfNecessary(String key, Object resource) {
    if (this.transactionSynchronizationFactory != null && resource != null && TransactionSynchronizationManager.isActualTransactionActive()) {
        TransactionSynchronization synchronization = this.transactionSynchronizationFactory.create(resource);
        if (synchronization != null) {
            TransactionSynchronizationManager.registerSynchronization(synchronization);
            if (synchronization instanceof IntegrationResourceHolderSynchronization) {
                IntegrationResourceHolderSynchronization integrationSynchronization = ((IntegrationResourceHolderSynchronization) synchronization);
                integrationSynchronization.setShouldUnbindAtCompletion(false);
                if (!TransactionSynchronizationManager.hasResource(resource)) {
                    TransactionSynchronizationManager.bindResource(resource, integrationSynchronization.getResourceHolder());
                }
            }
        }
        Object resourceHolder = TransactionSynchronizationManager.getResource(resource);
        if (resourceHolder instanceof IntegrationResourceHolder) {
            IntegrationResourceHolder integrationResourceHolder = (IntegrationResourceHolder) resourceHolder;
            if (key != null) {
                integrationResourceHolder.addAttribute(key, resource);
            }
            return integrationResourceHolder;
        }
    }
    return null;
}
Also used : IntegrationResourceHolderSynchronization(org.springframework.integration.transaction.IntegrationResourceHolderSynchronization) TransactionSynchronization(org.springframework.transaction.support.TransactionSynchronization) IntegrationResourceHolder(org.springframework.integration.transaction.IntegrationResourceHolder)

Example 2 with IntegrationResourceHolderSynchronization

use of org.springframework.integration.transaction.IntegrationResourceHolderSynchronization in project spring-integration by spring-projects.

the class ImapIdleChannelAdapter method createMessageSendingTask.

private Runnable createMessageSendingTask(final Object mailMessage) {
    Runnable sendingTask = () -> {
        @SuppressWarnings("unchecked") org.springframework.messaging.Message<?> message = mailMessage instanceof Message ? ImapIdleChannelAdapter.this.getMessageBuilderFactory().withPayload(mailMessage).build() : (org.springframework.messaging.Message<Object>) mailMessage;
        if (TransactionSynchronizationManager.isActualTransactionActive()) {
            if (ImapIdleChannelAdapter.this.transactionSynchronizationFactory != null) {
                TransactionSynchronization synchronization = ImapIdleChannelAdapter.this.transactionSynchronizationFactory.create(ImapIdleChannelAdapter.this);
                if (synchronization != null) {
                    TransactionSynchronizationManager.registerSynchronization(synchronization);
                    if (synchronization instanceof IntegrationResourceHolderSynchronization && !TransactionSynchronizationManager.hasResource(ImapIdleChannelAdapter.this)) {
                        TransactionSynchronizationManager.bindResource(ImapIdleChannelAdapter.this, ((IntegrationResourceHolderSynchronization) synchronization).getResourceHolder());
                    }
                    Object resourceHolder = TransactionSynchronizationManager.getResource(ImapIdleChannelAdapter.this);
                    if (resourceHolder instanceof IntegrationResourceHolder) {
                        ((IntegrationResourceHolder) resourceHolder).setMessage(message);
                    }
                }
            }
        }
        sendMessage(message);
    };
    // wrap in the TX proxy if necessary
    if (!CollectionUtils.isEmpty(this.adviceChain)) {
        ProxyFactory proxyFactory = new ProxyFactory(sendingTask);
        if (!CollectionUtils.isEmpty(this.adviceChain)) {
            for (Advice advice : this.adviceChain) {
                proxyFactory.addAdvice(advice);
            }
        }
        sendingTask = (Runnable) proxyFactory.getProxy(this.classLoader);
    }
    return sendingTask;
}
Also used : IntegrationResourceHolderSynchronization(org.springframework.integration.transaction.IntegrationResourceHolderSynchronization) TransactionSynchronization(org.springframework.transaction.support.TransactionSynchronization) Message(javax.mail.Message) ProxyFactory(org.springframework.aop.framework.ProxyFactory) IntegrationResourceHolder(org.springframework.integration.transaction.IntegrationResourceHolder) Advice(org.aopalliance.aop.Advice)

Aggregations

IntegrationResourceHolder (org.springframework.integration.transaction.IntegrationResourceHolder)2 IntegrationResourceHolderSynchronization (org.springframework.integration.transaction.IntegrationResourceHolderSynchronization)2 TransactionSynchronization (org.springframework.transaction.support.TransactionSynchronization)2 Message (javax.mail.Message)1 Advice (org.aopalliance.aop.Advice)1 ProxyFactory (org.springframework.aop.framework.ProxyFactory)1