/*
* Copyright (C) 2012-2016 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.facebook.nifty.client;
import com.facebook.nifty.duplex.TDuplexProtocolFactory;
import org.apache.thrift.TException;
import org.jboss.netty.buffer.ChannelBuffer;
public interface RequestChannel
{
/**
* Sends a single message asynchronously, and notifies the {@link Listener}
* when the request is finished sending, when the response has arrived, and/or when an error
* occurs.
*
* @param request
* @param oneway
* @param listener
* @throws TException
*/
void sendAsynchronousRequest(final ChannelBuffer request,
final boolean oneway,
final Listener listener)
throws TException;
/**
* Closes the channel
*/
void close();
/**
* Checks whether the channel has encountered an error. This method is a shortcut for:
*
* <code>
* return (getError() != null);
* </code>
*
* @return {@code true} if the {@link RequestChannel} is broken
*/
boolean hasError();
/**
* Returns the {@link TException} representing the error the channel encountered, if any.
*
* @return An instance of {@link TException} or {@code null} if the channel is still good.
*/
TException getError();
/**
* Returns the {@link TDuplexProtocolFactory} that should be used by clients code to
* serialize messages for sending on this channel
*
* @return An instance of {@link TDuplexProtocolFactory}
*/
TDuplexProtocolFactory getProtocolFactory();
/**
* The listener interface that must be implemented for callback objects passed to
* {@link #sendAsynchronousRequest}
*/
public interface Listener {
/**
* This will be called when the request has successfully been written to the transport
* layer (e.g. socket)
*/
void onRequestSent();
/**
* This will be called when a full response to the request has been received
*
* @param message The response buffer
*/
void onResponseReceived(ChannelBuffer message);
/**
* This will be called if the channel encounters an error before the request is sent or
* before a response is received
*
* @param requestException A {@link TException} describing the problem that was encountered
*/
void onChannelError(TException requestException);
}
}