You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by GitBox <gi...@apache.org> on 2019/02/21 02:45:29 UTC

[GitHub] liangrongjie opened a new issue #1100: Rest over Servlet多profile情况下出现端口占用(Address already in use: JVM_Bind)

liangrongjie opened a new issue #1100: Rest over Servlet多profile情况下出现端口占用(Address already in use: JVM_Bind)
URL: https://github.com/apache/servicecomb-java-chassis/issues/1100
 
 
   环境:SpringBoot 1.5.19 + ServiceComb 1.1.0 + spring-boot-starter-transport
   ---
   
   基于spring-boot的多个测试用例使用了不同的profile,如下:
   * AuthorizationFileControllerTest.java
   ```java
   @RunWith(SpringRunner.class)
   @SpringBootTest(classes = Application.class, webEnvironment = DEFINED_PORT)
   @ActiveProfiles("db-h2")
   public class AuthorizationFileControllerTest {
   ```
   
   * AuthorizationFileControllerTest.java
   ```java
   @RunWith(SpringRunner.class)
   @SpringBootTest(classes = Application.class, webEnvironment = DEFINED_PORT)
   @ActiveProfiles("db-mysql")
   public class AreaInfoControllerTest {
   ```
   
   同时执行所有测试用例 `mvn surefire:test`的时候,出现如下错误:
   ```java
   
   java.lang.IllegalStateException: Failed to load ApplicationContext
   
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
   	at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:83)
   	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:117)
   	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
   	at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:44)
   	at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:230)
   	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:228)
   	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:287)
   	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
   	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:289)
   	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:247)
   	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
   	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
   	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
   	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
   	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
   	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
   	at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
   	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
   	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
   	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
   	at org.junit.runners.Suite.runChild(Suite.java:128)
   	at org.junit.runners.Suite.runChild(Suite.java:27)
   	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
   	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
   	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
   	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
   	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
   	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
   	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
   	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
   	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
   	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
   	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
   Caused by: org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
   	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:139)
   	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537)
   	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:124)
   	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
   	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
   	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
   	at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:121)
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
   	at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
   	... 33 more
   Caused by: org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat
   	at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.initialize(TomcatEmbeddedServletContainer.java:138)
   	at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer.<init>(TomcatEmbeddedServletContainer.java:87)
   	at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getTomcatEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:554)
   	at org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory.getEmbeddedServletContainer(TomcatEmbeddedServletContainerFactory.java:179)
   	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:166)
   	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:136)
   	... 41 more
   Caused by: javax.servlet.ServletException: java.net.BindException: Address already in use: JVM_Bind
   	at org.apache.servicecomb.springboot.starter.transport.RestServletInitializer.onStartup(RestServletInitializer.java:66)
   	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.selfInitialize(EmbeddedWebApplicationContext.java:226)
   	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.access$000(EmbeddedWebApplicationContext.java:90)
   	at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext$1.onStartup(EmbeddedWebApplicationContext.java:215)
   	at org.springframework.boot.context.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:55)
   	at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5196)
   	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
   	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
   	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
   	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
   	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
   	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
   	at java.lang.Thread.run(Thread.java:748)
   Caused by: java.net.BindException: Address already in use: JVM_Bind
   	at java.net.DualStackPlainSocketImpl.bind0(Native Method)
   	at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
   	at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
   	at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
   	at java.net.ServerSocket.bind(ServerSocket.java:375)
   	at java.net.ServerSocket.<init>(ServerSocket.java:237)
   	at org.apache.servicecomb.springboot.starter.transport.RestServletInitializer.onStartup(RestServletInitializer.java:57)
   	... 12 more
   ```
   
   Spring默认会按照`profile`创建多个`ApplicationContext`,不同的`ApplicationContext`中各自存在`RestServletInitializer`实例,其中的 onStartup()会重复执行,第二次执行的时候会出现java.net.BindException: Address already in use: JVM_Bind(猜测应该是在第一次执行的时候就启动了EmbeddedServletContainer的端口 LISTENING)
   
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services