Is it possible to use a Java method extension function as EIP filter XPath
predicate?
I'm trying to implement the EIP filter pattern using a Java extension
function. The function does a check and either returns true or false based
on which the message is filtered out.
On arrival of messages I get the following NPE:
javax.jbi.messaging.MessagingException:
javax.xml.xpath.XPathExpressionException:
javax.xml.transform.TransformerException: Unknown error in XPath.
at
org.apache.servicemix.expression.JAXPXPathExpression.evaluate(JAXPXPathExpression.java:104)
at
org.apache.servicemix.eip.support.XPathPredicate.matches(XPathPredicate.java:49)
at
org.apache.servicemix.eip.patterns.MessageFilter.processAsync(MessageFilter.java:185)
at org.apache.servicemix.eip.EIPEndpoint.process(EIPEndpoint.java:241)
at
org.apache.servicemix.common.AsyncBaseLifeCycle.processExchange(AsyncBaseLifeCycle.java:410)
at
org.apache.servicemix.common.BaseLifeCycle.onMessageExchange(BaseLifeCycle.java:43)
at
org.apache.servicemix.jbi.messaging.DeliveryChannelImpl.processInBound(DeliveryChannelImpl.java:624)
at
org.apache.servicemix.jbi.nmr.flow.AbstractFlow.doRouting(AbstractFlow.java:169)
at
org.apache.servicemix.jbi.nmr.flow.seda.SedaFlow.doRouting(SedaFlow.java:177)
at
org.apache.servicemix.jbi.nmr.flow.seda.SedaQueue$1.run(SedaQueue.java:227)
at
org.apache.geronimo.connector.work.WorkerContext.run(WorkerContext.java:291)
at
EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:748)
at java.lang.Thread.run(Thread.java:595)
Caused by: javax.xml.xpath.XPathExpressionException:
javax.xml.transform.TransformerException: Unknown error in XPath.
at
org.apache.xpath.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:191)
at
org.apache.servicemix.expression.JAXPBooleanXPathExpression.evaluateXPath(JAXPBooleanXPathExpression.java:37)
at
org.apache.servicemix.expression.JAXPXPathExpression.evaluate(JAXPXPathExpression.java:97)
... 12 more
Caused by: javax.xml.transform.TransformerException: Unknown error in XPath.
at org.apache.xpath.XPath.execute(XPath.java:363)
at org.apache.xpath.XPath.execute(XPath.java:301)
at
org.apache.xpath.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:123)
at
org.apache.xpath.jaxp.XPathExpressionImpl.eval(XPathExpressionImpl.java:97)
at
org.apache.xpath.jaxp.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:178)
... 14 more
Caused by: java.lang.NullPointerException
at
org.apache.xpath.functions.FuncExtFunction.execute(FuncExtFunction.java:206)
at org.apache.xpath.XPath.execute(XPath.java:335)
... 18 more
My filter is configured as follows:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:eip="http://servicemix.apache.org/eip/1.0"
xmlns:ci="http://test/test">
<eip:message-filter service="ci:core-inbound-double-message-filter"
endpoint="endpoint">
<eip:target>
<eip:exchange-target
service="ci:core-inbound-enhancer-pipeline" />
</eip:target>
<eip:filter>
<eip:xpath-predicate
xpath="filter:check(string(/header/value))"
namespaceContext="#nsContext" />
</eip:filter>
</eip:message-filter>
<eip:namespace-context id="nsContext">
<eip:namespaces>
<eip:namespace
prefix="filter">java:test.DoubleMessageFilter</eip:namespace>
</eip:namespaces>
</eip:namespace-context>
</beans>
The DoubleMessageFilter class is available on the classpath and has a static
check method which returns a boolean value.
Is it possible what I'm trying to achieve or do I need a different approach?
Input appreciated.
--
View this message in context:
http://www.nabble.com/Java-method-extension-function-as-EIP-filter-predicate-tf2815187s12049.html#a7856577
Sent from the ServiceMix - User mailing list archive at Nabble.com.