Expand my Community achievements bar.

Don’t miss the AEM Skill Exchange in SF on Nov 14—hear from industry leaders, learn best practices, and enhance your AEM strategy with practical tips.
SOLVED

Consuming messages from a message queue

Avatar

Level 5

HI I am working on a requirement where an existing application in ecosystem creates messages(which are metadata updates to products) .These are sent to a message queue.

In AEM I have to consume these messages from queues.

Looking for an example where rabitmq is used in an osgi service to consume messages from a queue.

Any help is welcome:)

Thanks in advance.

1 Accepted Solution

Avatar

Correct answer by
Administrator

Hi 

Whatever things that are possible in Java is possible here in AEM. 

I have not worked on "rabbitmw", but by looking at its documentation, "rabbitmq" provide a java client (http://www.rabbitmq.com/java-client.html).

Using it, we can write Sender and Receiver. 

Sender:            

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Send {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    String message = "Hello World!";
    channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
    System.out.println(" [x] Sent '" + message + "'");

    channel.close();
    connection.close();
  }
}

Receiver:-

import com.rabbitmq.client.*;

import java.io.IOException;

public class Recv {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

    Consumer consumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
          throws IOException {
        String message = new String(body, "UTF-8");
        System.out.println(" [x] Received '" + message + "'");
      }
    };
    channel.basicConsume(QUEUE_NAME, true, consumer);
  }
}

You can create a service in AEM to do so (https://helpx.adobe.com/experience-manager/using/aem_wordpress.html). 

AEM-rabbitmw reference martial :-  https://github.com/viveksachdeva/aem-utils

Blog link: - http://vivekaem.blogspot.in/2015/07/aem-implement-queue-using-rabbitmq.html

I hope this would be helpful to you.

Thanks and Regards

Kautuk Sahni



Kautuk Sahni

View solution in original post

2 Replies

Avatar

Level 10

I am not aware of any examples or community articles that show use of this. May make a good community article. 

If there is a Java API - I would think first step is to use that Java API within a custom AEM service. 

When i use to work on Adobe Data Services - that product had a Message Service: 

http://scottsdigitalcommunity.blogspot.ca/2011/12/create-mobile-applications-for-data.html

But AEM does not have a Message Service. 

Avatar

Correct answer by
Administrator

Hi 

Whatever things that are possible in Java is possible here in AEM. 

I have not worked on "rabbitmw", but by looking at its documentation, "rabbitmq" provide a java client (http://www.rabbitmq.com/java-client.html).

Using it, we can write Sender and Receiver. 

Sender:            

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

public class Send {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    String message = "Hello World!";
    channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
    System.out.println(" [x] Sent '" + message + "'");

    channel.close();
    connection.close();
  }
}

Receiver:-

import com.rabbitmq.client.*;

import java.io.IOException;

public class Recv {

  private final static String QUEUE_NAME = "hello";

  public static void main(String[] argv) throws Exception {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost("localhost");
    Connection connection = factory.newConnection();
    Channel channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    System.out.println(" [*] Waiting for messages. To exit press CTRL+C");

    Consumer consumer = new DefaultConsumer(channel) {
      @Override
      public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
          throws IOException {
        String message = new String(body, "UTF-8");
        System.out.println(" [x] Received '" + message + "'");
      }
    };
    channel.basicConsume(QUEUE_NAME, true, consumer);
  }
}

You can create a service in AEM to do so (https://helpx.adobe.com/experience-manager/using/aem_wordpress.html). 

AEM-rabbitmw reference martial :-  https://github.com/viveksachdeva/aem-utils

Blog link: - http://vivekaem.blogspot.in/2015/07/aem-implement-queue-using-rabbitmq.html

I hope this would be helpful to you.

Thanks and Regards

Kautuk Sahni



Kautuk Sahni