웹 소켓 + 타이머 Springboot 시작 오류

29606 단어 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

좋은 웹페이지 즐겨찾기