安卓和Java平台上的RabbitMQ

14

我正在尝试复制RabbitMQ主页中第一个Java发布者示例

首先,我用Java实现,效果很好。然后,我尝试在Android上运行,这里就出现了奇怪的问题。

我手动添加了与我的Java程序中使用并在RabbitMQ教程中建议使用的相同的jar库。也就是说,在/libs目录下添加了amqp-client-5.4.1slf4j-api-1.7.21slf4j-simple-1.7.22,然后在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
通常情况下,您不会在生命周期方法之外运行代码,请尝试在onCreate中执行,并作为异步任务。 - josemigallas
这些库也可以在mavenCentral()上获得,例如:https://mvnrepository.com/artifact/com.rabbitmq/amqp-client/5.4.2 - Martin Zeitler
1个回答

11
在Java中,你不能在方法外部编写代码。你能做的只是初始化类成员变量。在我看来,这不是一个jar导入问题。
请尝试这个:
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'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接