话不多说,看代码。
一、pom.xml 引入spring boot websocket依赖
1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-websocket</artifactId> 4 </dependency>
二、WebSocketConfig 配置WebSocket消息代理端点,即stomp服务端
1 @Slf4j 2 @Configuration 3 @EnableWebSocketMessageBroker // 注解开启STOMP协议来传输基于代理的消息,此时控制器支持使用 4 @MessageMapping 5 public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer 6 { 7 @Autowired 8 private SimpMessagingTemplate messagingTemplate; 9 10 // 测试 11 // int info = 1; 12 // 13 // @Scheduled(fixedRate = 4000) 14 // public void outputLogger() 15 // { 16 // log.info("测试日志输出" + info++); 17 // } 18 19 @Override 20 public void registerStompEndpoints(StompEndpointRegistry registry) 21 { 22 // 将clientMessage注册为STOMP的一个端点 23 // 客户端在订阅或发布消息到目的路径前,要连接该端点 24 // setAllowedOrigins允许所有域连接,否则浏览器可能报403错误 25 registry.addEndpoint("/websocket").setAllowedOrigins("*").addInterceptors().withSockJS(); // 26 } 27 28 29 30 /** 31 * 推送日志到/topic/pullLogger 32 */ 33 @PostConstruct 34 public void pushLogger() 35 { 36 ExecutorService executorService = Executors.newFixedThreadPool(4); 37 Runnable fileLog = new Runnable() 38 { 39 @Override 40 public void run() 41 { 42 while (true) 43 { 44 try 45 { 46 String log = LoggerQueue.getInstance().poll().toString(); 47 if (log != null) 48 { 49 if (messagingTemplate != null) 50 messagingTemplate.convertAndSend("/topic/pullFileLogger", log); 51 } 52 } 53 catch (Exception e) 54 { 55 e.printStackTrace(); 56 } 57 } 58 } 59 }; 60 executorService.submit(fileLog); 61 executorService.submit(fileLog); 62 } 63 }
三、新增日志消息实体
1 /* 2 * 日志消息实体类,这里用了lombok插件 3 * 没有安装该插件的话,就手动添加get、set方法、toString方法 4 */ 5 @Getter 6 @Setter 7 @ToString 8 @AllArgsConstructor 9 public class LoggerMessage 10 { 11 private String body; 12 private String timestamp; 13 private String threadName; 14 private String className; 15 private String level; 16 private String exception; 17 private String cause; 18 }
四、创建一个阻塞队列,作为日志系统输出的日志的一个临时载体
1 /*