Translate

2017년 6월 23일 금요일

[Maven] package 할 시 발생하는 'Some Enforcer rules have failed' 에러







프로젝트를 WAR로 배포하기 위해 package 하는데 아래와 같은 에러가 발생하며 정상적으로 수행되지 않았다.



org.apache.maven.enforcer.rule.api.EnforcerRuleException: Some plugins are missing valid versions:(LATEST RELEASE SNAPSHOT are not allowed )
org.springframework.boot:spring-boot-maven-plugin. The version currently in use is 1.5.4.RELEASE
[ERROR] Best Practice is to always define plugin versions!
at org.apache.maven.plugins.enforcer.RequirePluginVersions.execute(RequirePluginVersions.java:325)
at org.apache.maven.plugins.enforcer.EnforceMojo.execute(EnforceMojo.java:193)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
[WARNING] Rule 2: org.apache.maven.plugins.enforcer.RequirePluginVersions failed with message:
Some plugins are missing valid versions:(LATEST RELEASE SNAPSHOT are not allowed )
org.springframework.boot:spring-boot-maven-plugin. The version currently in use is 1.5.4.RELEASE
[ERROR] Best Practice is to always define plugin versions!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.485 s
[INFO] Finished at: 2017-06-22T18:11:43+09:00
[INFO] Final Memory: 20M/227M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.4.1:enforce (enforce-java) on project realestate-core: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed. -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-enforcer-plugin:1.4.1:enforce (enforce-java) on project realestate-core: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed.
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
Caused by: org.apache.maven.plugin.MojoExecutionException: Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed.
at org.apache.maven.plugins.enforcer.EnforceMojo.execute(EnforceMojo.java:237)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
... 21 more
[ERROR] 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException







아래와 같은 방법으로 해당 증상을 해결했다.
 1004lucifer

 mvn package -Denforcer.skip=true






IntelliJ 에서 아래와 같이 셋팅을 했다.

 1004lucifer





PS.
위의 방법으로 에러가 안나게 하니 'webxml attribute is required' 에러가 또 발생을 해서 해당 에러 해결방법은 아래의 링크로..ㅎ
http://1004lucifer.blogspot.kr/2017/06/maven-package-webxml-attribute-is.html




참고
http://sonarqube-archive.15.x6.nabble.com/Sonar-maven-plugin-problem-with-enforcer-plugin-td3211016.html



[Maven] package 할 시 발생하는 'webxml attribute is required' 에러







프로젝트를 war 파일로 생성하기 위해 package 를 수행했는데 아래와 같은 오류가 발생을 했다.
1004lucifer


[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 23.703 s
[INFO] Finished at: 2017-06-22T18:33:18+09:00
[INFO] Final Memory: 49M/362M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project realestate-core: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode) -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project realestate-core: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:199)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
at org.codehaus.classworlds.Launcher.main(Launcher.java:47)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
at org.apache.maven.plugin.war.WarMojo.execute(WarMojo.java:193)
at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207)
... 21 more
Caused by: org.codehaus.plexus.archiver.ArchiverException: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
at org.codehaus.plexus.archiver.war.WarArchiver.initZipOutputStream(WarArchiver.java:148)
at org.codehaus.plexus.archiver.zip.AbstractZipArchiver.createArchiveMain(AbstractZipArchiver.java:309)
at org.codehaus.plexus.archiver.zip.AbstractZipArchiver.execute(AbstractZipArchiver.java:211)
at org.codehaus.plexus.archiver.AbstractArchiver.createArchive(AbstractArchiver.java:897)
at org.apache.maven.archiver.MavenArchiver.createArchive(MavenArchiver.java:582)
at org.apache.maven.plugin.war.WarMojo.performPackaging(WarMojo.java:243)
at org.apache.maven.plugin.war.WarMojo.execute(WarMojo.java:177)
... 23 more
[ERROR] 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException





아래와 같이 pom.xml 설정으로 해결이 가능하다.
1004lucifer

방법 1

<properties>
 <java.version>1.7</java.version>
 <tomcat.version>7.0.78</tomcat.version>
 <failOnMissingWebXml>false</failOnMissingWebXml>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>



방법 2

<build>
 <plugins>
  <plugin>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-maven-plugin</artifactId>
   <version>1.5.3.RELEASE</version>
  </plugin>
  <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-war-plugin</artifactId>
   <configuration>
    <failOnMissingWebXml>false</failOnMissingWebXml>
   </configuration>
  </plugin>
 </plugins>
</build>




참고
https://stackoverflow.com/questions/5351948/webxml-attribute-is-required-error-in-maven


2017년 6월 21일 수요일

[Spring Boot] Tomcat 에 WAR 배포 시 404페이지 뜨며 Spring Boot 실행되지 않는 이슈




증상

Spring Boot 를 기존 jar => war 변경 후 톰캣에 배포를 했는데
Deploy 되었다는 화면만 나오며 스프링 관련 프로그램이 실행되어 보이지 않는다.
그리고 RequestMapping 잡아놓은 경로 접근 시 그냥 404가 보여진다.




tomcat-embed 버전과 관련이 있을까 싶어 pom.xml 설정에
1004lucifer


<properties>
<tomcat.version>7.0.78</tomcat.version>
</properties>



위와같이 명시를 했더니 그제서야 디플로이 시 Spring boot 가 정상적으로 로딩되어 페이지가 보여지는 것을 확인했다.


Spring Boot 1.5.4 RELEASE 버전을 사용하는데..
종속된 Tomcat 버전이 8.5.15 버전을 사용하고 있었다.
나는 Tomcat 7 버전에 배포를 하다보니 정상적으로 안되는 느낌..!?



PS.
포스팅 하기전에
tomcat-embed 버전을 맞추지 않고 테스트를 해보니 이제는 embed 버전과 실제 tomcat 버전이 달라도 정상적으로 로딩이 된다.ㅠ (뭐가 문제였을까..)


2017년 6월 20일 화요일

[Linux] 압축 해제 시 발생하는 'invalid compressed data--format violated' 오류




리눅스에서 압축된 파일을 압축 해제할 시 아래와 같이 오류가 발생하는 경우가 있다.
1004lucifer

[1004lucifer@server java]$ gzip -d jdk-8u131-linux-x64.tar.gz
gzip: jdk-8u131-linux-x64.tar.gz: invalid compressed data--format violated
[1004lucifer@server java]$



실제 압축된 파일에 오류가 있을 수도 있긴 하지만..

윈도우에서 리눅스 서버로 FTP를 이용해 파일을 업로드 한 경우 발생가능성이 크다.
1004lucifer
파일을 업로드 시 전송모드를 바이너리가 아니라 아스키모드로 전송 시 위와같은 에러가 발생할 수 있다.


[MySQL] 'mysql.user is wrong. Expected 43, found 42' 에러 시 대처




문제

MySQL 5.5 => 5.6 마이그레이션 후
사용자 계정을 추가하려 하는데 아래와 같이 에러가 발생했다.


1004lucifer
Error Saving Account

Error creating account cms@%: Column count of mysql.user is wrong. Expected 43, found 42. Created with MySQL 50556, now running 50636. Please use mysql_upgrade to fix this error.




해결

아래와 같이 조치 후 사용자 계정 추가가 정상적으로 동작되는 것을 확인했다.
1004lucifer

# 처음에 안된 이유는 mysql 프로세스가 띄워져 있지 않아 작동되지 않았다.
C:\Users\1004lucifer>mysql_upgrade -u root
Looking for 'mysql.exe' as: C:\utils\mysql-5.6.36-winx64\bin\mysql.exe
Looking for 'mysqlcheck.exe' as: C:\utils\mysql-5.6.36-winx64\bin\mysqlcheck.exe
Error: Failed while fetching Server version! Could be due to unauthorized access.
FATAL ERROR: Upgrade failed

# mysqld --standalone 으로 프로세스 띄운 후 정상적으로 작동
C:\Users\1004lucifer>
C:\Users\1004lucifer>
C:\Users\1004lucifer>mysql_upgrade -u root
Looking for 'mysql.exe' as: C:\utils\mysql-5.6.36-winx64\bin\mysql.exe
Looking for 'mysqlcheck.exe' as: C:\utils\mysql-5.6.36-winx64\bin\mysqlcheck.exe
Running 'mysqlcheck' with connection arguments: "--port=3306" "--socket=/tmp/mysql.sock"
Running 'mysqlcheck' with connection arguments: "--port=3306" "--socket=/tmp/mysql.sock"
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.host                                         OK
mysql.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.servers                                      OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
Running 'mysql_fix_privilege_tables'...
Running 'mysqlcheck' with connection arguments: "--port=3306" "--socket=/tmp/mysql.sock"
Running 'mysqlcheck' with connection arguments: "--port=3306" "--socket=/tmp/mysql.sock"
OK

C:\Users\1004lucifer>





PS.
mysql_upgrade 명령어가 잘 되지 않는경우 아래의 참고한 링크를 확인.


참고
https://serverfault.com/questions/527422/mysql-upgrade-is-failing-with-no-real-reason-given


2017년 6월 10일 토요일

[Bootstrap] 'SB Admin 2' Template 네비(navigation menu) 버그 수정



최근 웹 애플리케이션을 제작하면서 Bootstrap 을 사용해볼까 싶어 'SB Admin 2' 라는 Template을 기반으로 부트스트랩 공부를 하며 적용을 하고 있다.
(https://startbootstrap.com/template-overviews/sb-admin-2/)


적용을 하다보니 'SB Admin 2'의 버그를 발견하게 되었는데 많은 기능중에 아래의 기능에 버그가 있었다.


 Responsive top navigation menu with dropdown menu items





증상

1. 기본적인 아래의 화면에서
1004lucifer



2. 아래와 같이 resize를 하여 화면을 줄이면 네비게이션 메뉴가 없어지는데
1004lucifer



3. 처음부터 모바일 화면에서 새로고침(refresh/reload) 하게되었을 때 처음부터 Menu가 펼쳐진채로 나타나게 된다.
(오른쪽 상단의 메뉴 버튼을 눌렀을 때 아래와 같이 보여줘야 한다.)



아래의 'SB Admin 2' 의 스크립트를 확인해 보았다.

/*!
 * Start Bootstrap - SB Admin 2 v3.3.7+1 (http://startbootstrap.com/template-overviews/sb-admin-2)
 * Copyright 2013-2016 Start Bootstrap
 * Licensed under MIT (https://github.com/BlackrockDigital/startbootstrap/blob/gh-pages/LICENSE)
 */
$(function() {
    $('#side-menu').metisMenu();
});

//Loads the correct sidebar on window load,
//collapses the sidebar on window resize.
// Sets the min-height of #page-wrapper to window size
$(function() {
    $(window).bind("load resize", function() {
        var topOffset = 50;
        var width = (this.window.innerWidth > 0) ? this.window.innerWidth : this.screen.width;
        if (width < 768) {
            $('div.navbar-collapse').addClass('collapse');
            topOffset = 100; // 2-row-menu
        } else {
            $('div.navbar-collapse').removeClass('collapse');
        }

        var height = ((this.window.innerHeight > 0) ? this.window.innerHeight : this.screen.height) - 1;
        height = height - topOffset;
        if (height < 1) height = 1;
        if (height > topOffset) {
            $("#page-wrapper").css("min-height", (height) + "px");
        }
    });

    var url = window.location;
    // var element = $('ul.nav a').filter(function() {
    //     return this.href == url;
    // }).addClass('active').parent().parent().addClass('in').parent();
    var element = $('ul.nav a').filter(function() {
        return this.href == url;
    }).addClass('active').parent();

    while (true) {
        if (element.is('li')) {
            element = element.parent().addClass('in').parent();
        } else {
            break;
        }
    }
});



원인
1004lucifer
문제가 된 부분은 $(window).bind("load") 이 부분 인데..
jQuery 라이브러리 로딩 후 나중에 실행이 되다보니 window 의 load 이벤트는 이미 실행이 되어버린 상황이라서 load event 가 수행이 되지 않았다.




해결방법

그렇다고 head에 넣기에는 싫어 이것저것 해보다가 결국엔 아래와 같이 추가로 collapse class 를 넣어서 해결을 했다.
(collapse 클래스가 있는경우 mobile 에선 접혀지고 desktop 에선 펼쳐지는데 굳이 처음에 뺄 이유는 없어보였다.)



<div class="navbar-default sidebar" role="navigation">
 <div class="sidebar-nav navbar-collapse collapse">
  <ul class="nav" id="side-menu">
   <li class="sidebar-search">
    <div class="input-group custom-search-form">
     <input type="text" class="form-control" placeholder="Search..." />
     <span class="input-group-btn">
     <button class="btn btn-default" type="button">
      <i class="fa fa-search"></i>
     </button>
     </span>
    </div>
    <!-- /input-group -->



[IntelliJ] Spring Boot 에서 ThymeLeaf 사용 시 Cannot resolve 에러 발생증상




최근 Spring Boot + ThymeLeaf 를 사용하고 있는데 아래와 같이 에러가 발생하는 증상을 보게 되었다.
1004lucifer

 Cannot resolve {variables} less... (Ctrl+F1) 
 Validates unresolved references and invalid expressions.





IntelliJ PlugIn을 설치를 해야 하는건가 싶어서 이것저것 알아봤는데..
1004lucifer
Spring Boot + ThymeLeaf 사용 시 IntelliJ 에서 발생하는 문제라고 한다.
(https://youtrack.jetbrains.com/issue/IDEA-132738)

아직 수정은 안된 것 같으며 나중에 시간이 좀 지나면 IntelliJ 업데이트 한번 해봐야 겠다.



참고
https://stackoverflow.com/questions/38710585/spring-boot-thymeleaf-in-intellij-cannot-resolve-vars


2017년 6월 7일 수요일

[MySQL] 5.5 => 5.6 버전 마이그레이션 하기




2017년 MySQL이 5.7까지 나온 상황에서 예전에 써봤던 MySQL 5.5를 설치해서 사용을 하다가 문자열 like 검색이 필요해서 알아보던중 FULLTEXT 라는 퍼포먼스 빠른 기능이 있다는 것을 알게되었다.

MySQL 5.5 에서는 해당 기능이 지원되지 않으며,
MySQL 5.6 이상부터 FULLTEXT 지원이 된다고 해서 5.6으로 마이그레이션을 진행을 했다.
1004lucifer
예상외로 간단히 작업이 되었으며, 아래와 같이 진행을 했다.



1. <_MySQL5.5_HOME_>/data 디렉토리를 <_MySQL5.6_HOME_> 디렉토리로 이동
1004lucifer
2. MySQL5.6 버전에서 사용할 my.ini 파일 수정
[mysqld] 항목에 아래의 내용을 추가

 innodb_file_per_table=0
 innodb_checksum_algorithm=INNODB
 binlog_checksum=NONE


3. 기존과 같이 MySQL 5.6 기동




참고: https://dev.mysql.com/doc/refman/5.6/en/upgrading-from-previous-series.html


2017년 6월 3일 토요일

[Spring Boot] 여러개의 @Scheduled 메소드중 하나만 수행이 되는 경우




증상

스프링부트를 이용하여 애플리케이션 개발중
@Scheduled 애노테이션을 이용하여 몇개의 스케쥴을 등록했는데,
1004lucifer
겹치는 시간이 발생 시 동시에 2~3개가 실행되는게 아니라
기존 돌고있던 스케쥴이 끝나고 다른 스케쥴이 돌아버리거나 시간이 너무 경과한 경우 돌지 않는 스케쥴도 발생했었다.




원인

기본적으로 스케쥴러가 사용할 수 있는 Thread 갯수가 1개밖에 없어서 여러개의 스케쥴을 등록해도 기존에 돌고있던게 끝나지 않으면 다른 스케쥴이 동작하지 않았다.




해결방법

XML 설정파일에 pool size 를 설정하는 방법도 있지만
스프링부트를 사용하면서 가급적 XML 파일 없이 셋팅 하는걸 선호하기에 다른방법을 찾아봤다.
1004lucifer
application.properties 나 application.yml 파일에 셋팅하는게 없을까 싶었는데 찾지 못하고 JAVA 파일로 설정하는 방법밖에 찾을 수가 없었다.
(아래의 파일을 추가해서 Pool Size 설정해서 이슈 해결)


@Configuration
public class SchedulingConfigurerConfiguration implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(100);
        taskScheduler.initialize();
        taskRegistrar.setTaskScheduler(taskScheduler);
    }
}


참고: https://stackoverflow.com/questions/29796651/what-is-the-default-scheduler-pool-size-in-spring-boot