监听器&x27;Firebase未调用s onDataChange()。无法在Java客户端(而非Android)上使用新的Google Firebase

监听器&x27;Firebase未调用s onDataChange()。无法在Java客户端(而非Android)上使用新的Google Firebase,java,firebase,firebase-realtime-database,firebase-authentication,Java,Firebase,Firebase Realtime Database,Firebase Authentication,一周来,我一直在尝试在Java客户端上从Firebase迁移到google Firebase。一个重要的细节是,客户端将在受控环境中运行,因此我可以允许在本地存储一些密钥 经过研究,我可以找到三种方法 作为使用服务帐户键的“服务器”,不会调用onDataChange()回调。这是我付出更多努力的解决方案,也是我仍然相信的解决方案。关于这个问题,我将提出我的准则。我怀疑我没有正确处理异步调用 关于这个例子,我的客观问题是,这些例子是自包含的,还是我应该在Java程序上实现一些东西来实现这一点,而我

一周来,我一直在尝试在Java客户端上从Firebase迁移到google Firebase。一个重要的细节是,客户端将在受控环境中运行,因此我可以允许在本地存储一些密钥

经过研究,我可以找到三种方法

作为使用服务帐户键的“服务器”,不会调用
onDataChange()
回调。这是我付出更多努力的解决方案,也是我仍然相信的解决方案。关于这个问题,我将提出我的准则。我怀疑我没有正确处理异步调用

关于这个例子,我的客观问题是,这些例子是自包含的,还是我应该在Java程序上实现一些东西来实现这一点,而我缺少了这些东西

此示例代码:

class Conf
{
    public String activeMQPassword;
    public String activeMQPath;
    public String activeMQUser;
    public String jdbcPassword;
    public String jdbcUrl;
    public String jdbcUser;
    public String jmsserver;
    public String logPath;
    public String s3AccessKey;
    public String s3Path;
    public String s3SecretKey;

    public Conf(String activeMQPassword, String activeMQPath, String activeMQUser, String jdbcPassword, String jdbcUrl, String jdbcUser, String jmsserver, String logPath, String s3AccessKey, String s3Path, String s3SecretKey)
    {
        this.activeMQPassword = activeMQPassword;
        this.activeMQPath = activeMQPath;
        this.activeMQUser = activeMQUser;
        this.jdbcPassword = jdbcPassword;
        this.jdbcUrl = jdbcUrl;
        this.jdbcUser = jdbcUser;
        this.jmsserver = jmsserver;
        this.logPath = logPath;
        this.s3AccessKey = s3AccessKey;
        this.s3Path = s3Path;
        this.s3SecretKey = s3SecretKey;
    }

}



FirebaseOptions  options = new FirebaseOptions.Builder()
                .setServiceAccount(new FileInputStream("c:/chaveFB/TesteNovaApi-0efd51a8ad0c.json"))
                .setDatabaseUrl("https://testenovaapi.firebaseio.com/")
                //.setDatabaseAuthVariableOverride(auth) //AQUI SETAMOS A RESTRIÇÃO DE ACESSO CRIADA LOGO ACIMA.
                .build();
FirebaseApp.initializeApp(options);

DatabaseReference ref = FirebaseDatabase
            .getInstance()
            .getReference("/conf");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("LA2LA2LA2LA2LA2LA2LA2LA2LA2LA2");
        Conf conf = dataSnapshot.getValue(Conf.class);
        System.out.println(conf.activeMQPassword);
        System.out.println(conf.activeMQPath);
        System.out.println(conf.activeMQUser);
        System.out.println(conf.jdbcPassword);
        System.out.println(conf.jdbcUser);
        System.out.println(conf.jmsserver);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
我在一个堆栈溢出主题中找到了一个解决回调问题的答案,但这个解决方案似乎是由Android驱动的,因为我无法遵循Java程序中的许多步骤

作为Android或web客户端,我无法将所需的LIB导入Java应用程序

使用API,过去我使用带有自定义令牌的API下载json并检索数据。但由于数据库密钥已被弃用,新的java库只能在“服务器模式”下工作,因此此服务器库创建的自定义密钥无法检索数据。Firebase响应时出现了一个错误,如
预期用户id密钥收到自定义密钥

如果我能使这种方法起作用,对我来说是可以的,因为Java客户机的安装位置是受控制的,而且足够安全。这是我以前的方法


我一定是大错特错了,我宁愿这样。但我的感觉是,我被锁在一个案件中,而这个案件还没有被涵盖或记录在案。一个Java程序,其行为类似于客户端,而不是Android或web。

如果您有一个Java程序,它是通过某个类的主函数在命令行上调用的,则必须在数据库侦听器启动之前阻止该主函数返回。否则,程序将立即终止,侦听器将永远不会启动。务必记住,所有Firebase侦听器都是异步的,Firebase管理自己的守护进程线程以与服务器通信

对于让简单程序等待侦听器触发的情况,可以使用这种模式阻止主线程等待侦听器:

CountDownLatch latch = new CountDownLatch(1);
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        System.out.println("onDataChange: " + dataSnapshot);
        latch.countDown();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        System.out.println("onCanceled: " + databaseError);
        latch.countDown();
    }
});
latch.await();

使用倒计时锁存器不是您唯一的选择。您可以做任何您想做的事情来确保进程不会停止,包括简单地让主线程休眠的时间超过启动侦听器所需的时间。

如何调用所有这些代码?您使用的“服务器”环境是什么?实际上,这是一个独立的程序,可以连续运行。观看activemq主题。但我在这里描述的这一步。这是配置步骤。因此,目前还没有涉及到循环。该程序是在linux shell上启动的。然后它尝试连接到firebase以获取其特定配置。@MarceloDelgado您能将数据添加到数据库中吗?