1

My project is spring boot with embedded mongo, when i run my application it is it is working fine, but if i stop my application and start again it is giving below exception.

If i start my spring boot application 2nd time i am getting below exception If i run 3rd time its working fine again.

    java.io.IOException: Could not start process: failed errno:48 Address already in use for socket: 127.0.0.1:27017
    2018-01-06T10:24:07.899+0530 E NETWORK  [initandlisten]   addr already in use
    2018-01-06T10:24:07.899+0530 E STORAGE  [initandlisten] Failed to set up sockets during startup.
    2018-01-06T10:24:07.899+0
        at de.flapdoodle.embed.mongo.AbstractMongoProcess.onAfterProcessStart(AbstractMongoProcess.java:79) [de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.process.runtime.AbstractProcess.<init>(AbstractProcess.java:114) ~[de.flapdoodle.embed.process-1.50.0.jar:na]
        at de.flapdoodle.embed.mongo.AbstractMongoProcess.<init>(AbstractMongoProcess.java:53) [de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.mongo.MongodProcess.<init>(MongodProcess.java:50) [de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:44) [de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:34) [de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.process.runtime.Executable.start(Executable.java:101) [de.flapdoodle.embed.process-1.50.0.jar:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1719) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1656) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1585) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:554) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759) [spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) [spring-context-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) [spring-context-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) [spring-boot-1.4.5.RELEASE.jar:1.4.5.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) [spring-boot-1.4.5.RELEASE.jar:1.4.5.RELEASE]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372) [spring-boot-1.4.5.RELEASE.jar:1.4.5.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) [spring-boot-1.4.5.RELEASE.jar:1.4.5.RELEASE]
        at com.reputation.r4e.integrator.IntegratorMain.main(IntegratorMain.java:36) [classes/:na]
    [r4e-integrator][2018-01-06 10:24:07,908][main]          [INFO ][AbstractProcess.<init>:118] construct de.flapdoodle.embed.mongo.config.MongodConfigBuilder$ImmutableMongodConfig@4fbebd8e - [] - [] 
    [r4e-integrator][2018-01-06 10:24:08,013][main]          [WARN ][AbstractApplicationContext.refresh:550] Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embeddedMongoServer' defined in class path resource [org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]: Invocation of init method failed; nested exception is java.io.IOException: Could not start process: failed errno:48 Address already in use for socket: 127.0.0.1:27017
    2018-01-06T10:24:07.899+0530 E NETWORK  [initandlisten]   addr already in use
    2018-01-06T10:24:07.899+0530 E STORAGE  [initandlisten] Failed to set up sockets during startup.
    2018-01-06T10:24:07.899+0 - [] - [] 
    [r4e-integrator][2018-01-06 10:24:08,020][main]          [INFO ][DirectJDKLog.log:179] Stopping service Tomcat - [] - [] 
    [r4e-integrator][2018-01-06 10:24:08,034][main]          [WARN ][SpringApplicationRunListeners.callFinishedListener:91] Error handling failed (ch.qos.logback.classic.LoggerContext.removeObject(Ljava/lang/String;)V) - [] - [] 
    [r4e-integrator][2018-01-06 10:24:08,040][main]          [ERROR][SpringApplication.reportFailure:840] Application startup failed - [] - [] 
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embeddedMongoServer' defined in class path resource [org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]: Invocation of init method failed; nested exception is java.io.IOException: Could not start process: failed errno:48 Address already in use for socket: 127.0.0.1:27017
    2018-01-06T10:24:07.899+0530 E NETWORK  [initandlisten]   addr already in use
    2018-01-06T10:24:07.899+0530 E STORAGE  [initandlisten] Failed to set up sockets during startup.
    2018-01-06T10:24:07.899+0
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1589) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:554) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.4.5.RELEASE.jar:1.4.5.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) ~[spring-boot-1.4.5.RELEASE.jar:1.4.5.RELEASE]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:372) ~[spring-boot-1.4.5.RELEASE.jar:1.4.5.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-1.4.5.RELEASE.jar:1.4.5.RELEASE]
        at com.reputation.r4e.integrator.IntegratorMain.main(IntegratorMain.java:36) [classes/:na]
    Caused by: java.io.IOException: Could not start process: failed errno:48 Address already in use for socket: 127.0.0.1:27017
    2018-01-06T10:24:07.899+0530 E NETWORK  [initandlisten]   addr already in use
    2018-01-06T10:24:07.899+0530 E STORAGE  [initandlisten] Failed to set up sockets during startup.
    2018-01-06T10:24:07.899+0
        at de.flapdoodle.embed.mongo.AbstractMongoProcess.onAfterProcessStart(AbstractMongoProcess.java:79) ~[de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.process.runtime.AbstractProcess.<init>(AbstractProcess.java:114) ~[de.flapdoodle.embed.process-1.50.0.jar:na]
        at de.flapdoodle.embed.mongo.AbstractMongoProcess.<init>(AbstractMongoProcess.java:53) ~[de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.mongo.MongodProcess.<init>(MongodProcess.java:50) ~[de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:44) ~[de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.mongo.MongodExecutable.start(MongodExecutable.java:34) ~[de.flapdoodle.embed.mongo-1.50.0.jar:na]
        at de.flapdoodle.embed.process.runtime.Executable.start(Executable.java:101) ~[de.flapdoodle.embed.process-1.50.0.jar:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_121]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_121]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_121]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_121]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1719) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1656) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1585) ~[spring-beans-4.3.5.RELEASE.jar:4.3.5.RELEASE]
        ... 14 common frames omitted

this issue is coming in eclipse only, if use intillij it is working fine

How to resolve this issue.

trinath
  • 433
  • 1
  • 5
  • 19
  • It seems to be a bug in psring boot embedded mongo implementation. Please check the following thread to try different workarounds provided and use the one which works for you. https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/issues/176 – akshaya pandey Jan 06 '18 at 07:01

1 Answers1

4

Spring by default creates a new Application Context for each test class.

It seems that a new instance of the Embedded Mongo server is also started, but for some reason, the required port is still in use by the instance from a previous test.

As a workaround, I now use the @contextconfiguration annotation to only load Mongo in a single (integration) test class and not in the others.

Use @DirtiesContext to force a reset. For example:

@ContextConfiguration(classes={BlahTestConfig.class})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public class SomeTest {

@Autowired XXXX xx;
@Autowired YYYY yy;

@Before
public void setUp() {
    MockitoAnnotations.initMocks(this);
    when(YYYY.newYY()).thenReturn(zz);
}

@Test
public void testSomeTest() {
    XX.changeSomething("StringTest");
    XX.doSomething();
    check_for_effects();
}

@Test
public void testSomeOtherTest() {
    XX.changeSomething("SomeotherString");
    XX.doSomething();
    check_for_effects();
}

DirtiesContext Indicates that the underlying Spring ApplicationContext has been dirtied (modified)as follows during the execution of a test and should be closed, regardless of whether the test passed:

  • After the current test class, when declared on a class with class mode set to AFTER_CLASS, which is the default class mode.

  • After each test method in the current test class, when declared on a class with class mode set to AFTER_EACH_TEST_METHOD.

  • After the current test, when declared on a method.

In a JUnit 3.8 environment @DirtiesContext is only supported on methods and thus not at the class level.



REFERENCE 1: https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/issues/176

REFERENCE 2: https://stackoverflow.com/a/15948370/4227658