I have tested AMQP Transport implementation for RabbitMQ (v3.3.5) from WSO2 ESB (v4.8.1) Proxies with a few minor issues, now everything works fine. For this, I followed this blog post (from 2013/03/26).
Now, I would like to try with WSO2 MessageStore & MessageProcessor with RabbitMQ, because I think this is the best approach to follow, but seems that is not any implementation for RabbitMQ and WSO2's Documentation Portal says nothing of how to implement it.
I know that RabbitMQ (v3.3.5) do not implement JMS1.1 and AMQP1.0 by default, It does need extra plugins. Then, What do I need to follow to implement MS/MP correctly?.
I have started reviewing the source code of the current implementation of org.apache.synapse.message.store.impl.jms.JmsStore and org.apache.synapse.message.processor.impl.forwarder.ScheduledMessageForwardingProcessor, but I need more guidance.
Someone has implement custom MessageStore/MessageProcessor?, Could you share your experience?.
Regards.
After digging in existing WSO2 JMS MessageStore implementation, I have created a new JMS-AMQP MessageStore for RabbitMQ. Using WSO2 MessageStore I can manage DeadLetter Channel and GuaranteedDelivery Patterns from WSO2 ESB.
The steps followed were:
1) To solve incompatibility issues between AMQP 0.9.1 implementation of RabbitMQ and JMS 1.1.
Right now does not exist any lib to connect to AMQP Broker using JMS, except the Apache Qpid client (0.30). It was a great help.
2) Improve existing code of WSO2 JMS MessageStore.
I added a new second JMS Destination, the first one was to consume and the another one was to produce messages. In this manner I got to connect to RabbitMQ using pre-configured Exchanges, Routing Keys and Queues.
I hope that is useful.
Regards.
Related
Has anyone succeeded in creating a bridge between IBM MQSeries (MQS) and ActiveMQ Artemis 7.x (AMQ 7) so that the later can send messages to and receive from the first? Currently I have no problem bridging between MQS 7.5 and AMQ 6.3 by deploying a camel route and MQS libraries on the broker itself. However, the same way doesn't work anymore as each route deployment requires a broker reconfiguration and restart.
Thanks in advance for any feedback.
A few examples ship with ActiveMQ Artemis which might be helpful:
The "inter-broker-bridge" example in the examples/features/sub-modules/ directory. This example demonstrates how to deploy an instance of org.apache.activemq.artemis.jms.bridge.impl.JMSBridgeImpl to the broker using Spring in a web application.
The "camel" example in the examples/features/standard/ directory. This example demonstrates how to deploy a Camel route to the broker using Spring in a web application.
I can't speak to whether or not either of these can be updated at runtime as I've not actually attempted that. Both of these options should be able to move messages in either direction (i.e. from Artemis to MQS or from MQS to Artemis).
Another option would simply be to run Camel standalone and deploy your routes there. This would give you more flexibility as it would allow you to specifically choose the hardware where the routes run as well as how many resources the Camel JVM consumes. Running Camel routes directly on the broker, while convenient, isn't a great fit because the broker is a broker and not an application server.
To be clear, ActiveMQ Artemis and IBM MQSeries are not directly compatible with each other and are not expected to be. This true for most (if not all) JMS broker implementations. The role of components like the ActiveMQ Artemis JMS bridge and integration platforms like Camel are to solve the compatibility problem by using a common API to speak to both brokers - JMS in this case. Any broker which implements JMS can be integrated using these methods.
Can someone explain different ways of configuring message listener.
I know two ways:
Spring Jms Listener
EJB MDB way.
Are there any other ways (should be applicable to both IBM MQ and Active MQ)?
For the first question, your proposed ways are good ones with Camel JMS.
For the second question take a look at Java JMS mix messaging implementations
if you want to use the same client without changing anything you have to use AMQP ptotocol wich is designed for this.
here is 2 examples :
ActiveMQ AMQP with JMS transformer leveraging spring Integration
Unable to access ActiveMQ using JMS based code and amqp 1.0
I am trying to understand JMS.
What is the difference between ActiveMQ and JMS
can pool the data from NON ActiveMQ with ActiveMQ plugin in Spring?
Thanks ,In advance
JMS is a specification. JMS has three main parts to it. The first is the producer, which is nothing more than a bean that submits a "message" to a JMS broker (#2) (the system that manages messages between producers and consumers). In this case, ActiveMQ is the broker. Once the broker receives a message, the consumer (#3), or Message-Driven Bean (MDB), processes the message.
If you want to work with JMS, you'll just write both your producer/consumer code using the JMS API, but behind the scenes there is a "resource adapter" that is a special ActiveMQ driver that will connect to an ActiveMQ instance and do the management for you.
Have a look at this post I made recently. I'm still trying to figure out the best way to write JMS beans, but I've got the basics down.
The accepted answer emphasizes what is the structure of JMS is. Not disagreeing just want to add to it in case anyone else wants to know. ActiveMQ could be a JMS supplier. A JMS supplier shapes the computer program system for encouraging the utilize of JMS concepts interior an application. A single node of ActiveMQ which permits clients to associate to it and utilize these informing concepts is called an "ActiveMQ Broker."
Enterprises feel this disparity with business actions such as mergers and acquisitions. This creates the need to maintain an increasingly heterogeneous collection of business applications. As your enterprise grows, so does the need to allow all of these platforms to share data. A number of architectural patterns exist today which help to solve this problem.
Some other examples of JMS providers are:
HornetQ.
RabbitMQ.
SonicMQ.
Winsows Azure Messaging
The following example shows a simple configuration of an ActiveMQ connection:
<jms:config name="JMS_Config">
<jms:active-mq-connection >
<jms:factory-configuration brokerUrl="tcp://localhost:61616" />
</jms:active-mq-connection>
</jms:config>
This post explains a detailed difference between the ActiveMQ and JMS (or maybe about the details of their specifications). Hope it clears your concepts.
I have a application in which I need to route my JMS messages to different managed servers based on some selector value. But I cannot use JMS bridges for the purpose as the application has more than 20 managed servers in production.so with the JMS bridge approach, it will become a hurdle for the deployment team to do such huge configuration.
Maybe You could try to use the Mule ESB or other ESB approach. I recommend the Mule ESB because it's simple, well documented and pretty lightweight.
We use RabbitMQ and Spring-AMQP for our messaging system.
However there are many Java libraries that use JMS that I would rather not rewrite to AMQP.
I failed to Google a JMS client that will use AMQP.
Should I just rewrite the library to use AMQP directly?
qpid , which also speaks amqp , has a JMS client library. Perhaps that also works with rabbitmq.
There's some (old) indications the OpenAMQ library works works with rabbitmq
Depending on what you're actually building, you'll probably find that Spring Integration is useful:
http://www.springsource.org/spring-integration
It abstracts the concepts of end points, such that they are pluggable and there is built-in support for JMS & AMQP.
It's fairly trivial to build a simple AMQP <-> JMS adapter.