Thanks, Willem, the link helped clarify things for me. One more question: in Camel, what is the best way of determining of what type the body instance is, so I will know whether I need to use your suggestions of copying the message back into the body or use convertBodyTo(String.class)? Is it as simple as checking if its instanceof(InputStream) or is there a more generic class I should use for that check?

You see, my SOAPMessagePreparer() below is currently identical to my SOAPResponseReader() (just outputs the line for debugging), but for the former, I don't have to convert the body into a string after reading it, presumably because from("jms:queue:numbersToDouble") already converts it to something that can be read multiple times.
Glen

Willem Jiang wrote:
Glen Mazza wrote:
Thanks, Willem, but why would
String response = e.getIn().getBody(String.class);
consume the response? Why does Camel delete the response when you call getBody()?
No, Camel didn't delete the response.
It's just because the body instance is an instance of InputStream, and it can't be read twice.
You can find more information about it here[1]

Also, for your second solution, why does converting the Body to a String result in the above call *not* consuming it anymore? Camel seems highly arbitrary in the way it works.
Turn the message body into String could make the message body be reread-able.

[1]http://camel.apache.org/stream-caching.html

Willem


Thanks,
Glen

Willem Jiang wrote:
Hi Glen,

That's because your SOAPResponseReader consumer the response.
you just need to put the Body back as a string like this

public class SOAPResponseReader implements Processor {
   @Override
   public void process(Exchange e) {
      String response = e.getIn().getBody(String.class);
      System.out.println("This was returned - Body: " +
 response);
      e.getIn().setBody(response);
   }
 }

Or just turn the Body into String like this

from("jms:queue:numbersToDouble")
      .process(new SOAPMessagePreparer())
      .to(CXF_URI)
      .convertBodyTo(String.class)
      .process(new SOAPResponseReader())
      .to("file://testfile");


Willem

Glen Mazza wrote:
Hello, the following route makes SOAP client calls and places the SOAP responses in files in the given testfile folder:

  public void configure() {
     from("jms:queue:numbersToDouble")
     .process(new SOAPMessagePreparer())
     .to(CXF_URI)
//    .process(new SOAPResponseReader())
     .to("file://testfile");
  }


Everything works fine. But when I place a process method between the latter two "to" methods (i.e., uncomment the line above), the process method will read properly the SOAP response but it seems to "eat" it so that only blank files end up subsequently getting written to the testfile folder.

Here's my SOAPResponseReader:

public class SOAPResponseReader implements Processor {
  @Override
  public void process(Exchange e) {
System.out.println("This was returned - Body: " + e.getIn().getBody(String.class));
  }
}

Any idea what's happening? What do I need to do to SOAPResponseReader so that the final to("file://testfile") in the route will store the SOAP response in each file again?

Thanks,
Glen









Reply via email to