Search in sources :

Example 1 with TransactedPolicy

use of org.apache.camel.spi.TransactedPolicy in project camel by apache.

the class TransactionErrorHandlerBuilder method createErrorHandler.

public Processor createErrorHandler(RouteContext routeContext, Processor processor) throws Exception {
    if (transactionTemplate == null) {
        // lookup in context if no transaction template has been configured
        LOG.debug("No TransactionTemplate configured on TransactionErrorHandlerBuilder. Will try find it in the registry.");
        Map<String, TransactedPolicy> mapPolicy = routeContext.lookupByType(TransactedPolicy.class);
        if (mapPolicy != null && mapPolicy.size() == 1) {
            TransactedPolicy policy = mapPolicy.values().iterator().next();
            if (policy != null && policy instanceof SpringTransactionPolicy) {
                transactionTemplate = ((SpringTransactionPolicy) policy).getTransactionTemplate();
            }
        }
        if (transactionTemplate == null) {
            TransactedPolicy policy = routeContext.lookup(PROPAGATION_REQUIRED, TransactedPolicy.class);
            if (policy != null && policy instanceof SpringTransactionPolicy) {
                transactionTemplate = ((SpringTransactionPolicy) policy).getTransactionTemplate();
            }
        }
        if (transactionTemplate == null) {
            Map<String, TransactionTemplate> mapTemplate = routeContext.lookupByType(TransactionTemplate.class);
            if (mapTemplate == null || mapTemplate.isEmpty()) {
                LOG.trace("No TransactionTemplate found in registry.");
            } else if (mapTemplate.size() == 1) {
                transactionTemplate = mapTemplate.values().iterator().next();
            } else {
                LOG.debug("Found {} TransactionTemplate in registry. Cannot determine which one to use. " + "Please configure a TransactionTemplate on the TransactionErrorHandlerBuilder", mapTemplate.size());
            }
        }
        if (transactionTemplate == null) {
            Map<String, PlatformTransactionManager> mapManager = routeContext.lookupByType(PlatformTransactionManager.class);
            if (mapManager == null || mapManager.isEmpty()) {
                LOG.trace("No PlatformTransactionManager found in registry.");
            } else if (mapManager.size() == 1) {
                transactionTemplate = new TransactionTemplate(mapManager.values().iterator().next());
            } else {
                LOG.debug("Found {} PlatformTransactionManager in registry. Cannot determine which one to use for TransactionTemplate. " + "Please configure a TransactionTemplate on the TransactionErrorHandlerBuilder", mapManager.size());
            }
        }
        if (transactionTemplate != null) {
            LOG.debug("Found TransactionTemplate in registry to use: " + transactionTemplate);
        }
    }
    ObjectHelper.notNull(transactionTemplate, "transactionTemplate", this);
    TransactionErrorHandler answer = new TransactionErrorHandler(routeContext.getCamelContext(), processor, getLogger(), getOnRedelivery(), getRedeliveryPolicy(), getExceptionPolicyStrategy(), transactionTemplate, getRetryWhilePolicy(routeContext.getCamelContext()), getExecutorService(routeContext.getCamelContext()), getRollbackLoggingLevel(), getOnExceptionOccurred());
    // configure error handler before we can use it
    configure(routeContext, answer);
    return answer;
}
Also used : TransactedPolicy(org.apache.camel.spi.TransactedPolicy) TransactionTemplate(org.springframework.transaction.support.TransactionTemplate) PlatformTransactionManager(org.springframework.transaction.PlatformTransactionManager)

Example 2 with TransactedPolicy

use of org.apache.camel.spi.TransactedPolicy in project camel by apache.

the class TransactedDefinition method doResolvePolicy.

protected static Policy doResolvePolicy(RouteContext routeContext, String ref, Class<? extends Policy> type) {
    // explicit ref given so lookup by it
    if (ObjectHelper.isNotEmpty(ref)) {
        return CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(), ref, Policy.class);
    }
    // no explicit reference given from user so we can use some convention over configuration here
    // try to lookup by scoped type
    Policy answer = null;
    if (type != null) {
        // try find by type, note that this method is not supported by all registry
        Map<String, ?> types = routeContext.lookupByType(type);
        if (types.size() == 1) {
            // only one policy defined so use it
            Object found = types.values().iterator().next();
            if (type.isInstance(found)) {
                return type.cast(found);
            }
        }
    }
    // for transacted routing try the default REQUIRED name
    if (type == TransactedPolicy.class) {
        // still not found try with the default name PROPAGATION_REQUIRED
        answer = routeContext.lookup(PROPAGATION_REQUIRED, TransactedPolicy.class);
    }
    // still no policy found then try lookup the platform transaction manager and use it as policy
    if (answer == null && type == TransactedPolicy.class) {
        Class<?> tmClazz = routeContext.getCamelContext().getClassResolver().resolveClass("org.springframework.transaction.PlatformTransactionManager");
        if (tmClazz != null) {
            // see if we can find the platform transaction manager in the registry
            Map<String, ?> maps = routeContext.lookupByType(tmClazz);
            if (maps.size() == 1) {
                // only one platform manager then use it as default and create a transacted
                // policy with it and default to required
                // as we do not want dependency on spring jars in the camel-core we use
                // reflection to lookup classes and create new objects and call methods
                // as this is only done during route building it does not matter that we
                // use reflection as performance is no a concern during route building
                Object transactionManager = maps.values().iterator().next();
                LOG.debug("One instance of PlatformTransactionManager found in registry: {}", transactionManager);
                Class<?> txClazz = routeContext.getCamelContext().getClassResolver().resolveClass("org.apache.camel.spring.spi.SpringTransactionPolicy");
                if (txClazz != null) {
                    LOG.debug("Creating a new temporary SpringTransactionPolicy using the PlatformTransactionManager: {}", transactionManager);
                    TransactedPolicy txPolicy = ObjectHelper.newInstance(txClazz, TransactedPolicy.class);
                    Method method;
                    try {
                        method = txClazz.getMethod("setTransactionManager", tmClazz);
                    } catch (NoSuchMethodException e) {
                        throw new RuntimeCamelException("Cannot get method setTransactionManager(PlatformTransactionManager) on class: " + txClazz);
                    }
                    ObjectHelper.invokeMethod(method, txPolicy, transactionManager);
                    return txPolicy;
                } else {
                    // camel-spring is missing on the classpath
                    throw new RuntimeCamelException("Cannot create a transacted policy as camel-spring.jar is not on the classpath!");
                }
            } else {
                if (maps.isEmpty()) {
                    throw new NoSuchBeanException(null, "PlatformTransactionManager");
                } else {
                    throw new IllegalArgumentException("Found " + maps.size() + " PlatformTransactionManager in registry. " + "Cannot determine which one to use. Please configure a TransactionTemplate on the transacted policy.");
                }
            }
        }
    }
    return answer;
}
Also used : TransactedPolicy(org.apache.camel.spi.TransactedPolicy) Policy(org.apache.camel.spi.Policy) TransactedPolicy(org.apache.camel.spi.TransactedPolicy) NoSuchBeanException(org.apache.camel.NoSuchBeanException) RuntimeCamelException(org.apache.camel.RuntimeCamelException) Method(java.lang.reflect.Method)

Aggregations

TransactedPolicy (org.apache.camel.spi.TransactedPolicy)2 Method (java.lang.reflect.Method)1 NoSuchBeanException (org.apache.camel.NoSuchBeanException)1 RuntimeCamelException (org.apache.camel.RuntimeCamelException)1 Policy (org.apache.camel.spi.Policy)1 PlatformTransactionManager (org.springframework.transaction.PlatformTransactionManager)1 TransactionTemplate (org.springframework.transaction.support.TransactionTemplate)1