jhalterman / lyra

High availability RabbitMQ client
Apache License 2.0
262 stars 74 forks source link

RabbitMQ flooded by new connections #79

Closed Allan-Nava closed 7 years ago

Allan-Nava commented 7 years ago

Hi,

i'm using java api client with Automatic Recovery but every time it loses the connection, when it reconnects it creates a new connection on a different port. That the lost connection remain visible in the dashboard and it isn't automatically deleted after a timeout. The problem is that the lost connections are hundreds in my environment! At some point the connections are that much that the dashboard is totally not usable anymore, it slows down and it doesn't load. The environment I am working on loses the connection frequently.

Is it possibile use the same connection when it tries to reconnect?

Thanks in advance

Allan-Nava commented 7 years ago

I used Lyra library but when the client lost connection, it still create a new connections.

This is my subiscribe method:

`

private void subscribe(final Handler handler)
{
    subscribeThread = new Thread(new Runnable() {
        @Override
        public void run() {
            while(true) {
                try {
                    //connection = connectionFactory.newConnection();
                    connection = MySingletonConnection.getInstance().getConnection();
                    //connection = Connections.create(options, config);
                    Channel channel = connection.createChannel();
                    // Declare a queue and bind it to an exchange.
                    com.rabbitmq.client.AMQP.Queue.DeclareOk q = channel.queueDeclare("manager2box-"+ROUTING_KEY, true, false, true, null);
                    channel.queueBind(q.getQueue(), EXCHANGE, ROUTING_KEY);
                    // Create the QueueingConsumer and have it consume from the queue
                    QueueingConsumer consumer = new QueueingConsumer(channel);
                    channel.basicConsume(q.getQueue(), false, consumer);

                    while (true) {
                        QueueingConsumer.Delivery delivery = consumer.nextDelivery();
                        String message = new String(delivery.getBody());
                        Log.d(TAG, message);
                        Message msg = handler.obtainMessage();
                        Bundle bundle = new Bundle();
                        bundle.putString("commandBundle", message);
                        msg.setData(bundle);
                        handler.sendMessage(msg);
                    }
                } catch (InterruptedException e) {
                    Log.d(TAG, "InterruptedException");
                    e.printStackTrace();
                    break;
                } catch (Exception e1) {
                    Log.d(TAG, "Connection broken: " + e1.getClass().getName());
                    e1.printStackTrace();
                    try {
                        Thread.sleep(5000); //sleep and then try again
                    } catch (InterruptedException e) {
                        Log.d(TAG, "InterruptedException");
                        e.printStackTrace();
                        break;
                    }
                }
            }
        }
    });
    subscribeThread.start();
}

This is my SingletonConnection:

public class MySingletonConnection{
    public static final MySingletonConnection INSTANCE = new MySingletonConnection();
    private static Connection connection;

    private final String TAG = "MySingletonConnection";
    private final String EXCHANGE    = "manager2box";
    private final String USERNAME    = "manager";
    private final String PASSWORD    = "MGXxXq72HscXzakR";
    //private final String HOST        = "192.168.1.147";
    private final String HOST        = "portal.seafy.me";
    private final String ROUTING_KEY = Utils.getIPAddress();
    private Config config;
    private ConnectionOptions options;

    private MySingletonConnection(){
        //Lyra config
        config = new Config()
                .withConnectionListeners()
                .withRecoveryPolicy(RecoveryPolicies.recoverAlways())
                .withRetryPolicy(new RetryPolicy()
                        .withMaxAttempts(20)
                        .withInterval(Duration.seconds(5))
                        .withMaxDuration(Duration.minutes(5)));
        //Lyra option config for connection
        options = new ConnectionOptions().withUsername(USERNAME)
                .withRequestedHeartbeat(Duration.seconds(30))
                .withPassword(PASSWORD)
                .withHost(HOST)
                .withPort(5672);
        try {
            connection = Connections.create(options, config);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }

    public static MySingletonConnection getInstance(){
        return INSTANCE;
    }

    public Connection getConnection( ) {
        return connection;
    }
}

`

michaelklishin commented 7 years ago

Are you sure that opening new connections and channels in a while(true) loop is really necessary? Any client with that kind of code would produce a connection storm.

michaelklishin commented 7 years ago

This should be closed as it has nothing to do with Lyra. The same question was answered in a RabbitMQ Java client issue and on rabbitmq-users.

Allan-Nava commented 7 years ago

Ok thanks a lot!

2017-07-03 18:11 GMT+02:00 Michael Klishin notifications@github.com:

This should be closed as it has nothing to do with Lyra. The same question was answered in a RabbitMQ Java client issue https://github.com/rabbitmq/rabbitmq-java-client/issues/287 and on rabbitmq-users https://groups.google.com/forum/#!topic/rabbitmq-users/bLLck08qA1Y.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/jhalterman/lyra/issues/79#issuecomment-312685309, or mute the thread https://github.com/notifications/unsubscribe-auth/AVdMg5MWg_wmV6Sd20K8ob3ZET5bMsf4ks5sKRLLgaJpZM4OMYvl .

michaelklishin commented 7 years ago

Duplicate of #75, addressed by #82.