Apache Camel: Spring WS SOAP Operation did not match - java

I am trying to create a Spring WS consumer like this:
<route>
<from uri="direct:start"/>
<to uri="spring-ws:rootqname:http://{ip}:{port}/PORTAL/webservices/A20?soapAction=acceptMessage"/>
<to uri="log:output"/>
</route>
Error:
SOAPAction http://{ip}:{port}/PORTAL/webservices/A20/acceptMessage does not match an operation

In your property placeholders you need to use double braces like so:
<route>
<from uri="direct:start"/>
<to uri="spring-ws:rootqname:http://{{ip}}:{{port}}/PORTAL/webservices/A20?soapAction=acceptMessage"/>
<to uri="log:output"/>
</route>
More info here: http://camel.apache.org/using-propertyplaceholder.html

Related

Why header value isn't inserted into Apache Camel's `to` url parameter of the route in Spring DSL?

We have a route that will accept the kafka.KEY and use that as mqtt url parameter to send the data to the right topic.
<routes
xmlns="http://camel.apache.org/schema/spring">
<route id="KafkaToMQTT">
<from uri="kafka://mqtt?brokers=localhost:9092"/>
<to uri="micrometer:timer:camel.proxy.kafka.mqtt.stream?action=start"/>
<log message="Headers ${header.kafka.KEY}"/>
<to uri="mqtt:mqtt?host=tcp://localhost:1883&publishTopicName=try${header.kafka.KEY}"/>
<to uri="log://camel.proxy?groupInterval=3&level=INFO"/>
<to uri="micrometer:timer:camel.proxy.kafka.mqtt.stream?action=stop"/>
</route>
</routes>
In the log messages I see the ${header.kafka.KEY} correctly, while in the mqtt I'm getting the topic as literally try${header.kafka.KEY}
What is the reason for that, how to make the header to be used there?
To avoid that the right element instead of to should be used, that is toD.
toD concatenates the url correctly, so the right route XML is:
<routes
xmlns="http://camel.apache.org/schema/spring">
<route id="KafkaToMQTT">
<from uri="kafka://mqtt?brokers=localhost:9092"/>
<to uri="micrometer:timer:camel.proxy.kafka.mqtt.stream?action=start"/>
<log message="Headers ${header.kafka.KEY}"/>
<toD uri="mqtt:mqtt?host=tcp://localhost:1883&publishTopicName=ESP_02/try${header.kafka.KEY}"/>
<to uri="log://camel.proxy?groupInterval=3&level=INFO"/>
<to uri="micrometer:timer:camel.proxy.kafka.mqtt.stream?action=stop"/>
</route>
</routes>

boss Fuse trasformation XML usinf XSLT

http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
<camelContext id="cbr-example-context" xmlns="http://camel.apache.org/schema/blueprint">
<route id="cbr-route">
<from id="_from1" uri="file:///d:/inxslt"/>
<transform.xslt from="_from1" to="_to3" xsltFile="src/main/java/com/xslt/converterXsl.xsl"/>
<to id="_to3" uri="file:///d:/outxslt"/>
</route>
</camelContext>
i want to use my converterXsl.xsl format class to transform xml which is in file:///d:/inxslt this path
i tried this further here not not working
try to use the following definition of the Camel route.
<camelContext id="_context1" xmlns="http://camel.apache.org/schema/blueprint">
<route id="_route1">
<from id="_from1" uri="file:src/data?noop=true"/>
<to id="_to1" uri="xslt:file:src/xml2html.xsl"/>
<to id="_to2" uri="file:target/output"/>
</route>
</camelContext>
Please, adjust file paths to your needs. Especially, notice notation of XSLT component.
I hope it helps ;-)

camel loadbalancer failover custom error handler

With route defined in Spring DSL:
<route>
<from uri="direct:load1" />
<loadBalance>
<failover roundRobin="true" maximumFailoverAttempts="1"/>
<to uri="broker1:queue:queue"/>
<to uri="broker2:queue:queue"/>
</loadBalance>
</route>
How would implement a custom error handler or processor to handle the out body when the failover exhausted the maximumFailoverAttempts?
To make it simpler to understand, both broker1 and broker2 endpoints are unavailable, a processor should then be invoked to set the out body to "failed" as an example.
Currently I'm using <doTry>
<route>
<from uri="direct:load1" />
<doTry>
<loadBalance>
<failover roundRobin="true" maximumFailoverAttempts="1"/>
<to uri="broker1:queue:queue1"/>
<to uri="broker1:queue:queue2"/>
</loadBalance>
<doCatch>
<exception>java.lang.Exception</exception>
<process ref="loadbalanceExceptionProcessor" />
</doCatch>
</doTry>
</route>
Is there a better approach to this?

Apache Camel routing

A short question about Apache Camel.
I have the following scenario, where my server receives jms messages and then transform to csv file and then insert DB.
For this purpose i have 2 beans:
xml2csv
insertDB
I use routing like:
<route id="route1" errorHandlerRef="myErrorHandler">
<from uri="file://{someFolder1}}
?...
<to uri="bean:xml2csv" />
<log message="transformed to xml file" />
</route>
<route id="route2" errorHandlerRef="myErrorHandler">
<from uri="file://{{someFolder2}}
?...
<to uri="direct:csvOnboardingChannel" />
</route>
<route id="csvOnboarding" errorHandlerRef="myErrorHandler">
<from uri="direct:csvOnboardingChannel" />
<to uri="bean:insertDB" />
</route>
When "route" a file from-to, is it move like a message? or putting the question different, does Apache Camel take a file, wrap it as a message and route it to a bean or a component?
Do I understand it correct or am in a wrong directation.
Yes, your understanding is correct. Camel reads in the file's data and sends it as a message through the route to a bean. Might also be simpler as a single route, like so:
<route id="route1" errorHandlerRef="myErrorHandler">
<from uri="file://{someFolder1}}">
<to uri="bean:xml2csv" />
<to uri="bean:insertDB" />
</route>

Camel "Succesfull delivery acknowledgements"

I have been trying to come up with a camel route that would read from an activemq and write to Oracle AQ.
However, when a message is succesfully written to Oracle-aq, I have to write a successful message to another Active mq queue("something like message with id 41 has been sent to OracleAQ")
Is there any "Auto-acknowledge" type of feature in camel that can be useful here?
This is the basic route that i have that routes from active mq to oracle aq.
<route>
<from uri="jms:queue:Q.Customer1"/>
<setHeader headerName="prop">
<simple>header1Value</simple>
</setHeader>
<to uri="oracleQueue:queue:Q.Customer2"/>
</route>
Just add another to that points to the queue you want camel to post to after it writes to oracle, like so:
<onException>
<exception>some.sql.Exception</exception>
<to uri="some:error:handler:uri" /> <!-- like a bean or dead letter channel or whatever -->
</onException>
<route>
<from uri="jms:queue:Q.Customer1"/>
<setHeader headerName="prop">
<simple>header1Value</simple>
</setHeader>
<to uri="oracleQueue:queue:Q.Customer2"/>
<!-- this step will not be called until the previous one is finished -->
<to uri="jms:queue:SomeOtherQueue"/>
</route>

Categories