|
|
@@ -1,6 +1,5 @@
|
|
|
package com.nb.im.room;
|
|
|
|
|
|
-import com.nb.im.entity.ImRoomEntity;
|
|
|
import lombok.Getter;
|
|
|
import org.redisson.api.*;
|
|
|
|
|
|
@@ -9,6 +8,8 @@ import java.time.temporal.ChronoUnit;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
import java.util.*;
|
|
|
+import java.util.function.Function;
|
|
|
+
|
|
|
/**
|
|
|
* @author lifang
|
|
|
* @version 1.0.0
|
|
|
@@ -25,7 +26,7 @@ public class ImRoomOperator {
|
|
|
private final String assitId;
|
|
|
@Getter
|
|
|
private final String doctorId;
|
|
|
-
|
|
|
+ private Function<String,Long> supplierMaxSort;
|
|
|
@Getter
|
|
|
private final Date startTime;
|
|
|
|
|
|
@@ -36,26 +37,31 @@ public class ImRoomOperator {
|
|
|
private Map<String, RSet<String>> unReadMap=new HashMap<>();
|
|
|
|
|
|
|
|
|
- public ImRoomOperator(String id, RedissonClient redissonClient, ImRoomEntity room,long maxSort, List<String> userIds) {
|
|
|
+ public ImRoomOperator(String id, RedissonClient redissonClient, Function<String,Long> supplierMaxSort, String assitId, String doctorId) {
|
|
|
this.id=id;
|
|
|
this.msgKeyFilter = redissonClient.getBloomFilter("im:msg-key."+id);
|
|
|
this.msgKeyFilter.tryInit(55000000L, 0.03);
|
|
|
- this.atomicLong = redissonClient.getAtomicLong("im:incr." + id);
|
|
|
this.redissonClient=redissonClient;
|
|
|
- this.assitId=room.getAssistId();
|
|
|
- this.doctorId=room.getDoctorId();
|
|
|
this.startTime=new Date();
|
|
|
- userIds
|
|
|
- .forEach(userId-> unReadMap.computeIfAbsent(userId,k->redissonClient.getSet("im:unread:"+id+":"+userId)));
|
|
|
+ this.assitId=assitId;
|
|
|
+ this.doctorId=doctorId;
|
|
|
+ this.supplierMaxSort=supplierMaxSort;
|
|
|
|
|
|
- atomicLong.getAsync()
|
|
|
- .thenAcceptAsync(count->{
|
|
|
- if(count==null){
|
|
|
- atomicLong.set(maxSort);
|
|
|
- }
|
|
|
- });
|
|
|
+ Arrays.asList(assitId,doctorId)
|
|
|
+ .forEach(userId-> unReadMap.computeIfAbsent(userId,k->redissonClient.getSet("im:unread:"+id+":"+userId)));
|
|
|
}
|
|
|
|
|
|
+ private synchronized void initMaxSort(){
|
|
|
+ if(this.atomicLong==null){
|
|
|
+ this.atomicLong = redissonClient.getAtomicLong("im:incr." + id);
|
|
|
+ atomicLong.getAsync()
|
|
|
+ .thenAcceptAsync(count->{
|
|
|
+ if(count==null){
|
|
|
+ atomicLong.set(supplierMaxSort.apply(id ));
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
* 描述: 用户发送了消息,对该房间其他人进行未读消息设置
|
|
|
@@ -124,6 +130,7 @@ public class ImRoomOperator {
|
|
|
* @return Long
|
|
|
*/
|
|
|
public Long generateSortId(){
|
|
|
+ initMaxSort();
|
|
|
return atomicLong.addAndGet(1);
|
|
|
}
|
|
|
|
|
|
@@ -162,6 +169,6 @@ public class ImRoomOperator {
|
|
|
}
|
|
|
|
|
|
public void setDoctorOnline(boolean online){
|
|
|
- this.doctorOnline=online;
|
|
|
+ this.doctorOnline=online;
|
|
|
}
|
|
|
}
|