我有 .net core
书面 api
和 android mobile
客户端。有 signalr
两者之间的套接字连接。当用户打开一个 event
在手机应用上,我保存这个 event data
到 db
在服务器上发送,并将其发送到其他 users
倾听者 event creator
通过插座. 我定期在手机应用上控制插座连接,如果他们失去连接,我可以重新连接他们。到目前为止,我没有任何问题。但我有问题保持 data
对于 lost connection user
让我举例说明。 有用户 : Producer1
, Consumer1
, Consumer2
如果 Producer1
打开一个事件,通过 mobile app
. 它发送 data
至 server
通过 httprequest
我把它保存到 db
. 在将数据保存到 db
,我送这个 data
到 Consumer1
和 Consumer2
通过 socket connection
. 让我们说 Consumer2
发送时没有网络连接 event data
. Consumer1
有网络连接的,获得 data
成功,我没有问题 Consumer1
. 但是.., Consumer2
得不到 data
因为它失去了他们的插座连接,而我们还没有重新连接。event data
已经走了。所以 Consumer2
不会得到 event data
.
我的问题是,我怎样才能保持 data
并送去 Consumer2
当初 Consumer2
重新建立其连接。什么是高效正确的方法。
服务器端代码示例: 。
public async Task AddEvent(GetEventOutput getEventOutput)
{
if(getEventOutput.Active)
{
await _hubContext.Clients.Group(SignalR_EVENT + QUESTION_MARK + EVENT_WITH_USER + EQUAL_DASH + getEventOutput.UserID).SendAsync(CREATE_EVENT_ON_MOBILE, JsonConvert.SerializeObject(getEventOutput));
sendEventCreateNotification(getEventOutput);
}
}
客户端代码示例。
hubConnection.on(CREATE_EVENT_ON_MOBILE, (getEventOutput) -> {
System.out.println("CREATE_EVENT_ON_MOBILE : ");
setUiAfterSignalrHandler.post(new Runnable() {
@Override
public void run() {
if (!isNullOrEmpty(getEventOutput)) {
Event event = gson.fromJson(getEventOutput, Event.class);
eventsWithTimerRecyclerViewAdapter.insertItem(0, event);
setUiAfterSignalrHandler.removeCallbacks(this);
leftAndRightTextWithTimerRecyclerView.removeEmptyPlaceHolder(eventsWithTimerRecyclerViewAdapter);
}
}
});
restartSocket();
}, String.class);
我们有类似的情况,但通知。为了避免你的问题,我建议使用缓存或易失性存储来存储这些事件。
例如,当你向客户发送事件时,他们应该调用一个回调方法来注册他们收到了事件,然后当所有的订阅者成功响应事件时,你就可以将事件注册为已完成,你就可以处理该事件。
但要执行这个任务,你应该有
因此,你不会处置事件,直到它完成。但是你如何重新发送事件给当时没有连接的用户呢?
只需创建一个枢纽方法,在连接建立后由客户端调用,发送待处理的事件(该用户没有注册为接收的事件,所以他们没有调用回调方法)。