Удалите нить на отключение tomcat приложения JAX-RS (Джерси) - PullRequest
0 голосов
/ 24 марта 2020

Я создаю приложение JAX-RS на Джерси 2.30. Я запускаю соединение Rabbit-MQ и использую AbstractBinder, чтобы иметь возможность вводить его в нескольких местах и ​​поддерживать соединение в фоновом режиме. Когда я закрываю приложение, я не могу найти способ закрыть соединение. Кажется, что метод dispose не вызывается.

Когда я закрываю tomcat, поток остается живым и препятствует выходу JVM. Как я могу закрыть соединение при выгрузке веб-приложения (в основном, когда Tomcat выключается)?

public class ConnectionBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bindFactory(ConnectionFactoryWrapper.class).to(Connection.class);
    }
}
public class ConnectionFactoryWrapper implements DisposableSupplier<Connection> {
    private static final Logger LOG = LogManager.getLogger(ConnectionFactoryWrapper.class);

    @Override
    public void dispose(Connection connection) {
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (IOException e) {
            LOG.fatal("Failed to close connection to broker: " + e.getMessage());
        }
    }

    @Override
    public Connection get() {
        ConnectionFactory factory = new ConnectionFactory();
        // here we do some config for username and pw

        try {
            return factory.newConnection();
        } catch (IOException | TimeoutException e) {
            LOG.fatal("Failed to open connection: " + e.getMessage());
        }
        return null;
    }
}
@ApplicationPath("app")
public class BrokerApplication extends ResourceConfig {

    public BrokerApplication() {
        ///...

        register(new ConnectionBinder());

        ///...

        packages("x.x.x.broker.resources");
    }
}
...