Springboot +webscoket+定时器,定时器不执行

文章介绍了一个SpringBoot应用中使用@Scheduled注解创建的定时任务,该任务每10秒通过WebSocket接口推送MySQL的最新数据。由于SpringBoot默认的定时任务是单线程,因此通过定义一个TaskScheduler配置类,使用ThreadPoolTaskScheduler实现多线程来确保定时任务的执行。最终,应用成功按预期执行了定时任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

需要定时通过websocket接口来推送mysql里面最新的数据,自定义了定时器

@Component
@Slf4j
public class  TaskScheduler {

    @Autowired
    private TparkOrderInOutMapper tparkOrderInOutMapper;

    @Autowired
    UserController userController;
    /**
     * 间隔是10秒执行一次
     */
    @Scheduled(cron = "0/10 * * * * ?")
    public void pushParkInfo() {
        userController.findAll();
    }
}

定时器配置

在启动类里面增加定时器的启动入口。

@SpringBootApplication
@MapperScan(basePackages = "com.stop.mapper") //扫描mapper包
@EnableScheduling //配置定时器
public class Application {
   public static void main(String[] args) {
       SpringApplication.run(Application.class,args);
       System.out.println("hello world");
       System.out.println("test");
   }
}

其中,注解@EnableScheduling 就是配置定时器。

启动作业

启动作业发现定时器的任务没有执行。查阅资料是因为:
springBoot 默认是使用单线程的Scheduler来处理我们的 @Scheduled注解的定时任务。
我们需要定义一个TaskScheduler的配置类,使用多线程来执行我们的定时任务。

@Configuration
public class ScheduledTaskConfiguration implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        final ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(2);
        taskScheduler.initialize();
        taskRegistrar.setTaskScheduler(taskScheduler);
    }
}

最后运行application的时候,我们可以看到控制上:
在这里插入图片描述我们可以看到上面定时任务按照间隔10秒在执行操作。

WebSocket断线重连机制通常涉及到前端的Vue.js和后端的Spring Boot框架。当网络连接中断,客户端需要检测到并尝试重新连接。在Spring Boot中,你可以利用`spring-websocket`模块提供的`TextMessage`和`CloseStatus`来处理这种场景。以下是一个基本步骤: 1. **Vue.js**: - 使用WebSocket库(如axios的ws插件)创建连接,并监听`close`事件。 - 当接收到`close`事件,检查状态码是否表示意外断开(例如1006表示正常关闭,而其他非200可能是网络问题)。 - 如果是意外断开,设置定时器或者使用轮询(如果WebSocket API可用),在一段间后尝试重建连接。 ```javascript import { createSocket } from 'axios'; const socket = createSocket('ws://your-server-url'); socket.on('close', (event) => { if (event.code !== 1006) { setTimeout(() => { // 重建连接 createSocket('ws://your-server-url'); }, 5000); // 5秒后重试 } }); ``` 2. **Spring Boot**: - 创建WebSocket处理器(WebFlux的`ServerWebsocketHandler`),并监听`SessionDisconnectedEvent`来感知断开。 - 在事件处理程序中记录断开情况,或者发送消息给客户端,告知其尝试重连。 ```java @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig extends StompEndpointConfigurerAdapter { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Bean public WebSocketHandler wsHandler() { return new TextWebSocketHandler(YourWebSocketService.class); } } @Service public class YourWebSocketService implements TextWebSocketSessionHandler { @Override public void afterConnectionEstablished(WebSocketSession session) { // 在这里处理连接建立后的操作 } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) { // 处理断线,如保存session状态等 // 可以通过session.getMessageChannel().send(new TextMessage("Reconnect requested")); // 来通知客户端尝试重新连接 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值