package com.iplatform.tcp.support; import com.iplatform.tcp.util.ws.WebBroadCastResponse; import com.iplatform.tcp.util.ws.WebDataResponse; import com.walker.infrastructure.utils.StringUtils; import com.walker.push.AbstractPushObject; import com.walker.push.Notification; import com.walker.push.NotificationChannel; import com.walker.push.PushException; import com.walker.push.PushResult; import com.walker.push.util.PushUtils; import com.walker.tcp.netty.WebSocketEngine; import java.util.ArrayList; import java.util.List; /** * WebSocket方式实现的推送对象。 * @author 时克英 * @date 2023-04-21 */ public class WebSocketPush extends AbstractPushObject { public WebSocketPush(){ this.setId(NotificationChannel.WebSocket.getIndex()); this.setName(NotificationChannel.WebSocket.getName() + "推送"); } @Override protected PushResult doPushContent(Notification notification, List data) throws PushException { PushResult pushResult = PushUtils.acquireSuccessPushResult(); String error = null; for(WebBroadCastResponse response : data){ if(notification.getBroadcast()){ webSocketEngine.sendBroadcast(response); logger.debug("websocket广播直接发送,没有状态"); return pushResult; } error = this.webSocketEngine.sendResponse(response); if(StringUtils.isNotEmpty(error)){ if(pushResult.getCode() == 0){ pushResult.setCode(-1); } // 这里无需转换用户信息,因为使用的就是userId,一致的! pushResult.addOneFailed(response.getName()); } } return pushResult; } // @Override // protected PushResult doPushContent(Notification notification) throws PushException { // if(notification.getBroadcast()){ // logger.debug("websocket推送广播"); // // WebBroadCastResponse msg = new WebBroadCastResponse(); // msg.setMessageId(String.valueOf(NumberGenerator.getSequenceNumber())); // msg.setData(notification.getContent()); // webSocketEngine.sendBroadcast(msg); // return PushUtils.acquireSuccessPushResult(); // } // // // 普通推送消息 // PushResult pushResult = new PushResult(); // WebDataResponse response = null; // String error = null; // // List receiverList = notification.getReceiverList(); // for(String user : receiverList){ // response = new WebDataResponse(); // response.setMessageId(String.valueOf(NumberGenerator.getSequenceNumber())); // response.setData(notification.getContent()); // response.setName(user); // websocket用户标识为:userId // error = this.webSocketEngine.sendResponse(response); // // if(StringUtils.isNotEmpty(error)){ // if(pushResult.getCode() == 0){ // pushResult.setCode(-1); // } // pushResult.addOneFailed(user); // } // } // return pushResult; // } @Override public NotificationChannel getNotificationChannel() { return NotificationChannel.WebSocket; } @Override public List translateToTarget(Notification notification) { List data = new ArrayList<>(2); WebBroadCastResponse webBroadCastResponse = null; if(notification.getBroadcast()){ logger.debug("websocket推送广播"); webBroadCastResponse = new WebBroadCastResponse(); webBroadCastResponse.setMessageId(notification.getId()); webBroadCastResponse.setData(notification.getContent()); data.add(webBroadCastResponse); return data; } // 非广播,则需要把所有接收人集合返回 int i = 1; for(String user: notification.getReceiverList()){ webBroadCastResponse = new WebDataResponse(); webBroadCastResponse.setMessageId(notification.getId() + i); webBroadCastResponse.setData(notification.getContent()); webBroadCastResponse.setName(user); // websocket用户标识为:userId data.add(webBroadCastResponse); i++; } return data; } @Override public void startup() { } public void setWebSocketEngine(WebSocketEngine webSocketEngine) { this.webSocketEngine = webSocketEngine; } private WebSocketEngine webSocketEngine; }