mercredi 22 juillet 2020

Spring SmartLifecycle never stopped when using maven test to run @Test (TestNg)

I write a SmartLifecycle to start a grpc server:

public class GrpcServerLifecycle implements SmartLifecycle {

    private static final Logger logger = LoggerFactory.getLogger(GrpcServerLifecycle.class);

    @Resource
    private GrpcServerManager grpcServerManager;

    private volatile boolean runState = false;

    @Override
    public synchronized void start() {
        logger.info("Start all gRPC server");
        grpcServerManager.startAll();
        runState = true;
    }

    @Override
    public synchronized void stop() {
        logger.info("Stop all gRPC server");
        grpcServerManager.stopAll();
        runState = false;
        
    }

    @Override
    public boolean isRunning() {
        return runState;
    }
}

The startAll method use a thread to await termination (run as blocking until interuppted):

new Thread(() -> {
                try {
                    server.awaitTermination();
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                } finally {
                    server.shutdown();
                }
            }).start();

When my spring application starts, the grpc server starts.

But, when I write some tests, and use maven clean install, it failed!

The first test was succeed, but second was failed, and third, forth, rest...

The cause is very clear: address binded. That means, maven test start more than one grpc server,
stop method of GrpcServerLifecycle was never called.

Why and how to solve this? I use AbstractTestNGSpringContextTests

Aucun commentaire:

Enregistrer un commentaire