Убедитесь, что соединение с rabbitmq всегда открыто в приложении JAX-RS - PullRequest
0 голосов
/ 12 марта 2020

Я работаю над приложением JAX-RS, используя Джерси. Приложение принимает входящие запросы и передает их на rabbitmq. При запуске приложения я использую HK2, чтобы внедрить мой Connection, завернутый в ExchangePublisher, как синглтон, в мой ресурс, используя реализацию Factory. Однако, если бы я потерял соединение (например, перезапускается rabbitmq), в настоящее время нет простого способа перезапустить его.

Как я могу правильно внедрить свой класс ExchangePublisher таким образом, чтобы я мог проверить для каждого запроса, если соединение все еще открыто?

public class ExchangeResource {
    @Inject
    ExchangePublisher publisher;

    @POST
    @Path("nexo")
    public Response nexo(String message) {
        publisher.publish(message);
        return Response.ok().build();
    }
}
public class ExchangePublisherBinder extends AbstractBinder {
    @Override
    protected void configure() {
        bindFactory(ExchangePublisherFactory.class).to(ExchangePublisher.class).in(Immediate.class);
    }
}
public class ExchangePublisherFactory implements Factory<ExchangePublisher> {

    @Override
    public ExchangePublisher provide() {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("172.17.126.143");
        factory.setUsername("username");
        factory.setPassword("password");
        Connection connection = null;
        try {
            connection = factory.newConnection();
        } catch (IOException | TimeoutException e) {
            // some logging here
        }
        return new ExchangePublisher(connection);

    }

    @Override
    public void dispose(ExchangePublisher publisher) {
        try {
            publisher.closeConnection();
        } catch (IOException e) {
            // some logging here
        }
    }
}
...