[ 
https://issues.apache.org/activemq/browse/CAMEL-2795?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=59972#action_59972
 ] 

Claus Ibsen commented on CAMEL-2795:
------------------------------------

Well what we can do is when creating a *new* Exchange then we can let it be 
under an unit of work.

I think this patch is better. Where we let {{target}} be the producer to 
process the Exchange. And if its a new Exchange its being wrapped by an 
{{UnitOfWorkProcessor}} which is the way you should do it. Its how Camel does 
it for routes etc.

{code}
    protected Exchange sendExchange(final Endpoint endpoint, ExchangePattern 
pattern,
                                    final Processor processor, Exchange 
exchange) throws Exception {
        return doInProducer(endpoint, exchange, pattern, new 
ProducerCallback<Exchange>() {
            public Exchange doInProducer(Producer producer, Exchange exchange, 
ExchangePattern pattern) throws Exception {
                // target is the producer executing the exchange
                Processor target = producer;

                if (exchange == null) {
                    exchange = pattern != null ? 
producer.createExchange(pattern) : producer.createExchange();
                    // if creating new exchange than wrap in unit of work
                    target = new UnitOfWorkProcessor(producer);
                }

                if (processor != null) {
                    // lets populate using the processor callback
                    processor.process(exchange);
                }

                // now lets dispatch
                if (LOG.isDebugEnabled()) {
                    LOG.debug(">>>> " + endpoint + " " + exchange);
                }

                // set property which endpoint we send to
                exchange.setProperty(Exchange.TO_ENDPOINT, 
endpoint.getEndpointUri());

                // send the exchange using the processor
                StopWatch watch = new StopWatch();
                try {
                    target.process(exchange);
                } finally {
                    // emit event that the exchange was sent to the endpoint
                    long timeTaken = watch.stop();
                    EventHelper.notifyExchangeSent(exchange.getContext(), 
exchange, endpoint, timeTaken);
                }
                return exchange;
            }
        });
    }
{code}

> ProducerCache send() should use the UnitOfWork to wrap the exchange
> -------------------------------------------------------------------
>
>                 Key: CAMEL-2795
>                 URL: https://issues.apache.org/activemq/browse/CAMEL-2795
>             Project: Apache Camel
>          Issue Type: Improvement
>          Components: camel-core
>            Reporter: Willem Jiang
>            Assignee: Willem Jiang
>             Fix For: 2.4.0
>
>
> In this way the UnitOfWork of the exchange  which is sent by the 
> DefaultProducerTemplate can be used rightly.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to