You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Joe Luo (JIRA)" <ji...@apache.org> on 2014/04/02 18:23:15 UTC
[jira] [Updated] (CAMEL-7338) CxfClientCallback should not populate
camel exchange OUT message if no response comes back to cxf producer and
camel exchange pattern is InOnly
[ https://issues.apache.org/jira/browse/CAMEL-7338?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Joe Luo updated CAMEL-7338:
---------------------------
Description:
I have a following camel route:
{code}
String destination = "cxf:http://localhost:9090/test?dataFormat=MESSAGE";
from("jms:queue:dslSource")
.onException(java.net.ConnectException.class, Exception.class)
.maximumRedeliveries(3)
.maximumRedeliveryDelay(3000)
.retryAttemptedLogLevel(LoggingLevel.INFO)
.log(LoggingLevel.WARN, "Failed to send message ${body}")
.log(LoggingLevel.WARN, "Sending message to the error queue: ${body}") // body is null here
.to("jms:queue:dslError")
.end()
.log(LoggingLevel.INFO, "Sending message ...")
.setHeader("bridgeDestination", constant(destination))
.to(destination)
.log(LoggingLevel.INFO, "received back: ${body}")
.routeId("example-dsl");
{code}
If an exception is thrown, for instance, a ConnectionException due to unavailability of the backend web service, the onException() route will be executed. The first log endpoint:
{code}
.log(LoggingLevel.WARN, "Failed to send message ${body}")
{code}
prints out camel exchange IN message body without any problem. However, the second log endpoint:
{code}
.log(LoggingLevel.WARN, "Sending message to the error queue: ${body}")
{code}
only prints out the camel exchange IN message body as NULL.
The reason is that when an exception is thrown, the CxfClientCallback.handleException() is called:
{code}
public void handleException(Map<String, Object> ctx, Throwable ex) {
....
if (!boi.getOperationInfo().isOneWay()) {
// copy the InMessage header to OutMessage header
camelExchange.getOut().getHeaders().putAll(camelExchange.getIn().getHeaders());
binding.populateExchangeFromCxfResponse(camelExchange, cxfExchange, ctx);
camelAsyncCallback.done(false);
}
...
{code}
and this line always populates camel exchange OUT message regardless whether there is a CXF response back or not:
{code}
camelExchange.getOut().getHeaders().putAll(camelExchange.getIn().getHeaders());
{code}
Therefore, the second log endpoint within onException() block has it's camel exchange IN message been overwritten and replaced with OUT message from previous endpoint's although it is a message of NULL body.
was:
I have a following camel route:
{code}
String destination = "cxf:http://localhost:9090/test?dataFormat=MESSAGE";
from("jms:queue:dslSource")
.onException(java.net.ConnectException.class, Exception.class)
.maximumRedeliveries(3)
.maximumRedeliveryDelay(3000)
.retryAttemptedLogLevel(LoggingLevel.INFO)
.log(LoggingLevel.WARN, "Failed to send message ${body}")
.log(LoggingLevel.WARN, "Sending message to the error queue: ${body}") // body is null here
.to("jms:queue:dslError")
.end()
.log(LoggingLevel.INFO, "Sending message ...")
.setHeader("bridgeDestination", constant(destination))
.to(destination)
.log(LoggingLevel.INFO, "received back: ${body}")
.routeId("example-dsl");
{code}
If an exception is thrown, for instance, a ConnectionException due to unavailability of the backend web service, the onException() route will be executed. The first log endpoint:
{code}
.log(LoggingLevel.WARN, "Failed to send message ${body}")
{code}
prints out camel exchange IN message body without any problem. However, the second log endpoint:
{code}
.log(LoggingLevel.WARN, "Sending message to the error queue: ${body}")
{code}
only prints out the camel exchange IN message body as NULL.
The reason is that when an exception is thrown, the CxfClientCallback.handleException() is called:
{code}
public void handleException(Map<String, Object> ctx, Throwable ex) {
....
if (!boi.getOperationInfo().isOneWay()) {
// copy the InMessage header to OutMessage header
camelExchange.getOut().getHeaders().putAll(camelExchange.getIn().getHeaders());
binding.populateExchangeFromCxfResponse(camelExchange, cxfExchange, ctx);
camelAsyncCallback.done(false);
}
...
{code}
and this line always populates camel exchange OUT message regardless whether there is a CXF response back or not:
{code}
camelExchange.getOut().getHeaders().putAll(camelExchange.getIn().getHeaders());
{code}
> CxfClientCallback should not populate camel exchange OUT message if no response comes back to cxf producer and camel exchange pattern is InOnly
> -----------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-7338
> URL: https://issues.apache.org/jira/browse/CAMEL-7338
> Project: Camel
> Issue Type: Bug
> Components: camel-cxf
> Affects Versions: 2.10.4
> Reporter: Joe Luo
>
> I have a following camel route:
> {code}
> String destination = "cxf:http://localhost:9090/test?dataFormat=MESSAGE";
> from("jms:queue:dslSource")
> .onException(java.net.ConnectException.class, Exception.class)
> .maximumRedeliveries(3)
> .maximumRedeliveryDelay(3000)
> .retryAttemptedLogLevel(LoggingLevel.INFO)
> .log(LoggingLevel.WARN, "Failed to send message ${body}")
> .log(LoggingLevel.WARN, "Sending message to the error queue: ${body}") // body is null here
> .to("jms:queue:dslError")
> .end()
> .log(LoggingLevel.INFO, "Sending message ...")
> .setHeader("bridgeDestination", constant(destination))
> .to(destination)
> .log(LoggingLevel.INFO, "received back: ${body}")
> .routeId("example-dsl");
> {code}
> If an exception is thrown, for instance, a ConnectionException due to unavailability of the backend web service, the onException() route will be executed. The first log endpoint:
> {code}
> .log(LoggingLevel.WARN, "Failed to send message ${body}")
> {code}
> prints out camel exchange IN message body without any problem. However, the second log endpoint:
> {code}
> .log(LoggingLevel.WARN, "Sending message to the error queue: ${body}")
> {code}
> only prints out the camel exchange IN message body as NULL.
> The reason is that when an exception is thrown, the CxfClientCallback.handleException() is called:
> {code}
> public void handleException(Map<String, Object> ctx, Throwable ex) {
> ....
> if (!boi.getOperationInfo().isOneWay()) {
> // copy the InMessage header to OutMessage header
> camelExchange.getOut().getHeaders().putAll(camelExchange.getIn().getHeaders());
> binding.populateExchangeFromCxfResponse(camelExchange, cxfExchange, ctx);
> camelAsyncCallback.done(false);
> }
> ...
> {code}
> and this line always populates camel exchange OUT message regardless whether there is a CXF response back or not:
> {code}
> camelExchange.getOut().getHeaders().putAll(camelExchange.getIn().getHeaders());
> {code}
> Therefore, the second log endpoint within onException() block has it's camel exchange IN message been overwritten and replaced with OUT message from previous endpoint's although it is a message of NULL body.
--
This message was sent by Atlassian JIRA
(v6.2#6252)