Showing posts with label maven. Show all posts
Showing posts with label maven. Show all posts

Wednesday, July 15, 2015

RabbitMQ client to subscribe to a queue in WSO2 Message Broker 3.0.0 using Java

Hi All,

WSO2 Message Broker 3.0.0 is a distributed message broker that provides reliable messaging.

This post will explain on how the RabbitMQ java client can be used to subscribe to a queue WSO2 Message Broker 3.0.0 with the help of Maven.

Add the RabbitMQ java client dependency

Add the following dependency the pom.xml file

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>3.5.3</version>
</dependency>

The Code

Following is the implementation. See descriptions inline.

// The queue name
String queueName = "MyQueue";

// Creating the AMQP connection string for communication
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setVirtualHost("/carbon");
factory.setUsername("admin");
factory.setPassword("admin");
final Connection connection = factory.newConnection();
final Channel channel = connection.createChannel();

// Creating the queue
channel.queueDeclare(queueName, true, false, false, null);

// Binding the queue to "amq.direct" exchange. Exchanges cannot be declared in WSO2 MB 3.0.0.
channel.queueBind(queueName, "amq.direct", queueName);

// Creating consumer
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(queueName, false, consumer);

// Shutdown hook handler
Runtime.getRuntime().addShutdownHook(new Thread() {
    @Override
    public void run() {
        try {
            // Closing the connection
            channel.close();
            connection.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (TimeoutException e) {
            throw new RuntimeException(e);
        }
    }
});

// Accepting messages
while (true) {
    QueueingConsumer.Delivery delivery = consumer.nextDelivery();
    String message = new String(delivery.getBody());

    System.out.println("Message Received : " + message);
}

Click here to download the sample maven project.

References...

RabbitMQ client to publish JMS messages to WSO2 Message Broker 3.0.0 using Java

Hi All,

WSO2 Message Broker 3.0.0 is a distributed message broker that supports AMQP and MQTT.

This post will explain on how the RabbitMQ java client can be used to publish JMS messages to WSO2 Message Broker 3.0.0 with the help of Maven.

Add the RabbitMQ java client dependency

Add the following dependency the pom.xml file

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>3.5.3</version>
</dependency>

The Code

Following is the implementation. See descriptions inline.

// The queue name
String queueName = "MyQueue";

// Creating the AMQP connection string for communication
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setVirtualHost("/carbon");
factory.setUsername("admin");
factory.setPassword("admin");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

// Creating the queue
channel.queueDeclare(queueName, true, false, false, null);

// Binding the queue to "amq.direct" exchange. Exchanges cannot be declared in WSO2 MB 3.0.0.
channel.queueBind(queueName, "amq.direct", queueName);

// Message content to publish
String message = "This is a test message";

// Creating properties for the message.
AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties.Builder();
properties.messageId("ID:" + String.valueOf(UUID.randomUUID()));
properties.contentType("text/plain");

// Publishing message
channel.basicPublish("amq.direct", queueName, properties.build(), message.getBytes());

System.out.println("Message published : " + message);

// Closing the connection
channel.close();
connection.close();

Output on management console.

Click here to download the sample maven project.

References...

Wednesday, March 25, 2015

Creating Runnable JAR using Maven.

At times we need to create a runnable jar using maven. So that we can run it as following.

java -jar MyJar.jar

This can be achieved using 2 different ways as far as I have learnt.

  1. Using "maven-shade-plugin" Plugin of Maven
  2. Using "maven-jar-plugin" Plugin of Maven

Using "maven-shade-plugin" Plugin of Maven

This might be the easiest way of creating a jar file of your java program. Simply add the following plugin to pom.xml.

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>2.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <transformers>
                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                  <mainClass>com.hemika.samples.MyMainClass</mainClass>
                </transformer>
              </transformers>
            </configuration>
          </execution>
        </executions>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

Here we have to add the reference path of the class which contains the main method to the "mainClass" element in the xml.

Sometimes we might encounter the following exception.

Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

The reason for this is as follows...

" The reason java.lang.SecurityException is raised is because some dependency jar files are signed jar files. A jar file is signed by using jarsigner, which creates 2 additional files and places them in META-INF: a signature file, with a .SF extension, and a signature block file, with a .DSA, .RSA, or .EC extension. Since the uber-jar file is created, the signatures and integrity of signed JAR files are no longer valid. When the uber-jar file is executed, java.lang.SecurityException is thrown. " - maven shade plugin: Invalid signature file digest for Manifest main attributes

The solution is it add the following filter.

<configuration>
 <filters>
            <filter>
              <artifact>*:*</artifact>
              <excludes>
                <exclude>META-INF/*.SF</exclude>
                <exclude>META-INF/*.DSA</exclude>
                <exclude>META-INF/*.RSA</exclude>
              </excludes>
            </filter>
 </filters>
</configuration>

To build the jar, run the following command...

mvn clean install

...and thats all for making a shaded jar.

Click here to see a sample.

Using "maven-jar-plugin" Plugin of Maven

Using this way requires to use 2 maven plugins. After executing "mvn clean install", the target folder will contain the jar file and also a "lib" folder. The "lib" folder will contain all the dependencies. This way is more advantageous as the depending library files are available from outside of the jar. Later if we need to replace the dependency jar with a new version or so, this will become useful.

Add the following to the pom.xml.

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
 <artifactId>maven-dependency-plugin</artifactId>
 <executions>
   <execution>
     <phase>install</phase>
     <goals>
              <goal>copy-dependencies</goal>
            </goals>
            <configuration>
       <outputDirectory>${project.build.directory}/lib</outputDirectory>
     </configuration>
   </execution>
 </executions>
      </plugin>
      <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-jar-plugin</artifactId>
 <configuration>
   <archive>
            <manifest>
       <addClasspath>true</addClasspath>
       <useUniqueVersions>false</useUniqueVersions>
       <classpathPrefix>lib/</classpathPrefix>
       <mainClass>com.hemika.samples.Main</mainClass>
            </manifest>
          </archive>
 </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

The class that has the main method needs to be added at the "mainClass" node in the xml.

To build the jar, run the following command...

mvn clean install

...and thats all for creating a runnable jar.

Click here to see a sample.

References...