{"id":219,"date":"2013-01-14T14:33:47","date_gmt":"2013-01-14T14:33:47","guid":{"rendered":"http:\/\/www.andreagirardi.it\/blog\/?p=219"},"modified":"2018-03-27T09:48:53","modified_gmt":"2018-03-27T09:48:53","slug":"camel-and-rabbitmq-finally-how-to","status":"publish","type":"post","link":"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/","title":{"rendered":"Camel and RabbitMQ : Finally, how to!"},"content":{"rendered":"<p>Define a RabbitMQ broker endpoint in Camel is possible with the Bluelock camel-spring-amqp (https:\/\/github.com\/Bluelock\/camel-spring-amqp) library. It&#8217;s an Apache Camel component that allows to natively communicate with a RabbitMQ broker and it&#8217;s implemented using Spring&#8217;s AMQP.<\/p>\n<p>For first, with Eclipse IDE create a new Maven Project with Artifact ID camel-arthetype-spring. This allows using Spring DSL to configure Camel route and execute the run:camel goal of Camel Mavel Pluing (Camel Maven Plugin) in a forked JVM from Maven.<\/p>\n<p>To resolve the dependencies, these entries are mandatory:<\/p>\n<pre lang=\"xml\">\r\n<dependency>\r\n\t<groupId>com.bluelock<\/groupId>\r\n\t<artifactId>camel-spring-amqp<\/artifactId>\r\n\t<version>1.2<\/version>\r\n<\/dependency>\r\n\r\n<!-- Camel dependencies -->\r\n<dependency>\r\n\t<groupId>org.apache.camel<\/groupId>\r\n\t<artifactId>camel-test<\/artifactId>\r\n\t<version>${org.camel.version}<\/version>          \r\n<\/dependency>\r\n<dependency>\r\n\t<groupId>org.apache.camel<\/groupId>\r\n\t<artifactId>camel-spring<\/artifactId>\r\n\t<version>${org.camel.version}<\/version>        \r\n\t<exclusions>\r\n\t\t<exclusion>\r\n\t\t\t<artifactId>spring-tx<\/artifactId>\r\n\t\t\t<groupId>org.springframework<\/groupId>\r\n\t\t<\/exclusion>\r\n\t\t<exclusion>\r\n\t\t\t<artifactId>spring-context<\/artifactId>\r\n\t\t\t<groupId>org.springframework<\/groupId>\r\n\t\t<\/exclusion>\r\n\t<\/exclusions>\r\n<\/dependency>\r\n<dependency>\r\n\t<groupId>org.apache.camel<\/groupId>\r\n\t<artifactId>camel-xstream<\/artifactId>\r\n\t<version>${org.camel.version}<\/version>            \r\n<\/dependency>\r\n<\/pre>\n<p>At this point edit the camel-context.xml available on src\/main\/resource\/META-INF\/spring folder:<\/p>\n<pre lang=\"xml\">\r\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<!-- Configures the Camel Context-->\r\n\r\n<beans xmlns=\"http:\/\/www.springframework.org\/schema\/beans\"\r\n       xmlns:xsi=\"http:\/\/www.w3.org\/2001\/XMLSchema-instance\"\r\n       xmlns:camel=\"http:\/\/camel.apache.org\/schema\/spring\"\r\n       xmlns:rabbit=\"http:\/\/www.springframework.org\/schema\/rabbit\"\r\n       xmlns:context=\"http:\/\/www.springframework.org\/schema\/context\"\r\n       xsi:schemaLocation=\"\r\n       http:\/\/www.springframework.org\/schema\/beans http:\/\/www.springframework.org\/schema\/beans\/spring-beans.xsd\r\n       http:\/\/www.springframework.org\/schema\/context http:\/\/www.springframework.org\/schema\/context\/spring-context.xsd\r\n       http:\/\/camel.apache.org\/schema\/spring http:\/\/camel.apache.org\/schema\/spring\/camel-spring.xsd\r\n       http:\/\/www.springframework.org\/schema\/rabbit http:\/\/www.springframework.org\/schema\/rabbit\/spring-rabbit-1.0.xsd\">\r\n       \r\n\t<camelContext xmlns=\"http:\/\/camel.apache.org\/schema\/spring\">\r\n\t\t<route>\t\r\n\t\t\t<from uri=\"spring-amqp:KipcastDirect:KipcastQueue:KipcastRouting?type=direct&amp;autodelete=true&amp;durable=true\" \/>\r\n\t\t\t<log message=\"Message available on a RabbitMQ Queue\" \/>\t\t\t\r\n\t\t\t<process ref=\"processorTest\" \/>\r\n\t\t<\/route>\r\n\t<\/camelContext>\r\n\r\n\t<rabbit:connection-factory id=\"amqpConnectionFactory\" \/>\r\n\t<rabbit:template id=\"amqpTemplate\" connection-factory=\"amqpConnectionFactory\" message-converter=\"messageConverter\" exchange=\"KipcastBean\" \/>\r\n\t<rabbit:admin connection-factory=\"amqpConnectionFactory\"\/>\r\n\t\r\n\t<bean id=\"amqpConnectionFactory\" class=\"org.springframework.amqp.rabbit.connection.CachingConnectionFactory\">\r\n\t    <property name=\"host\" value=\"10.211.55.20\"\/>\r\n\t    <property name=\"port\" value=\"5672\"\/>\r\n\t    <property name=\"username\" value=\"guest\"\/>\r\n\t    <property name=\"password\" value=\"guest\"\/>\r\n\t    <property name=\"virtualHost\" value=\"\/\"\/>\r\n\t<\/bean>\r\n\t\r\n    <bean id=\"jsonMessageConverter\" class=\"amqp.spring.converter.XStreamConverter\"\/>\r\n    <bean id=\"textMessageConverter\" class=\"amqp.spring.converter.StringConverter\"\/>\r\n    <bean id=\"messageConverter\" class=\"amqp.spring.converter.ContentTypeConverterFactory\">\r\n        <property name=\"converters\">\r\n            <map>\r\n                <entry key=\"application\/json\" value-ref=\"jsonMessageConverter\"\/>\r\n                <entry key=\"application\/xml\" value-ref=\"textMessageConverter\"\/>\r\n            <\/map>\r\n        <\/property>\r\n        <property name=\"fallbackConverter\" ref=\"textMessageConverter\"\/>\r\n    <\/bean>\r\n    \r\n<\/beans>\r\n<\/pre>\n<p>In this case, a route starting from a RabbitMQ queue to a system log and a listener on your queue that will be active until you terminate your maven came:run process has been created.<\/p>\n<p>It&#8217;s very important to note that, on Spring XML &amp; has to be quoted &amp;amp;<\/p>\n<p>The following Java code should be used send a message to the Exchange defined on Camel Route:<\/p>\n<pre lang=\"java\">@Test\r\npublic void test() throws KeyManagementException, NoSuchAlgorithmException, URISyntaxException, IOException {\r\n\tConnectionFactory factory = new ConnectionFactory();\r\n\tfactory.setHost(\"10.211.55.20\");\r\n\tfactory.setPort(5672);\r\n\tfactory.setVirtualHost(\"\/\");\r\n\tfactory.setUsername(\"guest\");\r\n\tfactory.setPassword(\"guest\");\r\n\tConnection connection = factory.newConnection();\r\n\tChannel channel = connection.createChannel();\r\n\r\n\tchannel.exchangeDeclare(\"KipcastDirect\", \"direct\", \r\n\t\t   true, \t\/* durable *\/\r\n\t\t   true, \t\/* autodelete *\/\r\n\t\t   null); \t\/* *\/\r\n\r\n\tbyte[] messageBodyBytes = \"Hello, world!\".getBytes();\r\n\r\n\tAMQP.BasicProperties.Builder basic = new AMQP.BasicProperties.Builder();\r\n\tAMQP.BasicProperties minBasic = basic.build();\r\n\r\n\tminBasic = basic.priority(0).deliveryMode(1).build();\r\n\r\n\tchannel.basicPublish(\"KipcastDirect\", \"KipcastRouting\", minBasic, messageBodyBytes);\r\n\tSystem.out.println(\" [x] Sent \");\r\n\r\n\tchannel.close();\r\n}<\/pre>\n<p>To test if listener works, for first run the queue listener and, after that, run the Junit class to send message. The output will be:<\/p>\n<pre lang=\"bash\">[pache.camel.spring.Main.main()] MainSupport                    INFO  Apache Camel 2.10.3 starting\r\n[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Apache Camel 2.10.3 (CamelContext: camel-1) is starting\r\n[pache.camel.spring.Main.main()] ManagementStrategyFactory      INFO  JMX enabled.\r\n[pache.camel.spring.Main.main()] DefaultTypeConverter           INFO  Loaded 177 type converters\r\n[pache.camel.spring.Main.main()] SpringAMQPComponent            INFO  Found AMQP ConnectionFactory in registry for 10.211.55.20\r\n[pache.camel.spring.Main.main()] SpringAMQPComponent            INFO  Found AMQP Template in registry\r\n[pache.camel.spring.Main.main()] SpringAMQPComponent            INFO  Found AMQP Administrator in registry\r\n[pache.camel.spring.Main.main()] SpringAMQPEndpoint             INFO  Creating endpoint for KipcastDirect:KipcastQueue:KipcastRouting\r\n[pache.camel.spring.Main.main()] SpringAMQPConsumer             INFO  Declared exchange KipcastDirect\r\n[pache.camel.spring.Main.main()] SpringAMQPConsumer             INFO  Declared queue KipcastQueue\r\n[pache.camel.spring.Main.main()] SpringAMQPConsumer             INFO  Declaring binding KipcastRouting\r\n[pache.camel.spring.Main.main()] SpringAMQPConsumer             INFO  Started AMQP Async Listeners for spring-amqp:\/\/KipcastDirect:KipcastQueue:KipcastRouting?autodelete=true&amp;durable=true&amp;type=direct\r\n[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Route: route1 started and consuming from: Endpoint[spring-amqp:\/\/KipcastDirect:KipcastQueue:KipcastRouting?autodelete=true&amp;durable=true&amp;type=direct]\r\n[pache.camel.spring.Main.main()] ultManagementLifecycleStrategy INFO  StatisticsLevel at All so enabling load performance statistics\r\n[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Total 1 routes, of which 1 is started.\r\n[pache.camel.spring.Main.main()] SpringCamelContext             INFO  Apache Camel 2.10.3 (CamelContext: camel-1) started in 0.505 seconds\r\n[     SimpleAsyncTaskExecutor-1] route1                         INFO  Message available on a RabbitMQ Queue<\/pre>\n<p>At this point, you can have fun with Camel and RabbitMQ!!!!! <\/p>\n<p>NOTES:<\/p>\n<p>1 &#8211; Please be careful: the URI (from and to) on Camel Spring DSL context and JUnit class must refer to same Exchange and Queue to prevent a reply-text=PRECONDITION_FAILED &#8211; parameters for queue &#8216;QUEUE&#8217; in vhost &#8216;\/&#8217; not equivalen error or similar. To check the queues\/exchanges configuration parameter using:<\/p>\n<pre lang=\"bash\">rabbitmqadmin -V \/ list queue\r\nrabbitmqadmin -V test list exchanges<\/pre>\n<p><strong>if you like this post, please click on the advertise :)<\/strong><\/p>\n<p>[AdSense-A]<\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Share this:<\/h3><div class=\"sd-content\"><ul><li class=\"share-linkedin\"><a rel=\"nofollow\" data-shared=\"sharing-linkedin-219\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=linkedin\" target=\"_blank\" title=\"Click to share on LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-reddit\"><a rel=\"nofollow\" data-shared=\"\" class=\"share-reddit sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=reddit\" target=\"_blank\" title=\"Click to share on Reddit\"><span>Reddit<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow\" data-shared=\"sharing-twitter-219\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=twitter\" target=\"_blank\" title=\"Click to share on Twitter\"><span>Twitter<\/span><\/a><\/li><li class=\"share-facebook\"><a rel=\"nofollow\" data-shared=\"sharing-facebook-219\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=facebook\" target=\"_blank\" title=\"Click to share on Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-skype\"><a rel=\"nofollow\" data-shared=\"sharing-skype-219\" class=\"share-skype sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=skype\" target=\"_blank\" title=\"Share on Skype\"><span>Skype<\/span><\/a><\/li><li class=\"share-pocket\"><a rel=\"nofollow\" data-shared=\"\" class=\"share-pocket sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=pocket\" target=\"_blank\" title=\"Click to share on Pocket\"><span>Pocket<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>Define a RabbitMQ broker endpoint in Camel is possible with the Bluelock camel-spring-amqp (https:\/\/github.com\/Bluelock\/camel-spring-amqp) library. It&#8217;s an Apache Camel component that allows to natively communicate with a RabbitMQ broker and it&#8217;s implemented using Spring&#8217;s AMQP. For first, with Eclipse IDE create a new Maven Project with Artifact ID camel-arthetype-spring. This allows using Spring DSL to [&hellip;]<\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Share this:<\/h3><div class=\"sd-content\"><ul><li class=\"share-linkedin\"><a rel=\"nofollow\" data-shared=\"sharing-linkedin-219\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=linkedin\" target=\"_blank\" title=\"Click to share on LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-reddit\"><a rel=\"nofollow\" data-shared=\"\" class=\"share-reddit sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=reddit\" target=\"_blank\" title=\"Click to share on Reddit\"><span>Reddit<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow\" data-shared=\"sharing-twitter-219\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=twitter\" target=\"_blank\" title=\"Click to share on Twitter\"><span>Twitter<\/span><\/a><\/li><li class=\"share-facebook\"><a rel=\"nofollow\" data-shared=\"sharing-facebook-219\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=facebook\" target=\"_blank\" title=\"Click to share on Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-skype\"><a rel=\"nofollow\" data-shared=\"sharing-skype-219\" class=\"share-skype sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=skype\" target=\"_blank\" title=\"Share on Skype\"><span>Skype<\/span><\/a><\/li><li class=\"share-pocket\"><a rel=\"nofollow\" data-shared=\"\" class=\"share-pocket sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/camel-and-rabbitmq-finally-how-to\/?share=pocket\" target=\"_blank\" title=\"Click to share on Pocket\"><span>Pocket<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div>","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"footnotes":""},"categories":[14],"tags":[30,24,13],"_links":{"self":[{"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/posts\/219"}],"collection":[{"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/comments?post=219"}],"version-history":[{"count":15,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/posts\/219\/revisions"}],"predecessor-version":[{"id":766,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/posts\/219\/revisions\/766"}],"wp:attachment":[{"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/media?parent=219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/categories?post=219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/tags?post=219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}