웹 소켓 + 타이머 Springboot 시작 오류
package com.ckh.springboot04.websocket;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
@EnableWebSocket
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
package com.ckh.springboot04.websocket;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* websocket
*/
@ServerEndpoint("/websocket")
@Component
@Slf4j
public class WebSocketServer {
/**
* , 。 。
*/
private static int onlineCount = 0;
/**
* concurrent Set, MyWebSocket 。
*/
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
/**
* ,
*/
private Session session;
/**
*
*/
@OnOpen
public void onOpen(Session session) {
this.session = session;
// set
webSocketSet.add(this);
// 1
addOnlineCount();
log.info(" , " + getOnlineCount());
System.out.println("websocket ");
}
/**
*
*/
@OnClose
public void onClose() {
// set
webSocketSet.remove(this);
// 1
subOnlineCount();
log.info(" ! " + getOnlineCount());
}
/**
*
*
* @param message
*/
@OnMessage
public void onMessage(String message, Session session) {
log.info(" :" + message);
}
/**
* @param session
* @param error
*/
@OnError
public void onError(Session session, Throwable error) {
log.error(" ");
error.printStackTrace();
}
/**
* , message
*/
public void sendMessage(String message) throws IOException {
// this.session.getBasicRemote().sendText(message);
for (WebSocketServer webSocket : webSocketSet) {
log.info("【websocket 】 , message={}", message);
try {
webSocket.session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static synchronized int getOnlineCount() {
return onlineCount;
}
public static synchronized void addOnlineCount() {
WebSocketServer.onlineCount++;
}
public static synchronized void subOnlineCount() {
WebSocketServer.onlineCount--;
}
}
sringboot 내장 타이머
package com.ckh.springboot04.component;
import com.ckh.springboot04.dao.AdminRepository;
import com.ckh.springboot04.entities.Admin;
import org.apache.poi.ss.usermodel.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/*
*
* admin lockedFlag
*
* */
@Component
public class ScheduledTask {
@Autowired
AdminRepository adminRepository;
@Scheduled(cron = "0/10 * * * * ?") // 10
public void scheduledTaskByCorn() {
List<Admin> admins = adminRepository.findAll();
for (Admin admin : admins){
Date lockedToTime = admin.getLockedToTime();
if (lockedToTime != null){
//
Date current_date = new Date();
int compare = current_date.compareTo(lockedToTime); //current_date < lockedToTime -1; 0; 1
if (compare >= 0){
// lockedToTime <=current_date
// ,
admin.setLockedToTime(null);
admin.setLockedFlag(true);
admin.setUpdateTime(null);
adminRepository.save(admin);//
}
}
}
}
}
시작 클래스 에 @ Enable Scheduling 추가
package com.ckh.springboot04;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class SpringBoot04WebRestfulcrudApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBoot04WebRestfulcrudApplication.class, args);
}
}
그러나 시작 이 잘못 되 었 습 니 다: org. springframework. beans. factory. BeanNotOFRequiredTypeException: Bean named 'default SockJSTaskScheduler' 는 'org. springframework. scheduling. TaskScheduler' 유형 으로 예상 되 지만 실제로는 'org. springframework. beans. factory. support. NullBean' 유형 이 었 습 니 다.
이 두 블 로 그 를 참고 하여 드디어 해결 방안 을 찾 았 습 니 다. 설정 클래스 를 추가 합 니 다.
package com.ckh.springboot04.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
public class ScheduledConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);
taskScheduler.initialize();
return taskScheduler;
}
}
해결!!!
이렇게 하 는 이 유 는 무엇 입 니까?웹 소켓 도 정시 작업 (심장 박동 검 측) 자체 스 레 드 탱크 이기 때 문인 것 같 습 니 다. 그리고 사용자 정의 정시 작업 도 스 레 드 탱크 를 다시 정의 해 야 합 니 다.둘 이 얽 히 지 않 는 다 는 것 을 보증 할 수 있다.
이해 가 평이 하 니 여러분 의 지적 을 바 랍 니 다.
블 로그 링크 참조:https://www.cnblogs.com/threadj/articles/10631193.html https://blog.csdn.net/u013565163/article/details/80659828
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.