fs-danaus
2023-06-29 0099c9d4acb72274764639781bcdbd3b29835195
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package com.yc.sdk.WebSocketMessage.api.messagelistener;
 
 
import com.yc.sdk.WebSocketMessage.action.WebSocketMessageServer;
import com.yc.sdk.WebSocketMessage.entity.MessageInfo;
import com.yc.sdk.WebSocketMessage.entity.MessageType;
import com.yc.sdk.WebSocketMessage.entity.WsMessageUserEntity;
import com.yc.sdk.WebSocketMessage.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
 
import java.util.List;
 
/**
 * 接收订阅消息
 * 发布订阅消息程序: com.yc.sdk.WebSocketMessage.action.WebSocketMessageServer.publishMessageToRedis(Message message)
 *
 * @author johnswang
 */
public class WebSocketMessageListener implements MessageListener {
    @Autowired
    private RedisTemplate<String, String> redisTemplate;
    @Autowired
    IMMessageIfc imMessageIfc;
    @Autowired
    HeXiaoMessageIfc heXiaoMessageIfc;
    @Autowired
    ApiAuthMessageIfc apiAuthMessageIfc;
    @Autowired
    RefreshPanicBuyingIfc refreshPanicBuyingIfc;
    @Autowired
    AbcPayMessageIfc abcPayMessageIfc;
    @Autowired
    TasksMessageIfc tasksMessageIfc;
    @Autowired
    VersionMessageIfc versionMessageIfc;
    @Autowired
    RefreshDataSourceMessageIfc refreshDataSourceMessageIfc;
    @Autowired
    SingleAccountMessageIfc singleAccountMessageIfc;
    @Override
    public void onMessage(Message message, byte[] pattern) {
        try {
            RedisSerializer<?> serializer = redisTemplate.getValueSerializer();
            Object body = serializer.deserialize(message.getBody());
            //String channel = new String(pattern);   //取订阅频道 主题 channel
            MessageInfo msg = null;
            if (body instanceof MessageInfo) {
                msg = (MessageInfo) body;
            } else {
                msg = MessageInfo.build(String.valueOf(body));
            }
            //System.out.println("订阅接收到的消息:"+msg.toString());
 
            //群发所有小程序用户
            if ((msg.getMsgType().equals(MessageType.REFRESH_PANICBUYING) && (msg.getUserCode() == null || msg.getUserCode().equals(""))) ||
                    MessageType.NOTICE_SYSTEM_STOP.equals(msg.getMsgType())||
                    MessageType.NOTICE_SYSTEM_START.equals(msg.getMsgType())) {
                List<WsMessageUserEntity> wsMessageUserEntityList = WebSocketMessageServer.getOnlineUser(msg.getDbId(), msg.getUserFromType());
                //只有是存在于当前的用户信息才需要处理,否则不需要处理
                if (wsMessageUserEntityList != null && wsMessageUserEntityList.size() != 0) {
                    for (WsMessageUserEntity wsMessageUserEntity : wsMessageUserEntityList) {
                        handlerMessage(msg, wsMessageUserEntity);
                    }
                }
            } else if (MessageType.REFRESH_TASK.equals(msg.getMsgType()) ||
                    MessageType.REFRESH_LOCALVERSION_TASK.equals(msg.getMsgType())||
                    MessageType.CHECK_SYSTEM_DISABLED.equals(msg.getMsgType())
            ) {
                //对于没用websocket接收的情况,直接处理相关消息
                handlerMessage(msg, null);
 
            } else {
                List<WsMessageUserEntity> wsMessageUserEntityList = WebSocketMessageServer.getOnlineUser(msg.getDbId(), msg.getUserFromType(), msg.getUserCode());
                //只有是存在于当前的用户信息才需要处理,否则不需要处理
                if (wsMessageUserEntityList != null && wsMessageUserEntityList.size() != 0) {
                    for (WsMessageUserEntity wsMessageUserEntity : wsMessageUserEntityList) {
                        handlerMessage(msg, wsMessageUserEntity);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 根据消息类型调用不同的类处理
     *
     * @return
     */
    protected void handlerMessage(MessageInfo message, WsMessageUserEntity userEntity) {
        MessageIfc messageIfc = null;
        if (message != null && message.getMsgType() != null) {
            switch (message.getMsgType()) {
//                case 6001:  //APP扫码登录
//                    // messageIfc=imMessageIfc;
//                    break;
//                case 6002:  //待办事宜(PC端右下角)
//                case 6003:  //系统级弹窗信息(要避免高密度重复弹出)
//                    messageIfc=imMessageIfc;
//                    break;
//                case 6004:  //收取服务费续费通知
//                    //messageIfc=imMessageIfc;
//                    break;
                case 6005:  //检查系统是否停用,代替maintaince.do
                case 6014: //关闭系统通知
                case 6015: //启用系统通知
                    messageIfc = refreshDataSourceMessageIfc;
                    break;
                case 6006:   //小程序扫码核销(扫码了,等待按“核销”按钮)
                    messageIfc = heXiaoMessageIfc;
                    break;
                case 6007:  //发送即时消息 im 
                    messageIfc = imMessageIfc;
                case 6008:  //API认证消息
                    messageIfc = apiAuthMessageIfc;
                    break;
                case 6009:  //刷新小程序端活动内容  MessageType.REFRESH_PANICBUYING
                    messageIfc = refreshPanicBuyingIfc;
                    break;
                case 6010:   //小程序扫码核销(点了“核销”按钮)
                    messageIfc = heXiaoMessageIfc;
                    break;
                case 6011:   //农行支付结果通知回调
                    messageIfc = abcPayMessageIfc;
                    break;
                case 6012:   //刷新任务作业
                    messageIfc = tasksMessageIfc;
                    break;
                case 6013:   //刷新内存版本号
                    messageIfc = versionMessageIfc;
                    break;
                case 6016:   //只能存在一个账号登录
                case 6017:   //会话失效
                    messageIfc = singleAccountMessageIfc;
                    break;
                default:
            }
            if (messageIfc != null) {
                messageIfc.handlerMessage(message, userEntity);
            }
        }
    }
 
    public RedisTemplate<String, String> getRedisTemplate() {
        return redisTemplate;
    }
 
    public void setRedisTemplate(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
}