blob: 5c4c588d4d91c45993bf8079b2147660d692d4b6 [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
Mark Slee9f0c6512007-02-28 23:58:26 +000019
Mark Sleed788b2e2006-09-07 01:26:35 +000020#ifndef _THRIFT_SERVER_TSERVER_H_
21#define _THRIFT_SERVER_TSERVER_H_ 1
Mark Sleee8540632006-05-30 09:24:40 +000022
Marc Slemko16698852006-08-04 03:16:10 +000023#include <TProcessor.h>
Mark Sleed788b2e2006-09-07 01:26:35 +000024#include <transport/TServerTransport.h>
Mark Slee4af6ed72006-10-25 19:02:49 +000025#include <protocol/TBinaryProtocol.h>
Marc Slemko3ea00332006-08-17 01:11:13 +000026#include <concurrency/Thread.h>
Marc Slemko16698852006-08-04 03:16:10 +000027
28#include <boost/shared_ptr.hpp>
Mark Sleee8540632006-05-30 09:24:40 +000029
T Jake Lucianib5e62212009-01-31 22:36:20 +000030namespace apache { namespace thrift { namespace server {
Marc Slemko6f038a72006-08-03 18:58:09 +000031
T Jake Lucianib5e62212009-01-31 22:36:20 +000032using apache::thrift::TProcessor;
33using apache::thrift::protocol::TBinaryProtocolFactory;
34using apache::thrift::protocol::TProtocol;
35using apache::thrift::protocol::TProtocolFactory;
36using apache::thrift::transport::TServerTransport;
37using apache::thrift::transport::TTransport;
38using apache::thrift::transport::TTransportFactory;
Marc Slemko6f038a72006-08-03 18:58:09 +000039
Mark Sleee8540632006-05-30 09:24:40 +000040/**
Mark Sleeb4d3e7b2007-11-28 01:51:43 +000041 * Virtual interface class that can handle events from the server core. To
42 * use this you should subclass it and implement the methods that you care
43 * about. Your subclass can also store local data that you may care about,
44 * such as additional "arguments" to these methods (stored in the object
45 * instance's state).
46 */
47class TServerEventHandler {
48 public:
49
50 virtual ~TServerEventHandler() {}
51
52 /**
53 * Called before the server begins.
54 */
55 virtual void preServe() {}
56
57 /**
58 * Called when a new client has connected and is about to being processing.
59 */
Mark Sleea8de4892008-02-09 00:02:26 +000060 virtual void clientBegin(boost::shared_ptr<TProtocol> /* input */,
61 boost::shared_ptr<TProtocol> /* output */) {}
Mark Sleeb4d3e7b2007-11-28 01:51:43 +000062
63 /**
64 * Called when a client has finished making requests.
65 */
Mark Sleea8de4892008-02-09 00:02:26 +000066 virtual void clientEnd(boost::shared_ptr<TProtocol> /* input */,
67 boost::shared_ptr<TProtocol> /* output */) {}
Mark Sleeb4d3e7b2007-11-28 01:51:43 +000068
69 protected:
70
71 /**
72 * Prevent direct instantiation.
73 */
74 TServerEventHandler() {}
75
76};
77
78/**
Mark Sleee8540632006-05-30 09:24:40 +000079 * Thrift server.
80 *
Mark Sleee8540632006-05-30 09:24:40 +000081 */
Aditya Agarwald622e962006-10-11 02:42:49 +000082class TServer : public concurrency::Runnable {
Mark Sleeb4d3e7b2007-11-28 01:51:43 +000083 public:
84
Mark Sleee8540632006-05-30 09:24:40 +000085 virtual ~TServer() {}
Mark Slee4af6ed72006-10-25 19:02:49 +000086
Mark Slee794993d2006-09-20 01:56:10 +000087 virtual void serve() = 0;
Aditya Agarwald622e962006-10-11 02:42:49 +000088
Mark Slee6e3f6372007-03-01 22:05:46 +000089 virtual void stop() {}
90
Aditya Agarwald622e962006-10-11 02:42:49 +000091 // Allows running the server as a Runnable thread
Mark Slee4af6ed72006-10-25 19:02:49 +000092 virtual void run() {
93 serve();
94 }
Mark Sleeb4d3e7b2007-11-28 01:51:43 +000095
Mark Slee5ea15f92007-03-05 22:55:59 +000096 boost::shared_ptr<TProcessor> getProcessor() {
Mark Slee2f6404d2006-10-10 01:37:40 +000097 return processor_;
98 }
Aditya Agarwal1ea90522007-01-19 02:02:12 +000099
Mark Slee5ea15f92007-03-05 22:55:59 +0000100 boost::shared_ptr<TServerTransport> getServerTransport() {
Aditya Agarwal1ea90522007-01-19 02:02:12 +0000101 return serverTransport_;
102 }
103
Mark Slee5ea15f92007-03-05 22:55:59 +0000104 boost::shared_ptr<TTransportFactory> getInputTransportFactory() {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000105 return inputTransportFactory_;
106 }
107
Mark Slee5ea15f92007-03-05 22:55:59 +0000108 boost::shared_ptr<TTransportFactory> getOutputTransportFactory() {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000109 return outputTransportFactory_;
Aditya Agarwal1ea90522007-01-19 02:02:12 +0000110 }
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000111
Mark Slee5ea15f92007-03-05 22:55:59 +0000112 boost::shared_ptr<TProtocolFactory> getInputProtocolFactory() {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000113 return inputProtocolFactory_;
Mark Slee4af6ed72006-10-25 19:02:49 +0000114 }
115
Mark Slee5ea15f92007-03-05 22:55:59 +0000116 boost::shared_ptr<TProtocolFactory> getOutputProtocolFactory() {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000117 return outputProtocolFactory_;
118 }
Aditya Agarwal1ea90522007-01-19 02:02:12 +0000119
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000120 boost::shared_ptr<TServerEventHandler> getEventHandler() {
121 return eventHandler_;
122 }
123
Marc Slemko16698852006-08-04 03:16:10 +0000124protected:
Mark Slee5ea15f92007-03-05 22:55:59 +0000125 TServer(boost::shared_ptr<TProcessor> processor):
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000126 processor_(processor) {
Mark Slee5ea15f92007-03-05 22:55:59 +0000127 setInputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
128 setOutputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
129 setInputProtocolFactory(boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory()));
130 setOutputProtocolFactory(boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory()));
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000131 }
132
Mark Slee5ea15f92007-03-05 22:55:59 +0000133 TServer(boost::shared_ptr<TProcessor> processor,
134 boost::shared_ptr<TServerTransport> serverTransport):
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000135 processor_(processor),
136 serverTransport_(serverTransport) {
Mark Slee5ea15f92007-03-05 22:55:59 +0000137 setInputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
138 setOutputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
139 setInputProtocolFactory(boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory()));
140 setOutputProtocolFactory(boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory()));
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000141 }
142
Mark Slee5ea15f92007-03-05 22:55:59 +0000143 TServer(boost::shared_ptr<TProcessor> processor,
144 boost::shared_ptr<TServerTransport> serverTransport,
145 boost::shared_ptr<TTransportFactory> transportFactory,
146 boost::shared_ptr<TProtocolFactory> protocolFactory):
Mark Sleed788b2e2006-09-07 01:26:35 +0000147 processor_(processor),
148 serverTransport_(serverTransport),
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000149 inputTransportFactory_(transportFactory),
150 outputTransportFactory_(transportFactory),
151 inputProtocolFactory_(protocolFactory),
152 outputProtocolFactory_(protocolFactory) {}
Mark Sleed788b2e2006-09-07 01:26:35 +0000153
Mark Slee5ea15f92007-03-05 22:55:59 +0000154 TServer(boost::shared_ptr<TProcessor> processor,
155 boost::shared_ptr<TServerTransport> serverTransport,
156 boost::shared_ptr<TTransportFactory> inputTransportFactory,
157 boost::shared_ptr<TTransportFactory> outputTransportFactory,
158 boost::shared_ptr<TProtocolFactory> inputProtocolFactory,
159 boost::shared_ptr<TProtocolFactory> outputProtocolFactory):
Mark Slee4af6ed72006-10-25 19:02:49 +0000160 processor_(processor),
161 serverTransport_(serverTransport),
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000162 inputTransportFactory_(inputTransportFactory),
163 outputTransportFactory_(outputTransportFactory),
164 inputProtocolFactory_(inputProtocolFactory),
165 outputProtocolFactory_(outputProtocolFactory) {}
Mark Slee4af6ed72006-10-25 19:02:49 +0000166
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000167
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000168 // Class variables
Mark Slee5ea15f92007-03-05 22:55:59 +0000169 boost::shared_ptr<TProcessor> processor_;
170 boost::shared_ptr<TServerTransport> serverTransport_;
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000171
Mark Slee5ea15f92007-03-05 22:55:59 +0000172 boost::shared_ptr<TTransportFactory> inputTransportFactory_;
173 boost::shared_ptr<TTransportFactory> outputTransportFactory_;
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000174
Mark Slee5ea15f92007-03-05 22:55:59 +0000175 boost::shared_ptr<TProtocolFactory> inputProtocolFactory_;
176 boost::shared_ptr<TProtocolFactory> outputProtocolFactory_;
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000177
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000178 boost::shared_ptr<TServerEventHandler> eventHandler_;
179
David Reissef22dc62007-11-30 20:38:49 +0000180public:
Mark Slee5ea15f92007-03-05 22:55:59 +0000181 void setInputTransportFactory(boost::shared_ptr<TTransportFactory> inputTransportFactory) {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000182 inputTransportFactory_ = inputTransportFactory;
183 }
184
Mark Slee5ea15f92007-03-05 22:55:59 +0000185 void setOutputTransportFactory(boost::shared_ptr<TTransportFactory> outputTransportFactory) {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000186 outputTransportFactory_ = outputTransportFactory;
187 }
188
Mark Slee5ea15f92007-03-05 22:55:59 +0000189 void setInputProtocolFactory(boost::shared_ptr<TProtocolFactory> inputProtocolFactory) {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000190 inputProtocolFactory_ = inputProtocolFactory;
191 }
192
Mark Slee5ea15f92007-03-05 22:55:59 +0000193 void setOutputProtocolFactory(boost::shared_ptr<TProtocolFactory> outputProtocolFactory) {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000194 outputProtocolFactory_ = outputProtocolFactory;
195 }
196
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000197 void setServerEventHandler(boost::shared_ptr<TServerEventHandler> eventHandler) {
198 eventHandler_ = eventHandler;
199 }
200
Mark Sleee8540632006-05-30 09:24:40 +0000201};
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000202
veeve01d187c2008-02-26 05:12:08 +0000203/**
204 * Helper function to increase the max file descriptors limit
205 * for the current process and all of its children.
206 * By default, tries to increase it to as much as 2^24.
207 */
208 int increase_max_fds(int max_fds=(1<<24));
209
210
T Jake Lucianib5e62212009-01-31 22:36:20 +0000211}}} // apache::thrift::server
Marc Slemko6f038a72006-08-03 18:58:09 +0000212
Mark Sleed788b2e2006-09-07 01:26:35 +0000213#endif // #ifndef _THRIFT_SERVER_TSERVER_H_