Как поймать / захватить javax.net.ssl.SSLHandshakeException: не удалось создать SSL-соединение при отправке сообщения через java vert.x Eventbus

Я пытаюсь использовать SSL через шину событий. Чтобы проверить случай сбоя, я попытался отправить сообщение в шину событий из другой вершины в том же кластере, передав какое-то другое хранилище ключей.

Я получаю исключение ниже на консоли, но это не вызывает сбой replyHandler, поэтому мой код не может обнаружить исключение SSL.

мой код:

    eb.request("ping-address", "ping!", new DeliveryOptions(), reply -> {
                try {
                    if (reply.succeeded()) {
                        System.out.println("Received reply " + reply.result().body());
                    } else {

                        System.out.println("An exception " + reply.cause().getMessage());
                    }
                } catch (Exception e) {
                    System.out.println("An error occured" + e.getCause());

                }
            }); 

Исключение на консоли:

**javax.net.ssl.SSLHandshakeException: Failed to create SSL connection**
    at io.vertx.core.net.impl.ChannelProvider$1.userEventTriggered(ChannelProvider.java:109)
    at io.netty.channel.AbstractChannelHandlerContext.invokeUserEventTriggered(AbstractChannelHandlerContext.java:341)
    at io.netty.channel.AbstractChannelHandlerContext.invokeUserEventTriggered(AbstractChannelHandlerContext.java:327)
    at io.netty.channel.AbstractChannelHandlerContext.fireUserEventTriggered(AbstractChannelHandlerContext.java:319)
    at io.netty.handler.ssl.SslHandler.handleUnwrapThrowable(SslHandler.java:1249)
    at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1230)
    at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1271)
    at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505)
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:444)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:700)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:635)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:552)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:514)
    at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044)
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
    at java.lang.Thread.run(Thread.java:813)
Caused by: javax.net.ssl.SSLException: Received fatal alert: bad_certificate
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:208)
    at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1647)
    at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1615)
    at sun.security.ssl.SSLEngineImpl.recvAlert(SSLEngineImpl.java:1781)
    at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:1070)
    at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:896)
    at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:766)
    at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
    at io.netty.handler.ssl.SslHandler$SslEngineType$3.unwrap(SslHandler.java:282)
    at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1329)
    at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1224)
    ... 20 more

Но обработчик не работает по таймауту через 30 секунд. Истекло время ожидания ответа 30000 (мс). адрес: __vertx.reply.8419a431-d633-4ba8-a12e-c41fd5a4f37a, ответил адрес: ping-address

Я хочу немедленно зафиксировать исключение SSL и обработать его. Подскажите, пожалуйста, как я могу захватить / перехватить это исключение.

Я пробовал с кодом ниже. Ниже можно обработать исключение, и я не получаю результат ответа от вызванной шины событий. Результат ответа всегда равен нулю. (значение всегда равно нулю)

    MessageProducer<Object> ms = eb.sender("ping-address");

            ms.write("ping!", reply -> {

                if (reply.succeeded()) {
                    reply.map(value -> {
                        System.out.println("Received reply " + value);
                        return reply;
                    });
                } else {
                    System.out.println("No reply");
                    System.out.println("An exception : " + reply.cause().getMessage());
                }
            });

person Gyan    schedule 17.01.2020    source источник


Ответы (1)


Вы не можете поймать это исключение, потому что кластерная реализация EventBus Vert.x буферизует сообщения, когда узлы не соединены вместе. Сообщение может быть отправлено позже, если проблема носит временный характер.

Если вы хотите получать уведомление раньше, вы можете установить меньшее время ожидания в DeliveryOptions.

person tsegismont    schedule 17.01.2020