blob: 99e2205fd1626550c8fd78cdcd47ae419206f94d [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 */
David Reiss23248712010-10-06 17:10:08 +000060 virtual void* createContext(boost::shared_ptr<TProtocol> input,
61 boost::shared_ptr<TProtocol> output) {
62 (void)input;
63 (void)output;
64 return NULL;
65 }
Mark Sleeb4d3e7b2007-11-28 01:51:43 +000066
67 /**
David Reiss23248712010-10-06 17:10:08 +000068 * Called when a client has finished request-handling to delete server
69 * context.
Mark Sleeb4d3e7b2007-11-28 01:51:43 +000070 */
David Reiss23248712010-10-06 17:10:08 +000071 virtual void deleteContext(void* serverContext,
72 boost::shared_ptr<TProtocol>input,
73 boost::shared_ptr<TProtocol>output) {
74 (void)serverContext;
75 (void)input;
76 (void)output;
77 }
78
79 /**
80 * Called when a client is about to call the processor.
81 */
82 virtual void processContext(void* serverContext,
83 boost::shared_ptr<TTransport> transport) {
84 (void)serverContext;
85 (void)transport;
86}
Mark Sleeb4d3e7b2007-11-28 01:51:43 +000087
88 protected:
89
90 /**
91 * Prevent direct instantiation.
92 */
93 TServerEventHandler() {}
94
95};
96
97/**
Mark Sleee8540632006-05-30 09:24:40 +000098 * Thrift server.
99 *
Mark Sleee8540632006-05-30 09:24:40 +0000100 */
Aditya Agarwald622e962006-10-11 02:42:49 +0000101class TServer : public concurrency::Runnable {
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000102 public:
103
Mark Sleee8540632006-05-30 09:24:40 +0000104 virtual ~TServer() {}
Mark Slee4af6ed72006-10-25 19:02:49 +0000105
Mark Slee794993d2006-09-20 01:56:10 +0000106 virtual void serve() = 0;
Aditya Agarwald622e962006-10-11 02:42:49 +0000107
Mark Slee6e3f6372007-03-01 22:05:46 +0000108 virtual void stop() {}
109
Aditya Agarwald622e962006-10-11 02:42:49 +0000110 // Allows running the server as a Runnable thread
Mark Slee4af6ed72006-10-25 19:02:49 +0000111 virtual void run() {
112 serve();
113 }
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000114
Bryan Duxbury6dd9cd02011-09-01 18:06:20 +0000115 boost::shared_ptr<TProcessorFactory> getProcessorFactory() {
116 return processorFactory_;
Mark Slee2f6404d2006-10-10 01:37:40 +0000117 }
Aditya Agarwal1ea90522007-01-19 02:02:12 +0000118
Mark Slee5ea15f92007-03-05 22:55:59 +0000119 boost::shared_ptr<TServerTransport> getServerTransport() {
Aditya Agarwal1ea90522007-01-19 02:02:12 +0000120 return serverTransport_;
121 }
122
Mark Slee5ea15f92007-03-05 22:55:59 +0000123 boost::shared_ptr<TTransportFactory> getInputTransportFactory() {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000124 return inputTransportFactory_;
125 }
126
Mark Slee5ea15f92007-03-05 22:55:59 +0000127 boost::shared_ptr<TTransportFactory> getOutputTransportFactory() {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000128 return outputTransportFactory_;
Aditya Agarwal1ea90522007-01-19 02:02:12 +0000129 }
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000130
Mark Slee5ea15f92007-03-05 22:55:59 +0000131 boost::shared_ptr<TProtocolFactory> getInputProtocolFactory() {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000132 return inputProtocolFactory_;
Mark Slee4af6ed72006-10-25 19:02:49 +0000133 }
134
Mark Slee5ea15f92007-03-05 22:55:59 +0000135 boost::shared_ptr<TProtocolFactory> getOutputProtocolFactory() {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000136 return outputProtocolFactory_;
137 }
Aditya Agarwal1ea90522007-01-19 02:02:12 +0000138
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000139 boost::shared_ptr<TServerEventHandler> getEventHandler() {
140 return eventHandler_;
141 }
142
Marc Slemko16698852006-08-04 03:16:10 +0000143protected:
Bryan Duxbury7a9fb812011-09-01 18:31:53 +0000144 template<typename ProcessorFactory>
145 TServer(const boost::shared_ptr<TProcessorFactory>& processorFactory,
146 THRIFT_OVERLOAD_IF(ProcessorFactory, TProcessorFactory)):
147 processorFactory_(processorFactory_) {
148 setInputTransportFactory(boost::shared_ptr<TTransportFactory>(
149 new TTransportFactory()));
150 setOutputTransportFactory(boost::shared_ptr<TTransportFactory>(
151 new TTransportFactory()));
152 setInputProtocolFactory(boost::shared_ptr<TProtocolFactory>(
153 new TBinaryProtocolFactory()));
154 setOutputProtocolFactory(boost::shared_ptr<TProtocolFactory>(
155 new TBinaryProtocolFactory()));
156 }
157
158 template<typename Processor>
159 TServer(const boost::shared_ptr<Processor>& processor,
160 THRIFT_OVERLOAD_IF(Processor, TProcessor)):
Bryan Duxbury6dd9cd02011-09-01 18:06:20 +0000161 processorFactory_(new TSingletonProcessorFactory(processor)) {
Mark Slee5ea15f92007-03-05 22:55:59 +0000162 setInputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
163 setOutputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
164 setInputProtocolFactory(boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory()));
165 setOutputProtocolFactory(boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory()));
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000166 }
167
Bryan Duxbury7a9fb812011-09-01 18:31:53 +0000168 template<typename ProcessorFactory>
169 TServer(const boost::shared_ptr<TProcessorFactory>& processorFactory,
170 const boost::shared_ptr<TServerTransport>& serverTransport,
171 THRIFT_OVERLOAD_IF(ProcessorFactory, TProcessorFactory)):
172 processorFactory_(processorFactory),
173 serverTransport_(serverTransport) {
174 setInputTransportFactory(boost::shared_ptr<TTransportFactory>(
175 new TTransportFactory()));
176 setOutputTransportFactory(boost::shared_ptr<TTransportFactory>(
177 new TTransportFactory()));
178 setInputProtocolFactory(boost::shared_ptr<TProtocolFactory>(
179 new TBinaryProtocolFactory()));
180 setOutputProtocolFactory(boost::shared_ptr<TProtocolFactory>(
181 new TBinaryProtocolFactory()));
182 }
183
184 template<typename Processor>
185 TServer(const boost::shared_ptr<Processor>& processor,
186 const boost::shared_ptr<TServerTransport>& serverTransport,
187 THRIFT_OVERLOAD_IF(Processor, TProcessor)):
Bryan Duxbury6dd9cd02011-09-01 18:06:20 +0000188 processorFactory_(new TSingletonProcessorFactory(processor)),
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000189 serverTransport_(serverTransport) {
Mark Slee5ea15f92007-03-05 22:55:59 +0000190 setInputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
191 setOutputTransportFactory(boost::shared_ptr<TTransportFactory>(new TTransportFactory()));
192 setInputProtocolFactory(boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory()));
193 setOutputProtocolFactory(boost::shared_ptr<TProtocolFactory>(new TBinaryProtocolFactory()));
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000194 }
195
Bryan Duxbury7a9fb812011-09-01 18:31:53 +0000196 template<typename ProcessorFactory>
197 TServer(const boost::shared_ptr<ProcessorFactory>& processorFactory,
198 const boost::shared_ptr<TServerTransport>& serverTransport,
199 const boost::shared_ptr<TTransportFactory>& transportFactory,
200 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
201 THRIFT_OVERLOAD_IF(ProcessorFactory, TProcessorFactory)):
202 processorFactory_(processorFactory),
203 serverTransport_(serverTransport),
204 inputTransportFactory_(transportFactory),
205 outputTransportFactory_(transportFactory),
206 inputProtocolFactory_(protocolFactory),
207 outputProtocolFactory_(protocolFactory) {}
208
209 template<typename Processor>
210 TServer(const boost::shared_ptr<Processor>& processor,
211 const boost::shared_ptr<TServerTransport>& serverTransport,
212 const boost::shared_ptr<TTransportFactory>& transportFactory,
213 const boost::shared_ptr<TProtocolFactory>& protocolFactory,
214 THRIFT_OVERLOAD_IF(Processor, TProcessor)):
Bryan Duxbury6dd9cd02011-09-01 18:06:20 +0000215 processorFactory_(new TSingletonProcessorFactory(processor)),
Mark Sleed788b2e2006-09-07 01:26:35 +0000216 serverTransport_(serverTransport),
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000217 inputTransportFactory_(transportFactory),
218 outputTransportFactory_(transportFactory),
219 inputProtocolFactory_(protocolFactory),
220 outputProtocolFactory_(protocolFactory) {}
Mark Sleed788b2e2006-09-07 01:26:35 +0000221
Bryan Duxbury7a9fb812011-09-01 18:31:53 +0000222 template<typename ProcessorFactory>
223 TServer(const boost::shared_ptr<ProcessorFactory>& processorFactory,
224 const boost::shared_ptr<TServerTransport>& serverTransport,
225 const boost::shared_ptr<TTransportFactory>& inputTransportFactory,
226 const boost::shared_ptr<TTransportFactory>& outputTransportFactory,
227 const boost::shared_ptr<TProtocolFactory>& inputProtocolFactory,
228 const boost::shared_ptr<TProtocolFactory>& outputProtocolFactory,
229 THRIFT_OVERLOAD_IF(ProcessorFactory, TProcessorFactory)):
230 processorFactory_(processorFactory_),
231 serverTransport_(serverTransport),
232 inputTransportFactory_(inputTransportFactory),
233 outputTransportFactory_(outputTransportFactory),
234 inputProtocolFactory_(inputProtocolFactory),
235 outputProtocolFactory_(outputProtocolFactory) {}
236
237 template<typename Processor>
238 TServer(const boost::shared_ptr<Processor>& processor,
239 const boost::shared_ptr<TServerTransport>& serverTransport,
240 const boost::shared_ptr<TTransportFactory>& inputTransportFactory,
241 const boost::shared_ptr<TTransportFactory>& outputTransportFactory,
242 const boost::shared_ptr<TProtocolFactory>& inputProtocolFactory,
243 const boost::shared_ptr<TProtocolFactory>& outputProtocolFactory,
244 THRIFT_OVERLOAD_IF(Processor, TProcessor)):
Bryan Duxbury6dd9cd02011-09-01 18:06:20 +0000245 processorFactory_(new TSingletonProcessorFactory(processor)),
Mark Slee4af6ed72006-10-25 19:02:49 +0000246 serverTransport_(serverTransport),
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000247 inputTransportFactory_(inputTransportFactory),
248 outputTransportFactory_(outputTransportFactory),
249 inputProtocolFactory_(inputProtocolFactory),
250 outputProtocolFactory_(outputProtocolFactory) {}
Mark Slee4af6ed72006-10-25 19:02:49 +0000251
Bryan Duxbury6dd9cd02011-09-01 18:06:20 +0000252 /**
253 * Get a TProcessor to handle calls on a particular connection.
254 *
255 * This method should only be called once per connection (never once per
256 * call). This allows the TProcessorFactory to return a different processor
257 * for each connection if it desires.
258 */
259 boost::shared_ptr<TProcessor> getProcessor(
260 boost::shared_ptr<TProtocol> inputProtocol,
261 boost::shared_ptr<TProtocol> outputProtocol,
262 boost::shared_ptr<TTransport> transport) {
263 TConnectionInfo connInfo;
264 connInfo.input = inputProtocol;
265 connInfo.output = outputProtocol;
266 connInfo.transport = transport;
267 return processorFactory_->getProcessor(connInfo);
268 }
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000269
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000270 // Class variables
Bryan Duxbury6dd9cd02011-09-01 18:06:20 +0000271 boost::shared_ptr<TProcessorFactory> processorFactory_;
Mark Slee5ea15f92007-03-05 22:55:59 +0000272 boost::shared_ptr<TServerTransport> serverTransport_;
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000273
Mark Slee5ea15f92007-03-05 22:55:59 +0000274 boost::shared_ptr<TTransportFactory> inputTransportFactory_;
275 boost::shared_ptr<TTransportFactory> outputTransportFactory_;
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000276
Mark Slee5ea15f92007-03-05 22:55:59 +0000277 boost::shared_ptr<TProtocolFactory> inputProtocolFactory_;
278 boost::shared_ptr<TProtocolFactory> outputProtocolFactory_;
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000279
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000280 boost::shared_ptr<TServerEventHandler> eventHandler_;
281
David Reissef22dc62007-11-30 20:38:49 +0000282public:
Mark Slee5ea15f92007-03-05 22:55:59 +0000283 void setInputTransportFactory(boost::shared_ptr<TTransportFactory> inputTransportFactory) {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000284 inputTransportFactory_ = inputTransportFactory;
285 }
286
Mark Slee5ea15f92007-03-05 22:55:59 +0000287 void setOutputTransportFactory(boost::shared_ptr<TTransportFactory> outputTransportFactory) {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000288 outputTransportFactory_ = outputTransportFactory;
289 }
290
Mark Slee5ea15f92007-03-05 22:55:59 +0000291 void setInputProtocolFactory(boost::shared_ptr<TProtocolFactory> inputProtocolFactory) {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000292 inputProtocolFactory_ = inputProtocolFactory;
293 }
294
Mark Slee5ea15f92007-03-05 22:55:59 +0000295 void setOutputProtocolFactory(boost::shared_ptr<TProtocolFactory> outputProtocolFactory) {
Aditya Agarwal9abb0d62007-01-24 22:53:54 +0000296 outputProtocolFactory_ = outputProtocolFactory;
297 }
298
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000299 void setServerEventHandler(boost::shared_ptr<TServerEventHandler> eventHandler) {
300 eventHandler_ = eventHandler;
301 }
302
Mark Sleee8540632006-05-30 09:24:40 +0000303};
Mark Sleeb4d3e7b2007-11-28 01:51:43 +0000304
veeve01d187c2008-02-26 05:12:08 +0000305/**
306 * Helper function to increase the max file descriptors limit
307 * for the current process and all of its children.
308 * By default, tries to increase it to as much as 2^24.
309 */
310 int increase_max_fds(int max_fds=(1<<24));
311
312
T Jake Lucianib5e62212009-01-31 22:36:20 +0000313}}} // apache::thrift::server
Marc Slemko6f038a72006-08-03 18:58:09 +0000314
Mark Sleed788b2e2006-09-07 01:26:35 +0000315#endif // #ifndef _THRIFT_SERVER_TSERVER_H_