Hi,
Thanks for your amazingly quick reply. :)
Here is the part of the route what it is all about:
from("activemq:out." + getPortalId())
// Because the xml fragment does not contain the usual <?xml version...
etc.
// we have to force the encoding on the input read from the queue.
.setProperty(Exchange.CHARSET_NAME, constant("UTF-8"))
.setHeader(AGENT_ID, new XPathExpression("/agent/@id"))
.process(new FixateHeaderValuesProcessor())
// reading objects per agent
.setHeader(FileComponent.HEADER_FILE_NAME, new
SimpleExpression(getCacheLocation() + "/${in.header." + AGENT_ID +
"}/agent.xml"))
.process(new ReadLocalFile())
.to("direct:filterxml")
.setHeader("portal.id", constant(getPortalId()))
.multicast()
.to("direct:portalxml", "direct:historyxml")
;
from("direct:filterxml")
.process(new FilterProcessor())
;
from("direct:portalxml")
.to("xslt:" + getPortalXsltUri())
.setHeader(FileComponent.HEADER_FILE_NAME, new
SimpleExpression("${in.header." + AGENT_ID + "}/agent.xml"))
.to("file://" + getPublishLocation() + "/" + getPortalId() +
"?append=false")
;
from("direct:historyxml")
.to("xslt:" + getHistoryXsltUri())
.setHeader(FileComponent.HEADER_FILE_NAME, new
SimpleExpression("${in.header." + AGENT_ID + "}/history.xml"))
.to("file://" + getPublishLocation() + "/" + getPortalId() +
"?append=false")
;
And here are the custom processors:
/**
* type convert a few headers to string, otherwise they will not survive
hops to jms ques.
*/
private class FixateHeaderValuesProcessor implements Processor {
public void process(Exchange arg0) throws Exception {
String id = arg0.getIn().getHeader(AGENT_ID, String.class);
arg0.getIn().setHeader(AGENT_ID, id);
}
}
/*
*
*/
private class ReadLocalFile implements Processor {
public void process(Exchange exchange) throws Exception {
// get the filename from our custom header
String filename =
exchange.getIn().getHeader(FileComponent.HEADER_FILE_NAME, String.class);
exchange.getIn().setBody(new File(filename));
}
}
/*
* Remove objects from xml by xpath queries
*/
private class FilterProcessor implements Processor {
public void process(Exchange exchange) throws Exception {
String portalId = getPortalId();
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
List<String> expressions = new ArrayList<String>();
expressions.add("//object[count(.//port...@id=" + portalId + "]) =
0]");
expressions.add("//object[(.//action != 'DELETE') and
(language!='de')]");
expressions.add("//object[(.//action != 'DELETE') and
(string-length(postalcode) <= 0)]");
expressions.add("//object[(.//action != 'DELETE') and
(string-length(cityname) <= 0)]");
Document document = exchange.getIn().getBody(Document.class);
for (String expr : expressions) {
NodeList nodes = (NodeList)
xpath.compile(expr).evaluate(document,
XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
node.getParentNode().removeChild(node);
}
}
exchange.getIn().setBody(document);
}
}
I tried your solution with the default message. This gave me another
exception:
WARN efaultMessageListenerContainer - Execution of JMS message listener
failed
org.apache.camel.RuntimeCamelException: java.lang.ClassCastException:
org.apache.camel.impl.DefaultMessage
at
org.apache.camel.util.ObjectHelper.wrapRuntimeCamelException(ObjectHelper.java:842)
at
org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:95)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:531)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:466)
at
org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:435)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:322)
at
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:260)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:944)
at
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:875)
at java.lang.Thread.run(Thread.java:613)
Caused by: java.lang.ClassCastException:
org.apache.camel.impl.DefaultMessage
at org.apache.camel.component.jms.JmsExchange.getIn(JmsExchange.java:52)
at org.apache.camel.component.jms.JmsExchange.getIn(JmsExchange.java:32)
at
org.apache.camel.processor.Pipeline.createNextExchange(Pipeline.java:185)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:86)
at
org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:68)
at
org.apache.camel.processor.interceptor.StreamCachingInterceptor.proceed(StreamCachingInterceptor.java:87)
at
org.apache.camel.processor.interceptor.StreamCachingInterceptor.process(StreamCachingInterceptor.java:82)
at
org.apache.camel.processor.UnitOfWorkProcessor.process(UnitOfWorkProcessor.java:52)
at
org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:41)
at
org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:66)
at
org.apache.camel.component.jms.EndpointMessageListener.onMessage(EndpointMessageListener.java:72)
... 8 more
--
View this message in context:
http://www.nabble.com/Exception-on-typeconversion%2C-but-result-is-ok--tp23887671p23919884.html
Sent from the Camel - Users mailing list archive at Nabble.com.