blob: d324e4b3fbd9e5cb10b32d4cd7c2ed49b1acf530 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
#ifndef _ACTIVEMQ_TRANSPORT_CORRELATOR_RESPONSECORRELATOR_H_
#define _ACTIVEMQ_TRANSPORT_CORRELATOR_RESPONSECORRELATOR_H_
#include <activemq/util/Config.h>
#include <activemq/transport/TransportFilter.h>
#include <activemq/transport/ResponseCallback.h>
#include <activemq/transport/FutureResponse.h>
#include <activemq/commands/Command.h>
#include <activemq/commands/Response.h>
#include <decaf/lang/Exception.h>
#include <decaf/lang/Pointer.h>
namespace activemq {
namespace transport {
namespace correlator {
using decaf::lang::Pointer;
using activemq::commands::Command;
using activemq::commands::Response;
class CorrelatorData;
/**
* This type of transport filter is responsible for correlating asynchronous responses
* with requests. Non-response messages are simply sent directly to the CommandListener.
* It owns the transport that it
*/
class AMQCPP_API ResponseCorrelator : public TransportFilter {
private:
CorrelatorData* impl;
private:
ResponseCorrelator(const ResponseCorrelator&);
ResponseCorrelator& operator= (const ResponseCorrelator&);
public:
/**
* Creates a new ResponseCorrelator transport filter that wraps the given transport.
*
* @param next
* the next transport in the chain
*
* @throws NullPointerException if next if NULL.
*/
ResponseCorrelator(Pointer<Transport> next);
virtual ~ResponseCorrelator();
public: // Transport Methods
virtual void oneway(const Pointer<Command> command);
virtual Pointer<FutureResponse> asyncRequest(const Pointer<Command> command,
const Pointer<ResponseCallback> responseCallback);
virtual Pointer<Response> request(const Pointer<Command> command);
virtual Pointer<Response> request(const Pointer<Command> command, unsigned int timeout);
/**
* This is called in the context of the nested transport's reading thread. In
* the case of a response object, updates the request map and notifies those
* waiting on the response. Non-response messages are just delegated to the
* command listener.
*
* @param command
* The received from the nested transport.
*/
virtual void onCommand(const Pointer<Command> command);
/**
* Event handler for an exception from a command transport.
*
* @param source
* The source of the exception.
* @param ex
* The exception that was caught.
*/
virtual void onException(const decaf::lang::Exception& ex);
protected:
virtual void doClose();
private:
void dispose(Pointer<decaf::lang::Exception> ex);
};
}}}
#endif /*_ACTIVEMQ_TRANSPORT_CORRELATOR_RESPONSECORRELATOR_H_*/