Netty-socketio实时推送

业务场景: canal 监听 mysql  binlog 日志 并将其推送到 kafka 中 由于部门大部分是php 作为后台开发 ,而 kafka官方不支持对 php 的 客户端支持 需要第三方组件。

解决方案: 使用 Java 作为消费者 并使用 Netty-socketio 将数据实时推送给 php 

核心代码如下:

public class SocketIoService {

static SocketIOServer server;

static Map clientsMap = new HashMap<>();

public void startServer() throws InterruptedException {

server = new SocketIOServer(PropertiesConf.nettySocketConf());

//添加客户端连接事件

server.addConnectListener(client -> {

String sa = client.getRemoteAddress().toString();

client.getSessionId().toString();

String clientIp = sa.substring(1, sa.indexOf(":"));//获取设备ip

Map params = client.getHandshakeData().getUrlParams();

 

//获取客户端连接的uuid参数

Object object = params.get("uuid");

String uuid = "";

if (object != null) {

uuid = ((List) object).get(0);

//将uuid和连接客户端对象进行绑定

clientsMap.put(uuid, client);

}

});

server.start();

}

 

 

/**

* 给所有连接客户端推送消息

*

* @param eventType 推送的事件类型

* @param message 推送的内容

*/

public void sendMessageToAllClient(String eventType, String message) {

Collection clients = server.getAllClients();

for (SocketIOClient client : clients) {

client.sendEvent(eventType, message);

}

}

 

/**

* 停止服务

*/

public void stopServer() {

if (server != null) {

server.stop();

server = null;

}

}

 

public static SocketIOServer getServer() {

return server;

}

 

 

服务端推送数据代码:

ioService.sendMessageToAllClient("push_qa", "实时推送数据");

前端调用 :

 

var socket = io.connect('http://your_host:port');

socket.on('push_qa',function(data){

var personInfo = JSON.parse(data);

console.log(personInfo);

});

 

 

你可能感兴趣的:(Netty-socketio实时推送)