mirror of
https://gitee.com/farsunset/cim.git
synced 2025-08-02 20:45:46 +08:00
1、优化服务端session管理实现
2、android优化sdk通知管理
This commit is contained in:
parent
ea9efc8594
commit
538f80cee1
@ -24,6 +24,7 @@ package com.farsunset.cim.component.handler;
|
||||
import com.farsunset.cim.component.handler.annotation.CIMHandler;
|
||||
import com.farsunset.cim.component.redis.SignalRedisTemplate;
|
||||
import com.farsunset.cim.constant.ChannelAttr;
|
||||
import com.farsunset.cim.constants.Constants;
|
||||
import com.farsunset.cim.entity.Session;
|
||||
import com.farsunset.cim.group.SessionGroup;
|
||||
import com.farsunset.cim.handler.CIMRequestHandler;
|
||||
@ -53,6 +54,10 @@ public class BindHandler implements CIMRequestHandler {
|
||||
@Override
|
||||
public void process(Channel channel, SentBody body) {
|
||||
|
||||
if (sessionGroup.isManaged(channel)){
|
||||
return;
|
||||
}
|
||||
|
||||
ReplyBody reply = new ReplyBody();
|
||||
reply.setKey(body.getKey());
|
||||
reply.setCode(HttpStatus.OK.value());
|
||||
@ -79,6 +84,8 @@ public class BindHandler implements CIMRequestHandler {
|
||||
*/
|
||||
sessionService.add(session);
|
||||
|
||||
channel.attr(Constants.SESSION_ID).set(session.getId());
|
||||
|
||||
/*
|
||||
* 添加到内存管理
|
||||
*/
|
||||
|
@ -23,6 +23,7 @@ package com.farsunset.cim.component.handler;
|
||||
|
||||
import com.farsunset.cim.component.handler.annotation.CIMHandler;
|
||||
import com.farsunset.cim.constant.ChannelAttr;
|
||||
import com.farsunset.cim.constants.Constants;
|
||||
import com.farsunset.cim.entity.Session;
|
||||
import com.farsunset.cim.group.SessionGroup;
|
||||
import com.farsunset.cim.handler.CIMRequestHandler;
|
||||
@ -42,31 +43,25 @@ public class ClosedHandler implements CIMRequestHandler {
|
||||
@Resource
|
||||
private SessionService sessionService;
|
||||
|
||||
@Resource
|
||||
private SessionGroup sessionGroup;
|
||||
|
||||
@Override
|
||||
public void process(Channel channel, SentBody message) {
|
||||
|
||||
String uid = channel.attr(ChannelAttr.UID).get();
|
||||
Long sessionId = channel.attr(Constants.SESSION_ID).get();
|
||||
|
||||
if (uid == null){
|
||||
if (sessionId == null){
|
||||
return;
|
||||
}
|
||||
|
||||
String nid = channel.attr(ChannelAttr.ID).get();
|
||||
|
||||
sessionGroup.remove(channel);
|
||||
|
||||
/*
|
||||
* ios开启了apns也需要显示在线,因此不删记录
|
||||
*/
|
||||
if (!Objects.equals(channel.attr(ChannelAttr.CHANNEL).get(), Session.CHANNEL_IOS)){
|
||||
sessionService.delete(uid,nid);
|
||||
if (Objects.equals(channel.attr(ChannelAttr.CHANNEL).get(), Session.CHANNEL_IOS)){
|
||||
sessionService.updateState(sessionId, Session.STATE_INACTIVE);
|
||||
return;
|
||||
}
|
||||
|
||||
sessionService.updateState(uid,nid, Session.STATE_INACTIVE);
|
||||
sessionService.delete(sessionId);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -21,13 +21,16 @@
|
||||
*/
|
||||
package com.farsunset.cim.constants;
|
||||
|
||||
import io.netty.util.AttributeKey;
|
||||
|
||||
public interface Constants {
|
||||
|
||||
String PUSH_MESSAGE_INNER_QUEUE = "signal/channel/PUSH_MESSAGE_INNER_QUEUE";
|
||||
|
||||
String BIND_MESSAGE_INNER_QUEUE = "signal/channel/BIND_MESSAGE_INNER_QUEUE";
|
||||
|
||||
String PING_MESSAGE_INNER_QUEUE = "signal/channel/PING_MESSAGE_INNER_QUEUE";
|
||||
|
||||
String APNS_DEVICE_TOKEN = "APNS_OPEN_%s";
|
||||
|
||||
AttributeKey<Long> SESSION_ID = AttributeKey.valueOf("session_id");
|
||||
|
||||
}
|
||||
|
@ -33,17 +33,13 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public interface SessionRepository extends JpaRepository<Session, Long> {
|
||||
|
||||
@Modifying
|
||||
@Query("delete from Session where uid = ?1 and nid = ?2")
|
||||
void delete(String uid,String nid);
|
||||
|
||||
@Modifying
|
||||
@Query("delete from Session where host = ?1 ")
|
||||
void deleteAll(String host);
|
||||
|
||||
@Modifying
|
||||
@Query("update Session set state = ?3 where uid = ?1 and nid = ?2")
|
||||
void updateState(String uid,String nid,int state);
|
||||
@Query("update Session set state = :state where id = :id")
|
||||
void updateState(long id,int state);
|
||||
|
||||
@Modifying
|
||||
@Query("update Session set state = " + Session.STATE_APNS + " where uid = ?1 and channel = ?2")
|
||||
|
@ -33,14 +33,14 @@ public interface SessionService {
|
||||
|
||||
void add(Session session);
|
||||
|
||||
void delete(String uid,String nid);
|
||||
void delete(long id);
|
||||
|
||||
/**
|
||||
* 删除本机的连接记录
|
||||
*/
|
||||
void deleteLocalhost();
|
||||
|
||||
void updateState(String uid,String nid,int state);
|
||||
void updateState(long id,int state);
|
||||
|
||||
void openApns(String uid,String deviceToken);
|
||||
|
||||
|
@ -31,6 +31,7 @@ import javax.annotation.Resource;
|
||||
import java.net.InetAddress;
|
||||
import java.net.UnknownHostException;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class SessionServiceImpl implements SessionService {
|
||||
@ -56,18 +57,19 @@ public class SessionServiceImpl implements SessionService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(String uid, String nid) {
|
||||
sessionRepository.delete(uid,nid);
|
||||
public void delete(long id) {
|
||||
sessionRepository.deleteById(id);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void deleteLocalhost() {
|
||||
sessionRepository.deleteAll(host);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateState(String uid, String nid, int state) {
|
||||
sessionRepository.updateState(uid,nid,state);
|
||||
public void updateState(long id, int state) {
|
||||
sessionRepository.updateState(id,state);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -84,6 +86,9 @@ public class SessionServiceImpl implements SessionService {
|
||||
|
||||
@Override
|
||||
public List<Session> findAll() {
|
||||
return sessionRepository.findAll();
|
||||
return sessionRepository.findAll()
|
||||
.stream()
|
||||
.filter(session -> session.getState() == Session.STATE_ACTIVE || session.getState() == Session.STATE_APNS)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
}
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>com.farsunset</groupId>
|
||||
<artifactId>cim-android-sdk</artifactId>
|
||||
<version>4.2.5</version>
|
||||
<version>4.2.6</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<name>${project.groupId}:${project.artifactId}</name>
|
||||
|
@ -43,6 +43,10 @@ class CIMCacheManager {
|
||||
|
||||
public static final String KEY_CIM_CONNECTION_STATE = "KEY_CIM_CONNECTION_STATE";
|
||||
|
||||
|
||||
public static final String KEY_NTC_CHANNEL_NAME = "KEY_NTC_CHANNEL_NAME";
|
||||
|
||||
|
||||
public static final String CONTENT_URI = "content://%s.cim.provider";
|
||||
|
||||
|
||||
|
@ -119,15 +119,9 @@ public abstract class CIMEventBroadcastReceiver extends BroadcastReceiver {
|
||||
}
|
||||
|
||||
private void startPushService() {
|
||||
|
||||
try {
|
||||
Intent intent = new Intent(context, CIMPushService.class);
|
||||
intent.setAction(ServiceAction.ACTION_ACTIVATE_PUSH_SERVICE);
|
||||
CIMPushManager.startService(context,intent);
|
||||
}catch (Exception ignore){
|
||||
context.sendBroadcast(new Intent(IntentAction.ACTION_CONNECTION_RECOVERY));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void onInnerConnectionClosed() {
|
||||
|
@ -31,6 +31,7 @@ import android.os.Build;
|
||||
import android.os.LocaleList;
|
||||
import android.text.TextUtils;
|
||||
import com.farsunset.cim.sdk.android.constant.BundleKey;
|
||||
import com.farsunset.cim.sdk.android.constant.IntentAction;
|
||||
import com.farsunset.cim.sdk.android.constant.RequestKey;
|
||||
import com.farsunset.cim.sdk.android.constant.ServiceAction;
|
||||
import com.farsunset.cim.sdk.android.logger.CIMLogger;
|
||||
@ -314,10 +315,15 @@ public class CIMPushManager {
|
||||
}
|
||||
|
||||
protected static void startService(Context context, Intent intent) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
context.startForegroundService(intent);
|
||||
} else {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
context.startService(intent);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
context.startForegroundService(intent);
|
||||
}catch (Exception ignore){
|
||||
context.sendBroadcast(new Intent(IntentAction.ACTION_CONNECTION_RECOVERY));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -53,8 +53,6 @@ public class CIMPushService extends Service {
|
||||
|
||||
private static final int NOTIFICATION_ID = Integer.MAX_VALUE;
|
||||
|
||||
private static final int PERSIST_NOTIFICATION_ID = Integer.MIN_VALUE;
|
||||
|
||||
private CIMConnectorManager connectorManager;
|
||||
private KeepAliveBroadcastReceiver keepAliveReceiver;
|
||||
private ConnectivityManager connectivityManager;
|
||||
@ -64,7 +62,9 @@ public class CIMPushService extends Service {
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
|
||||
connectorManager = CIMConnectorManager.getManager(this.getApplicationContext());
|
||||
|
||||
notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
@ -118,7 +118,7 @@ public class CIMPushService extends Service {
|
||||
String action = newIntent.getAction();
|
||||
|
||||
if (!persistHolder.get()) {
|
||||
createNotification();
|
||||
createTransientNotification();
|
||||
}
|
||||
|
||||
if (ServiceAction.ACTION_CREATE_CIM_CONNECTION.equals(action)) {
|
||||
@ -167,7 +167,7 @@ public class CIMPushService extends Service {
|
||||
notificationHandler.sendEmptyMessageDelayed(0, 200);
|
||||
}
|
||||
|
||||
return Service.START_REDELIVER_INTENT;
|
||||
return super.onStartCommand(intent,flags,startId);
|
||||
}
|
||||
|
||||
private void prepareConnect(long delayMillis) {
|
||||
@ -241,12 +241,21 @@ public class CIMPushService extends Service {
|
||||
}
|
||||
}
|
||||
|
||||
private void createNotification() {
|
||||
private void createTransientNotification() {
|
||||
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (notificationManager.getNotificationChannel(PERSIST_NTC_CHANNEL_ID) != null) {
|
||||
startForeground(NOTIFICATION_ID, new Notification.Builder(this,PERSIST_NTC_CHANNEL_ID)
|
||||
.setContentTitle(CIMCacheManager.getString(this,CIMCacheManager.KEY_NTC_CHANNEL_NAME))
|
||||
.build());
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (notificationManager.getNotificationChannel(TRANSIENT_NTC_CHANNEL_ID) == null) {
|
||||
NotificationChannel channel = new NotificationChannel(TRANSIENT_NTC_CHANNEL_ID, getClass().getSimpleName(), NotificationManager.IMPORTANCE_LOW);
|
||||
channel.enableLights(false);
|
||||
@ -255,16 +264,17 @@ public class CIMPushService extends Service {
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
}
|
||||
|
||||
Notification notification = new Notification.Builder(this,TRANSIENT_NTC_CHANNEL_ID)
|
||||
startForeground(NOTIFICATION_ID, new Notification.Builder(this,TRANSIENT_NTC_CHANNEL_ID)
|
||||
.setContentTitle(CIMPushService.class.getSimpleName())
|
||||
.build();
|
||||
.build());
|
||||
|
||||
startForeground(NOTIFICATION_ID, notification);
|
||||
}
|
||||
|
||||
|
||||
private void createPersistNotification(String channelName ,String message,int icon) {
|
||||
|
||||
CIMCacheManager.putString(this,CIMCacheManager.KEY_NTC_CHANNEL_NAME,channelName);
|
||||
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && notificationManager.getNotificationChannel(PERSIST_NTC_CHANNEL_ID) == null) {
|
||||
NotificationChannel channel = new NotificationChannel(PERSIST_NTC_CHANNEL_ID,channelName, NotificationManager.IMPORTANCE_DEFAULT);
|
||||
channel.enableLights(false);
|
||||
@ -272,6 +282,7 @@ public class CIMPushService extends Service {
|
||||
channel.enableVibration(false);
|
||||
channel.setSound(null, null);
|
||||
notificationManager.createNotificationChannel(channel);
|
||||
notificationManager.deleteNotificationChannel(TRANSIENT_NTC_CHANNEL_ID);
|
||||
}
|
||||
|
||||
|
||||
@ -294,7 +305,7 @@ public class CIMPushService extends Service {
|
||||
.setContentTitle(channelName)
|
||||
.setContentText(message);
|
||||
|
||||
startForeground(PERSIST_NOTIFICATION_ID, builder.build());
|
||||
startForeground(NOTIFICATION_ID, builder.build());
|
||||
}
|
||||
|
||||
private class KeepAliveBroadcastReceiver extends BroadcastReceiver {
|
||||
|
Loading…
x
Reference in New Issue
Block a user