package org.infinispan.client.hotrod.impl.operations; import java.net.SocketAddress; import java.util.concurrent.atomic.AtomicInteger; import org.infinispan.client.hotrod.configuration.ClientIntelligence; import org.infinispan.client.hotrod.event.ClientListenerNotifier; import org.infinispan.client.hotrod.impl.protocol.Codec; import org.infinispan.client.hotrod.impl.protocol.HeaderParams; import org.infinispan.client.hotrod.impl.protocol.HotRodConstants; import org.infinispan.client.hotrod.impl.transport.Transport; import org.infinispan.client.hotrod.impl.transport.TransportFactory; /** * Remove client listener operation. In order to avoid issues with concurrent * event consumption, removing client listener operation is sent in a separate * connection to the one used for event consumption, but it must go to the * same node where the listener has been added. * * @author Galder ZamarreƱo */ public class RemoveClientListenerOperation extends HotRodOperation { private final ClientListenerNotifier listenerNotifier; private final Object listener; protected final TransportFactory transportFactory; protected RemoveClientListenerOperation(Codec codec, TransportFactory transportFactory, byte[] cacheName, AtomicInteger topologyId, int flags, ClientIntelligence clientIntelligence, ClientListenerNotifier listenerNotifier, Object listener) { super(codec, flags, clientIntelligence, cacheName, topologyId); this.transportFactory = transportFactory; this.listenerNotifier = listenerNotifier; this.listener = listener; } @Override public Object execute() { byte[] listenerId = listenerNotifier.findListenerId(listener); if (listenerId != null) { SocketAddress address = listenerNotifier.findTransport(listenerId).getRemoteSocketAddress(); Transport transport = transportFactory.getAddressTransport(address); try { HeaderParams params = writeHeader(transport, REMOVE_CLIENT_LISTENER_REQUEST); transport.writeArray(listenerId); transport.flush(); short status = readHeaderAndValidate(transport, params); if (HotRodConstants.isSuccess(status) || HotRodConstants.isNotExecuted(status)) listenerNotifier.removeClientListener(listenerId); } finally { transportFactory.releaseTransport(transport); } } return null; } }