我的Firebase数据库中有一个用户子树,它保存用户的基本信息和跟踪/追随者,该子树的结构如下:
"users": {
"userId-1": {
"userName": "Namey McNameface",
"following": {
"followingId-1": true,
"followingId-2": true,
.
.
},
"followers": {
"followerId-1": true,
"followerId-2": true,
.
.
}
},
"userId-2": {},
"userId-3": {},
.
.
}每当有人开始跟踪他/她时,我想向用户的手机发送通知。在我自己的服务器上,我听追随者子树。添加子节点时,用户将看到通知。问题是,在某个时候,我需要部署我的服务器的下一个版本,当我这样做时,OnChildAdded事件将为所有的子级(关注者)触发,所有用户都会看到关于他们的关注者的错误通知开始跟踪他们。
为了解决这个问题,我可以将发送的通知信息存储在我的数据库中,但是这对我来说是一项耗时的工作。
另一种方法是我可以跳过OnChildAdded事件的初始触发,如果这在Firebase数据库中是可行的话。
提前谢谢你。
编辑:
我的服务器使用Java和Spring。这是我的FirebaseService。我正在创建一个UserListener,并开始监听所有用户。
@Service
public class FirebaseService {
public FirebaseService() {
UserListener userListener = new UserListener();
FirebaseDatabase.getInstance().getReference(Tag.USERS).addChildEventListener(userListener);
}
}我是UserListener。它创建一个FollowerListener来侦听每个用户的followers子树。
public class UserListener implements ChildEventListener {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String userId = dataSnapshot.getKey();
FollowerListener followerListener = new FollowerListener(userId);
FirebaseDatabase.getInstance().getReference(Tag.USERS).child(userId).child(Tag.FOLLOWERS).addChildEventListener(followerListener);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
}我是FollowerListener。当用户ID被添加到followers时,FollowerListener会发送通知。它基本上得到跟随的用户的FirebaseInstanceId和跟随者的用户名。然后发送通知。
public class FollowerListener implements ChildEventListener {
private final String followedUserId;
public FollowerListener(String followedUserId){
this.followedUserId = followedUserId;
}
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String followerUserId = dataSnapshot.getKey();
FirebaseDatabase.getInstance().getReference(Tag.USERS).child(followedUserId)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User followedUser = dataSnapshot.getValue(User.class);
if(followedUser != null){
FirebaseDatabase.getInstance().getReference(Tag.USERS).child(followerUserId)
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User followerUser = dataSnapshot.getValue(User.class);
if(followerUser != null){
// Send notification to followed user.
NotificationInfo notificationInfo = new NotificationInfo();
notificationInfo.setTitle("test title");
notificationInfo.setText(followerUser.getScreenName() + " seni takip etmeye başladı.");
notificationInfo.setClickAction(Tag.ACTION_GO_TO_PROFILE);
NotificationData data = new NotificationData();
data.setUserId(followerUserId);
NotificationRequestBean bean = new NotificationRequestBean();
bean.setTo(followedUser.getFirebaseInstanceId());
bean.setBody("test body");
bean.setTitle("test title");
bean.setPriority("normal");
bean.setDelayWhileIdle(false);
bean.setNotification(notificationInfo);
bean.setData(data);
AppUtils.sendNotification(bean);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
}问题是,每当我部署服务器时,FollowerListener都会附加到所有用户的followers子树。然后OnChildAdded事件首先为每个跟随者触发。它不应该每次部署服务器时都发送通知。
谢谢。
发布于 2016-09-16 15:58:47
我为这个问题找到了一个非常简单的解决方案。我刚刚在名为boolean的followers子树中添加了一个processedByServer字段。所以就变成这样:
"followers": {
"followerId-1": {
"processedByServer": true // already processed.
},
"followerId-2": {
"processedByServer": false // not processed yet, but will be.
},
.
.
}这个processedByServer最初是false,我在服务器中完成了必要的处理(发送通知等)。我将此值更改为true。服务器只需要在此字段为false时进行处理。因此,在我重新部署/重新启动服务器之后,它就不会再发送错误的通知了。
但这一解决方案也有其不利之处:
followers子树中的所有followers字段,这对于服务器来说可能是一项耗时的工作。https://stackoverflow.com/questions/39473099
复制相似问题