CustomIOHandler.java

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

package com.azure.core.amqp.implementation.handler;

import com.azure.core.util.logging.ClientLogger;
import org.apache.qpid.proton.engine.Connection;
import org.apache.qpid.proton.engine.Event;
import org.apache.qpid.proton.engine.Transport;
import org.apache.qpid.proton.reactor.impl.IOHandler;

import static com.azure.core.amqp.implementation.ClientConstants.NOT_APPLICABLE;

public class CustomIOHandler extends IOHandler {
    private final ClientLogger logger = new ClientLogger(CustomIOHandler.class);
    private final String connectionId;

    public CustomIOHandler(final String connectionId) {
        this.connectionId = connectionId;
    }

    @Override
    public void onTransportClosed(Event event) {
        final Transport transport = event.getTransport();
        final Connection connection = event.getConnection();

        logger.info("onTransportClosed connectionId[{}], hostname[{}]",
            connectionId, (connection != null ? connection.getHostname() : NOT_APPLICABLE));

        if (transport != null && connection != null && connection.getTransport() != null) {
            transport.unbind();
        }
    }

    @Override
    public void onUnhandled(Event event) {
        // logger.verbose("Unhandled event: {}, {}", event.getEventType(), event);

        // There appears to be some race condition where it's possible to get a null selector key in proton-j.
        try {
            super.onUnhandled(event);
        } catch (NullPointerException e) {
            logger.error("Exception occurred when handling event in super.", e);
        }
    }
}