具有Firebase侦听器的后端java应用程序的多个实例出现问题
我在一个后端java应用程序(使用Spring)中工作,该应用程序在docker中运行。此应用程序具有Firebase实时侦听器。在本地它工作得很完美!但是,当我在Docker中部署它并创建2个实例(容器)时,当我在Firebase RTDB中进行更改时,它开始运行2次相同的逻辑(应该只执行一次)。这是我在Bean中创建侦听器的代码:具有Firebase侦听器的后端java应用程序的多个实例出现问题,java,spring,firebase,docker,firebase-realtime-database,Java,Spring,Firebase,Docker,Firebase Realtime Database,我在一个后端java应用程序(使用Spring)中工作,该应用程序在docker中运行。此应用程序具有Firebase实时侦听器。在本地它工作得很完美!但是,当我在Docker中部署它并创建2个实例(容器)时,当我在Firebase RTDB中进行更改时,它开始运行2次相同的逻辑(应该只执行一次)。这是我在Bean中创建侦听器的代码: FirebaseOptions options; options = new FirebaseOptions.Builder() .setServ
FirebaseOptions options;
options = new FirebaseOptions.Builder()
.setServiceAccount(new FileInputStream(resourceDir + File.separator
+"test1.json"))
.setDatabaseUrl("https://test1.firebaseio.com/").build();
FirebaseApp.initializeApp(options);
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference listenerRef;
DatabaseReference commerceRef;
commerceRef.orderByChild("got").equalTo(0).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
LOGGER.info("data changed:" + dataSnapshot.getKey());
LOGGER.info("data ref:" + dataSnapshot.getRef());
......logic ....
} catch (Exception e) {
LOGGER.info("Error en recepcion de actualizaciones de firebase" + e.getMessage(), e);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
LOGGER.error("The read failed: " + databaseError.getCode());
}
@Override
public void onChildChanged(DataSnapshot arg0, String arg1) {
LOGGER.info("Uno de los hijos fue modificado");
}
@Override
public void onChildMoved(DataSnapshot arg0, String arg1) {
LOGGER.info("Uno de los hijos fue reubicado");
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
LOGGER.info("Uno de los hijos fue removido");
}
});
有没有办法让它只工作一次,即使它有两个实例?如果没有,我该怎么办?(仅使用一个容器不是有效的解决方案-由于高可用性)Firebase SDK无法知道是否有多个自身实例在运行并在它们之间协调。您看到的是预期的行为。如果您只需要监听数据库中某个位置的一件事,那么您只需要有一个实例,或者您需要使用事务以一种复杂的方式自己进行协调。如果希望复制其逻辑,则有一个名为的节点项目可以有效地执行此协调 但是,如果您的后端逻辑在数据库中每次更改都需要运行一次,那么您最好使用来管理它