기록 문제 해결 : 봄 부팅 프로젝트 시작 걸림을 해결하는 방법

배경 문제

스프링 부트 개발 프로젝트, 봄 부트 버전은 1.5.7이다, 봄 버전은 4.1.3 캐리입니다. 응용 프로그램 로그가 출력되지 않습니다 시작할 때 개발 피드백은, 갑자기 프로세스가 붙어,로드 관련 구성 요소를 종료하지 않는 모습 기능은 로컬 IDEA에서 실행되고, 로컬로 시작하지. 다음과 같이도 증상은 다음과 같습니다 :

IMG

분석

유용한 로그 정보가 없기 때문에, 그래서 당신은이 수준에서 로그온 문제를 해결할 수 없습니다. 하지만 이런 식으로, 출력 로그, 정상적인 상황에서, 단지 옆에 현재 스레드 스택을위한 다음 인쇄 정보를 통해, 그 과정에서 어딘가에 갇혀 시작하는 내부 프로그램은 확실히이다. 일반적으로, 서버 환경에서, 우리가 볼 수있는 자바 툴킷 jstack을 도구를 사용합니다 : jstack을 PID (자바 응용 프로그램 프로세스) 등.

그러나, 지역 IDEA의 발전을 경우, IDEA 같은, 현재 응용 프로그램에 대한 스레드 라인 텍스트 정보를 직접 볼 수있는 도구를 내장 :

IMG

치아 이탈리아 그래서 동일한 아이콘과 같은 카메라를 가리키는 화살표, 아래 참고, 현재의 thread 인쇄 수단의 스냅 샷입니다. 버튼을 클릭 한 후, 오른쪽 스레드 컨텍스트 정보, 당신은, 당신은 다음을 볼 수 있습니다, 스레드 상태가 참으로 대기 스레드의 많은 주 스레드에서 우리의 주요 관심사가보고 한 다음 화살표가 메인 스레드를 가리키고 클릭 수 나타나

"main@1" prio=5 tid=0x1 nid=NA waiting
java.lang.Thread.State: WAITING
at sun.misc.Unsafe.park(Unsafe.java:-1)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
at org.springframework.boot.autoconfigure.BackgroundPreinitializer.onApplicationEvent(BackgroundPreinitializer.java:63)
at org.springframework.boot.autoconfigure.BackgroundPreinitializer.onApplicationEvent(BackgroundPreinitializer.java:45)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:158)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
at org.springframework.boot.context.event.EventPublishingRunListener.finished(EventPublishingRunListener.java:115)
at org.springframework.boot.SpringApplicationRunListeners.callFinishedListener(SpringApplicationRunListeners.java:79)
at org.springframework.boot.SpringApplicationRunListeners.finished(SpringApplicationRunListeners.java:72)
at org.springframework.boot.SpringApplication.handleRunFailure(SpringApplication.java:745)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:134)
- locked <0xea6> (a java.util.concurrent.atomic.AtomicBoolean)
at org.springframework.cloud.bootstrap.BootstrapApplicationListener.bootstrapServiceContext(BootstrapApplicationListener.java:175)
at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:98)
at org.springframework.cloud.bootstrap.BootstrapApplicationListener.onApplicationEvent(BootstrapApplicationListener.java:64)
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:74)
at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:325)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:296)
at cn.keking.project.customerManagement.KekingCustomerManagement.main(KekingCustomerManagement.java:36)

그것은 CountDownLatch.await () 스레드 블록으로 볼 수있는 다음 코드 블록은 다음과 같이 라인 아래 보면 :

private static final CountDownLatch preinitializationComplete = new CountDownLatch(1);
 
@Override
public void onApplicationEvent(SpringApplicationEvent event) {
   if (event instanceof ApplicationEnvironmentPreparedEvent) {
      if (preinitializationStarted.compareAndSet(false, true)) {
         performPreinitialization();
      }
   }
   if (event instanceof ApplicationReadyEvent || event instanceof ApplicationFailedEvent) {
      try {
         preinitializationComplete.await();
      }
      catch (InterruptedException ex) {
         Thread.currentThread().interrupt();
      }
   }
}

차단 된 스레드로 이어지는, 여기, 이것은 확실하게, 코드에 표시된 SpringApplicationEvent 이벤트를 듣고, 클래스 봄 부트의 보안 초기화 자원이다, 그것은 preinitializationComplete.await ()를 수행하기 위해 논리적이다. 정상적인 상황에서는 봄 이벤트는 첫 preinitializationComplete.await ()에서, 여기에 주로 왜 카드의 프로그램 로직의 모습을 통해, 봄이 이렇게하는 이유에 가지 않습니다 ApplicationEnvironmentPreparedEvent에서 전체 초기화, 트리거, 행을 휴식, 모양을 만들기 위해 다음과 같이 이벤트는, 내부 정보를 객체 :

IMG

原来event是一个Spring上下文初始化失败的异常事件对象,对象里包含了具体的异常信息,如箭头所指,关键异常信息如:

NoSuchMethodError:"org.springframework.util.ObjectUtils.unwrapOptional(Ljava/lang/Object;)Ljava/lang/Object;"

假设问题

通过上面的分析,基本定位到Spring boot应用启动卡住这个表象背后的真实原因了,而且也定位到了异常信息。

出现NoSuchMethodError异常,是因为调用方法的时候,找不到方法了。一般出现在两个有关联的jar包,但是版本对不上了,也就是常说的jar版本依赖冲突。查看了下,ObjectUtils是spring-core包里的一个类,当前的4.1.3版本确实没有这个unwrapOptional方法,spring-core-5.x的版本才新增了这个方法。因为之前的依赖是没有问题,为什么现在spring上下文会调用5.x的版本的方法呢?

所以先假设近期有开发在pom.xml里添加了新的的依赖,导致了这个问题。

小心求证

有了找问题的方向就好办了,因为代码都是git管理维护的,所以查看下pom.xml文件近期的提交记录即可,查看后,确实发现了近期对pom.xml有改动,添加了一个依赖:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>

여기에 또한 메이븐 우선 순위 문제를 의존 조금 포함 봄 boot1.5.7 봄 - context.4.1 함께 제공하더라도 말을하는 것입니다 pom.xml 파일 종속성 다른 항아리에 우선 pom.xml 파일에 직접 의존 추가 등 0.3 그러나 이러한 지정은, 최종 버전의 응용 프로그램이 아직 5.1.6을 사용합니다. 특정 메이븐 의존성, 당신은 내 블로그를 참조 할 수 있습니다 당신이 그것을 이해 뭔가 메이븐의 사용에 "? " . 바인딩 분석하기 전에, 아주 가까이 있기 때문에 확실히 문제가 아를 그려 봄 core.4.1.3와 함께이 문제 의존, 스프링 context.5.1.6에 의한 증가이다. 단순히 종속성을 제거하고 시작 시스템을 평소와 같이, 봄이 줄 텍스트를로드에 로그 정보를 인쇄 할 수 있습니다.

문제의 개요

핵심 문제는 문제를 해결하기 위해 스냅 샷 로그를 스레딩에 의해 충분한 비정상적인 상황의 부재에서 자바 스레드 스택의 지식을 찾을 수있다. 비정상적인 NoSuchMethodError 등의 문제를 배치 한 후, 일반적으로 문제의 근본 원인을 확인하기 위해 벤트 뒤로 다음, 문제의 실제 원인이 있다고 가정하는 경험을 필요가있다. 문제이 진보적 인 사고의 본질을 발견해야합니다. "봄 부팅 응용 프로그램 실행이 붙어"아무것도 발견되지 않지만, 때 충돌로 인해 병을 찾을 : 검색 엔진에 직접 이동하는 경우 예를 들어,이 문제는, 검색 할 수 있습니다. 검색 엔진으로 이동

"NoSuchMethodError :"org.springframework.util.ObjectUtils.unwrapOptional (Ljava / 랭 / 개체;) Ljava / 랭 / 개체; "". 내용이 많이있을 것입니다, 문제를 해결하기 쉽습니다.

게시 된 107 개 원래 기사 · 원 찬양 14 ·은 40000 +를 볼

추천

출처blog.csdn.net/belongtocode/article/details/103383096