Java Gateway - How to store object in memory between calls?

Primary tabs

Trying to connect Ensemble to RabbitMQ following this article I'm using Java Gateway and encountered the following problem - in all my calls I need to pass connection object, which is always the same but it takes a long time to create. Here's java code:

package com.myorgname.rabbitmq;

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

public class Wrapper {

  public void sendMsg(String hostName, String queueName, byte[] msg) throws Exception {
       ConnectionFactory factory = new ConnectionFactory();
       factory.setHost(hostName);
       Connection connection = factory.newConnection();
       Channel channel = connection.createChannel();
       channel.queueDeclare(queueName, false, false, false, null);

          channel.basicPublish("", queueName, null, msg);

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

  }

    public int readMsg(String hostName, String queueName, byte[] msg) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(hostName);
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
        channel.queueDeclare(queueName, false, false, false, null);
        QueueingConsumer consumer = new QueueingConsumer(channel);
        channel.basicConsume(queueName, true, consumer);

        QueueingConsumer.Delivery delivery = consumer.nextDelivery();      
        int len = delivery.getBody().length;
        System.arraycopy(delivery.getBody(),0,msg,0,len);

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

        return len;

    }

}

As you see to publish or to get a message a new connection is made each time.

I'm interested in a way to create a connection object only once and use it to send several messages. Is it possible?

  • 0
  • 0
  • 212
  • 0
  • 1

Answers

Turns out Java Gateway can instantiate objects and call their methods.  Here's a rewrite of the above code, but all connecting is done in constructor:

package com.isc.rabbitmq;

import com.rabbitmq.client.*;

public class Wrapper {
    private final Channel _channel;

    private final String _queueName;

    public Wrapper(String hostName, String queueName)  throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost(hostName);
        Connection connection = factory.newConnection();
        _channel = connection.createChannel();
        _channel.queueDeclare(queueName, false, false, false, null);
        _queueName = queueName;
    }

    public void sendMsg(byte[] msg) throws Exception {
        _channel.basicPublish("", _queueName, null, msg);
    }

    public int readMsg(byte[] msg) throws Exception {
        boolean autoAck = true;
        GetResponse response = _channel.basicGet(_queueName, autoAck);
        int len = 0;
        if (response == null) {
            // No message retrieved.
        } else {
            AMQP.BasicProperties props = response.getProps();
            len = response.getBody().length;
            System.arraycopy(response.getBody(),0,msg,0,len);
        }
        return len;
    }

}