Spring Boot 集成 socket.io 后端实现消息实时通信

bianmaren 发布于 2018-09-19 17:18:20    访问

标签 : JAVA Spring Boot

  1. 通过 initSocket 初始化客户端,初始化地址 http://localhost:9090;

  2. 通过 new ScheduledThreadPoolExecutor(10),初始化任务调度线程池;

  3. 使用 Map 用于存放每个进来任务的 future ,key:为任务id,value:future,目的是为了可以通过条件控制任务,通过接口调用可以 cancel 对应的 future;

  4. 通过 connectSocket 连接服务端,并调用 addConnectListenerEvent 添加一些列监听事件;

  5. 通过 startClient 启动任务。

  6. 通过 HandleMessageRunnable 类实现具体消息的处理。

创建定时任务调度控制器 ScheduledController

package com.socket.web;
import com.socket.socketio.SocketClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * 定时任务调度控制器
 *
 * @author pengdh
 * @date: 2017-09-03 1:53
 */
@RestController
public class ScheduledController {
	private final Logger logger = LoggerFactory.getLogger(this.getClass());
 @Autowired
	private SocketClient client;
	/**
	 * 启动客户端任务
	 * @param id 任务id
	 * @param startTime 任务开始时间
	 * @return
	 */
	@RequestMapping("/start/{id}")
	public ResponseEntity startClient(@PathVariable String id, @RequestParam String startTime) {
		client.startClient(id, startTime);
		return new ResponseEntity(HttpStatus.NO_CONTENT);
	}
	/**
	 * 取消消息任务
	 * @param id
	 * @return
	 */
	@RequestMapping("/end/{id}")
	public ResponseEntity endClient(@PathVariable String id) {
		client.endClient(id);
		return new ResponseEntity(HttpStatus.NO_CONTENT);
	}
	/**
	 * 通过接口调用手动结束所有任务
	 *
	 * @return
	 */
	@RequestMapping("/end")
	public ResponseEntity shutdown() {
		logger.info("手动结束所有任务");
		client.shutdown();
		return new ResponseEntity(HttpStatus.NO_CONTENT);
	}
	/**
	 * 定时结束所有任务
	 */
	@Scheduled(cron = "0 0 2 * * ?")
	public void stopClient() {
		logger.info("定时结束所有任务");
		client.shutdown();
	}
}
  1. 调用 http://localhost:8080/socket-demo/start/{id}?startTime=yyyyMMddHHmmss 接口可以控制指定任务在指定时间开始执行;

  2. 调用 http://localhost:8080/socket-demo/end/{id} 取消指定任务;

  3. 调用 http://localhost:8080/socket-demo/end 可以手动接收当前在执行的所有任务,scheduledExecutorService.shutdown() 不会强制所有任务立即停止,而是会在正在执行的本次任务执行完后才 shutdown;

  4. 这里使用到了 @Scheduled ,需要到 Application 类中的加上 @EnableScheduling 注解以开启定时任务;

  5. stopClient 方法可以定时结束所有任务,以节省资源,这个根据业务自身决定是否需要。

修改 Appingcation 类

package com.socket;
import com.socket.socketio.SocketServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
@ComponentScan
public class SpringbootSocketApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringbootSocketApplication.class, args);
		SocketServer server = new SocketServer();
		server.startServer();
	}
}

本文转载至:http://alexpdh.com/2017/09/03/springboot-socketio/