2016-03-31 10 views
0

konfigurierte ich einen Apache ftpserver wie folgt:"BindException: Adresse bereits in Verwendung" im Frühjahr mit Apache ftpserver

@Component 
public class FtpDummyServer { 

private FtpServer server; 

@PostConstruct 
public void init() throws FtpException { 
    ..some initialization 
    this.server = serverFactory.createServer(); 
    this.server.start(); 
} 

@PreDestroy 
public void stop() { 
    this.server.stop(); 
} 

Beachten Sie, dass der Server automatisch in der @PostConstruct gestartet wird. Ich habe verschiedene Tests in SpringBoot konfiguriert wie folgt:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = MainApplication.class) 
@WebIntegrationTest 
public class ApplicationTestX { 
... 
} 

Wenn ich die Tests einzeln ausführen, sind sie erfolgreich. Wenn ich sie jedoch zusammen laufen lasse, bekomme ich eine java.net.BindException: Address already in use: bind. Wie kann ich das vermeiden?

+0

Was ist der Umfang Ihrer FtpDummyServer? Ich denke, dass Sie den FtpDummyServer mehrmals in Ihrem Test injizieren, wenn ja, versuchen Sie, einen FtpDummyServer für alle Testfälle zu teilen. –

+0

Der FtpDummyServer hat die Annotation @ Komponent. Dies ist ein Singleton pro Fehler. –

+0

können Sie Ihre Testfälle veröffentlichen? –

Antwort

2

Für jeden Test wird ein FtpDummyServer erstellt. @PreDestroy wurde jedoch nie aufgerufen. @DirtiesContext löst das Problem.

2

Wenn Sie sich Stack Stack Trace anschauen, sehen Sie, welche Adresse der FTP-Server zu verwenden versucht. Smth wie

Verursacht durch: org.apache.ftpserver.FtpServerConfigurationException: Fehler binden 0.0.0.0/0.0.0.0:21 zu adressieren, überprüfen Konfiguration

Es kann passieren, weil:

  1. Eine andere Instanz Ihrer App verwendet die Adresse. Wenn ja, müssen Sie sie beenden.
  2. Ein anderer Prozess verwendet Adresse/Port. In diesem Fall können Sie den FTP-Server neu konfigurieren, um ihn an eine andere Adresse zu binden.

    FtpServerFactory serverFactory = new FtpServerFactory(); 
    
    ListenerFactory factory = new ListenerFactory(); 
    factory.setPort(2222); //use alternative port instead of default 21 
    serverFactory.addListener("default", factory.createListener()); 
    
    server = serverFactory.createServer(); 
    server.start(); 
    

Verwenden netstat Prozess-ID, um herauszufinden, die Adresse hält.

+0

Für jeden Test wird ein FtpDummyServer erstellt. "@ PreDestroy" wurde jedoch nie aufgerufen. '@ DirtiesContext' löst das Problem. –

+0

@ RenéWinkler Ich habe irgendwie übersehen, dass es Test war – Evgeny

0

Die Verwendung von @DirtiesContext mit @TestExecutionListeners funktioniert, aber vergessen Sie nicht, Ihren Kontext mit den Standardkontexten zusammenzuführen. Z. B:

@RunWith(SpringJUnit4ClassRunner.class) 
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) 
@TestExecutionListeners(value = {DirtiesContextTestExecutionListener.class}, mergeMode = MergeMode.MERGE_WITH_DEFAULTS) 
@SpringApplicationConfiguration(classes = MainApplication.class) 
@WebIntegrationTest 
public class ApplicationTestX { 
... 
} 

Werfen Sie einen Blick dort: Does Spring @DirtiesContext reload Spring context?

Verwandte Themen