RabbitMQ для Android и Java

Я пытаюсь воспроизвести первый пример Java-издателя, который можно найти на главной странице RabbitMQ.

Во-первых, я сделал это на Java, и он работал нормально. Затем, я попробовал это на Android, и вот где странная часть.

Я добавил вручную те же библиотеки jar, которые я использовал в своей программе Java, и которые предлагаются в учебнике RabbitMQ. То есть, amqp-client-5.4.1, slf4j-api-1.7.21 и slf4j-simple-1.7.22 добавляются в каталог /libs а затем ссылаются в buid.gradle(module:app) с командами implementation files('libs/amqp-client-5.4.1.jar') и т.д.

Затем я добавил требуемые зависимости пакета в файле MainActivity.java без каких-либо ошибок. Но при добавлении части кода, который должен публиковать данные, различные методы импортированных библиотек не найдены, например, factory появляется, поскольку у нее не было метода setHost.

Я присоединяю следующий код, который я использую сейчас.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

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

public class MainActivity extends AppCompatActivity {

    String QUEUE_NAME = "hello";
    ConnectionFactory factory = new ConnectionFactory();

    factory.setHost("192.0.0.0"); //Marked as error
    factory.setUsername("test");
    factory.setPassword("test");
    Connection connection;
    Channel channel;
    connection = factory.newConnection();
    channel = connection.createChannel();

    channel.queueDeclare(QUEUE_NAME, false, false, false, null);
    String message = "Example3";
    channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
    System.out.println(" [x] Sent '" + message + "'");
    channel.close();
    connection.close();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Любые идеи о том, почему этот код отлично работает на Java, но эти библиотеки не могут быть правильно импортированы в Android?

Ответы

Ответ 1

В java у вас не может быть кода вне метода. Все, что вы можете сделать, это инициализация членов класса. ИМХО это не проблема импорта банки.

Попробуй это:

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

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

public class MainActivity extends AppCompatActivity {

    String QUEUE_NAME = "hello";
    ConnectionFactory factory = new ConnectionFactory();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        try {
            factory.setHost("192.0.0.0");
            factory.setUsername("test");
            factory.setPassword("test");
            Connection connection;
            Channel channel;
            connection = factory.newConnection();
            channel = connection.createChannel();

            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            String message = "Example3";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
            channel.close();
            connection.close();
        } catch (IOException | TimeoutException e) {
            throw new RuntimeException("Rabbitmq problem", e);
        }
    }
}

Возвращаясь к вашей первоначальной озабоченности, я не вижу причин, по которым вы вручную загружаете все ваши зависимости, а не используя встроенное управление зависимостями gradle.

Если вы обновите раздел зависимостей в файле build.gradle, необходимые зависимости будут автоматически загружены. Гораздо проще добавлять/удалять/обновлять зависимости.

dependencies {
    compile group: 'com.rabbitmq', name: 'amqp-client', version: '5.4.1'
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.21'
    compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.21'
}