(* * 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. *) unit Multiplex.Server.Main; {$WARN SYMBOL_PLATFORM OFF} {.$DEFINE RunEndless} // activate to interactively stress-test the server stop routines via Ctrl+C interface uses Windows, SysUtils, Generics.Collections, Thrift.Server, Thrift.Transport, Thrift.Transport.Pipes, Thrift.Protocol, Thrift.Protocol.Multiplex, Thrift.Processor.Multiplex, Thrift.Collections, Thrift.Utils, Thrift, Benchmark, // in gen-delphi folder Aggr, // in gen-delphi folder Multiplex.Test.Common, ConsoleHelper, Contnrs; type TTestServer = class public type ITestHandler = interface ['{CAE09AAB-80FB-48E9-B3A8-7F9B96F5419A}'] procedure SetServer( const AServer : IServer ); end; protected type TTestHandlerImpl = class( TInterfacedObject, ITestHandler) private FServer : IServer; protected // ITestHandler procedure SetServer( const AServer : IServer ); property Server : IServer read FServer write SetServer; end; TBenchmarkServiceImpl = class( TTestHandlerImpl, TBenchmarkService.Iface) protected // TBenchmarkService.Iface function fibonacci(n: ShortInt): Integer; end; TAggrImpl = class( TTestHandlerImpl, TAggr.Iface) protected FList : IThriftList; // TAggr.Iface procedure addValue(value: Integer); function getValues(): IThriftList; public constructor Create; destructor Destroy; override; end; public class procedure Execute( const args: array of string); end; implementation { TTestServer.TTestHandlerImpl } procedure TTestServer.TTestHandlerImpl.SetServer( const AServer: IServer); begin FServer := AServer; end; { TTestServer.TBenchmarkServiceImpl } function TTestServer.TBenchmarkServiceImpl.fibonacci(n: ShortInt): Integer; var prev, next : Integer; begin prev := 0; result := 1; while n > 0 do begin next := result + prev; prev := result; result := next; Dec(n); end; end; { TTestServer.TAggrImpl } constructor TTestServer.TAggrImpl.Create; begin inherited Create; FList := TThriftListImpl.Create; end; destructor TTestServer.TAggrImpl.Destroy; begin try FreeAndNil( FList); finally inherited Destroy; end; end; procedure TTestServer.TAggrImpl.addValue(value: Integer); begin FList.Add( value); end; function TTestServer.TAggrImpl.getValues(): IThriftList; begin result := FList; end; { TTestServer } class procedure TTestServer.Execute( const args: array of string); var TransportFactory : ITransportFactory; ProtocolFactory : IProtocolFactory; ServerTrans : IServerTransport; benchHandler : TBenchmarkService.Iface; aggrHandler : TAggr.Iface; benchProcessor : IProcessor; aggrProcessor : IProcessor; multiplex : IMultiplexedProcessor; ServerEngine : IServer; begin try // create protocol factory, default to BinaryProtocol ProtocolFactory := TBinaryProtocolImpl.TFactory.Create( TRUE, TRUE); servertrans := TServerSocketImpl.Create( 9090, 0, FALSE); TransportFactory := TFramedTransportImpl.TFactory.Create; benchHandler := TBenchmarkServiceImpl.Create; benchProcessor := TBenchmarkService.TProcessorImpl.Create( benchHandler); aggrHandler := TAggrImpl.Create; aggrProcessor := TAggr.TProcessorImpl.Create( aggrHandler); multiplex := TMultiplexedProcessorImpl.Create; multiplex.RegisterProcessor( NAME_BENCHMARKSERVICE, benchProcessor); multiplex.RegisterProcessor( NAME_AGGR, aggrProcessor); ServerEngine := TSimpleServer.Create( multiplex, ServerTrans, TransportFactory, ProtocolFactory); (benchHandler as ITestHandler).SetServer( ServerEngine); (aggrHandler as ITestHandler).SetServer( ServerEngine); Console.WriteLine('Starting the server ...'); ServerEngine.serve(); (benchHandler as ITestHandler).SetServer( nil); (aggrHandler as ITestHandler).SetServer( nil); except on E: Exception do begin Console.Write( E.Message); end; end; Console.WriteLine( 'done.'); end; end.