package com.zhujizheng.IHome.chat.net; import com.zhujizheng.IHome.chat.dto.PYHideChatDTO; import com.zhujizheng.IHome.chat.service.PYSingleChatService; import com.zhujizheng.IHome.chat.vo.PYHideChatAckVO; import com.zhujizheng.IHome.chat.vo.PYHideChatVO; import com.zhujizheng.IHome.util.alipush.AliPushService; import com.zhujizheng.IHome.websocket.Net.Base.NetProtocolBase; import com.zhujizheng.IHome.websocket.Net.exception.NetException; import com.zhujizheng.IHome.websocket.server.WebSocketServer; import lombok.extern.slf4j.Slf4j; import net.sf.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.concurrent.atomic.AtomicReference; @Slf4j @Component public class NetHideChat extends NetProtocolBase { @Autowired private PYSingleChatService service; @Autowired private AliPushService aliPushService; @Override public void dealWithJSONAndSid(JSONObject json, String sid) { super.dealWithJSONAndSid(json, sid); // 解析消息数据 PYHideChatDTO dto = (PYHideChatDTO)JSONObject.toBean(json, PYHideChatDTO.class); PYHideChatVO vo = new PYHideChatVO(); vo.setReceiveId(dto.getReceiveId()); // 设置回调结果的消息唯一标识符 vo.setMsgSeq(dto.getMsgSeq()); // 设置回调结果的消息状态默认为成功 vo.setStatus(1); PYHideChatAckVO ackVO = new PYHideChatAckVO(); ackVO.setMsgSeq(dto.getMsgSeq()); ackVO.setReceiveId(dto.getReceiveId()); ackVO.setSendId(Integer.parseInt(sid)); WebSocketServer item = WebSocketServer.getWebSocketMap().get(ackVO.getReceiveId().toString()); if (null == item) { // 离线推送 log.info("离线推送::ackVO.getReceiveId().toString() = " + ackVO.getReceiveId().toString()); aliPushService.pushRemoteNotify("新消息", "您收到一条聊天消息", ackVO.getReceiveId().toString(), ackVO.getSendId().toString(), 1); // 更新数据库 int result = service.hideSingleChat(dto.getMsgSeq()); if (result == 0) { log.info("发送状态更新失败"); // 设置回调结果的消息状态为失败 vo.setStatus(0); this.sendObject(vo, sid); } else { // 给自己回调发送的结果,走到这一步才能确保消息发送成功 this.sendObject(vo, sid); } return; } // 给receiveId发送数据 NetHideChatAck ack = new NetHideChatAck(); // 设置即将发送的消息的消息状态为成功 ackVO.setStatus(1); AtomicReference sendSuccess = new AtomicReference<>(true); try { ack.sendObject(ackVO, ackVO.getReceiveId().toString()); } catch (NetException e) { log.info("删除消息失败"); e.printStackTrace(); sendSuccess.set(false); } finally { if (sendSuccess.get()) { log.info("删除消息成功"); // 更新数据库 int result = service.hideSingleChat(dto.getMsgSeq()); if (result == 0) { log.info("发送状态更新失败"); // 设置回调结果的消息状态为失败 vo.setStatus(0); this.sendObject(vo, sid); } else { // 给自己回调发送的结果,走到这一步才能确保消息发送成功 this.sendObject(vo, sid); } } } } }