代码之家  ›  专栏  ›  技术社区  ›  donald

firebase管理sdk侦听器回调不工作

  •  0
  • donald  · 技术社区  · 7 年前

    我使用firebase java sdk作为服务器后端代码。我正在使用保存异步调用并等待它,但添加到数据库中的单值事件侦听器不起作用。我甚至尝试过googleCompleteableFutureApi等待异步调用完成,但仍然没有执行回调。 见下面的代码:-

    package com.stocknap;
    
    import com.google.api.client.util.DateTime;
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.firebase.FirebaseApp;
    import com.google.firebase.FirebaseOptions;
    import com.google.firebase.FirebaseOptions.Builder;
    import com.google.firebase.auth.FirebaseAuth;
    import com.google.firebase.database.*;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.time.Instant;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.*;
    import java.util.concurrent.atomic.AtomicInteger;
    
    //import com.google.firebase.tasks.TaskCompletionSource;
    
    public enum Firebase {
        INSTANCE;
    
        FirebaseApp firebaseApp;
    
    
        public void initilizeFirebaseApp(ConfigLoader configReader) {
    
            CountDownLatch done = new CountDownLatch(1);
            final AtomicInteger message1 = new AtomicInteger(0);
            InputStream firebaseSecret = getClass().getClassLoader().getResourceAsStream("ServiceAccount.json");
            final GoogleCredentials credentials;
            try {
                credentials = GoogleCredentials.fromStream(firebaseSecret);
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("Error while reading Firebase config file." + e.toString());
                throw new IllegalStateException(e);
            }
    
            Map<String, Object> auth = new HashMap<>();
            auth.put("uid", "my_resources");
    
            FirebaseOptions options = new Builder()
                    .setConnectTimeout(1000)
                    .setCredentials(credentials)
                    .setDatabaseAuthVariableOverride(auth)
                    .setDatabaseUrl(configReader.getFirebaseDatabaseURL())
                    .setStorageBucket(configReader.getFirebaseStorageBucket())
                    .setProjectId(configReader.getFirebseProjectId())
                    .build();
    
            firebaseApp = FirebaseApp.initializeApp(options);
    
    
            System.out.println(firebaseApp.getName());
            //System.out.println(firebaseApp.getName());
            // Use the shorthand notation to retrieve the default app's service
            FirebaseAuth defaultAuth = FirebaseAuth.getInstance();
            FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance();
    
    
            // The app only has access as defined in the Security Rules
            DatabaseReference ref = FirebaseDatabase
                    .getInstance()
                    .getReference("/analyst_profiles");
    
    
            DateTime dt = new DateTime(java.util.Date.from(Instant.now()), java.util.TimeZone.getDefault());
            System.out.println(dt.getValue());
            //test data push
            // https://firebase.google.com/docs/database/admin/save-data
            AnalystProfiles analystProfilesObjTemp = new AnalystProfiles("test2", Long.toString(dt.getValue()), "dsds", "ds", "ds",
                    "dsa2323", "32ddss232");
    
            ref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    AnalystProfiles post = dataSnapshot.getValue(AnalystProfiles.class);
                    System.out.println(post);
                    //done.countDown();
                }
    
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    System.out.println("The read failed: " + databaseError.getCode());
                }
    
    
            });
    
    
            CompletableFuture<String> welcomeText = CompletableFuture.supplyAsync(() -> {
                try {
                    ref.push().setValueAsync(analystProfilesObjTemp).get();
                } catch (ExecutionException | InterruptedException e) {
                    throw new RuntimeException("Error while waiting for future", e);
                }
                return "ok";
    
            }).thenApply(x -> {
                System.out.println(x);
                System.out.println("Listeners code is not executing");
                return x;
            });
    
    
            done.countDown();
            try {
                System.out.println(welcomeText.get());
                done.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
    
    
        }
    
    
        public void testdataLoad() {
    
            // The app only has access as defined in the Security Rules
            DatabaseReference ref = FirebaseDatabase
                    .getInstance()
                    .getReference("/analyst_profiles");
    
    
            DateTime dt = new DateTime(java.util.Date.from(Instant.now()), java.util.TimeZone.getDefault());
            System.out.println(dt.getValue());
            //test data push
            // https://firebase.google.com/docs/database/admin/save-data
            AnalystProfiles analystProfilesObjTemp = new AnalystProfiles("test2", Long.toString(dt.getValue()), "dsds", "ds", "ashutsh",
                    "dsa2323", "32ddss232");
    
            CompletableFuture<String> welcomeText = CompletableFuture.supplyAsync(() -> {
                try {
                    ref.push().setValueAsync(analystProfilesObjTemp).get();
                } catch (ExecutionException | InterruptedException e) {
                    throw new RuntimeException("Error while waiting for future", e);
                }
                return "ok";
    
            }).thenApply(x -> {
                System.out.println(x);
                return x;
            });
    
    
    
            try {
                System.out.println(welcomeText.get());
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
    
        }
    
    
    }
    

    主驱动程序:-

    package com.stocknap;
    
    import com.zerodhatech.kiteconnect.KiteConnect;
    import com.zerodhatech.kiteconnect.kitehttp.SessionExpiryHook;
    import com.zerodhatech.kiteconnect.kitehttp.exceptions.KiteException;
    import org.json.JSONException;
    
    import java.io.IOException;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * Created by sujith on 7/10/16.
     * This class has example of how to initialize kiteSdk and make rest api calls to place order, get orders, modify order, cancel order,
     * get positions, get holdings, convert positions, get instruments, logout user, get historical data dump, get trades
     */
    public class MainStockNap {
    
        static PropertyFileReader propReader;
        public static void main(String[] args) throws KiteException, IOException {
            try {
                ExecutorService executor = Executors.newFixedThreadPool(10);
                KiteConnect kiteConnect = new KiteConnect("kbnbnmbnmbnm8877bvbv");
    
                // Set userId
                kiteConnect.setUserId("");
    
                //Enable logs for debugging purpose. This will log request and response.
                kiteConnect.setEnableLogging(true);
    
                // Get login url
                String url = kiteConnect.getLoginURL();
    
                // Set session expiry callback.
                kiteConnect.setSessionExpiryHook(new SessionExpiryHook() {
                    @Override
                    public void sessionExpired() {
                        System.out.println("session expired");
                    }
                });
    
    
                System.out.println(args.toString());
                // reading params
                if (args.length == 0){
                    System.out.println("config file path not given");
                    System.exit(0);
                }
                else{
                    //this.setConfigFile(args[2]);
                    propReader = new PropertyFileReader(args[0]);
    
                }
    
                //PropertyFileReader prop = new PropertyFileReader();
    
               // Properties prop = Main.getConfigFile();
               // System.out.println(prop.getConfigFile().getProperty("API_SECRET"));
    
                ConfigLoader configObj= ConfigLoader.getInstance();
                configObj.setConfigSource(propReader);
                System.out.println("---------zerodha properties----------------");
                System.out.println(configObj.get_CLIENT_ID());
                System.out.println(configObj.get_API_SECRET());
                System.out.println(configObj.get_APITOKEN());
                System.out.println(configObj.get_PUBLICTOKEN());
                System.out.println(configObj.get_APIKey());
    
                System.out.println("---------firebase properties----------------");
                System.out.println(configObj.getFirebaseAPIKey());
                System.out.println(configObj.getFirebaseAuthDomain());
                System.out.println(configObj.getFirebaseMessagingSenderId());
                System.out.println(configObj.getFirebseProjectId());
                System.out.println(configObj.getFirebaseStorageBucket());
                System.out.println(configObj.getFirebaseDatabaseURL());
    
                Firebase.INSTANCE.initilizeFirebaseApp(configObj);
                Firebase.INSTANCE.testdataLoad();
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Hiranya Jayathilaka    7 年前

    你的代码有很多事情要做,不可能弄清楚你期望看到什么。我将其稍微修改为以下测试用例。这似乎很管用:

      @Test
      public void initilizeFirebaseApp() throws Exception {
        CountDownLatch done = new CountDownLatch(1);
        DatabaseReference ref = FirebaseDatabase
            .getInstance()
            .getReference("/analyst_profiles");
    
        DatabaseReference newChild = ref.push();
    
        ref.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child : dataSnapshot.getChildren()) {
              if (child.getKey().equals(newChild.getKey())) {
                System.out.println("New data: " + child.getValue());
                done.countDown();
              }
            }
          }
    
          @Override
          public void onCancelled(DatabaseError databaseError) {
            System.out.println("The read failed: " + databaseError.getCode());
          }
        });
    
        Object analystProfilesObjTemp = ImmutableMap.of("key", "value");
        newChild.setValueAsync(analystProfilesObjTemp).get();
    
        try {
          done.await();
          System.out.println("Listener hit for new child: " + newChild.getKey());
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    

    我得到输出:

    New data: {key=value}
    Listener hit for new child: -LXW0CS2jFjphnoFKQkb