[
https://issues.apache.org/jira/browse/THRIFT-1914?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13919583#comment-13919583
]
ASF GitHub Bot commented on THRIFT-1914:
----------------------------------------
GitHub user smallfish opened a pull request:
https://github.com/apache/thrift/pull/82
THRIFT-1914 Python: Support for Multiplexing Services on any Transport
copy patch from: https://issues.apache.org/jira/browse/THRIFT-1914 add some
testcases.
add new options `multiple`, if set `True`, will test `ThriftTest` and
`SecondService`.
run server:
$ python TestServer.py --port=9999 --multiple -v TSimpleServer
run client:
$ python TestClient.py --host=127.0.0.1 --port=9999 --multiple
...................
----------------------------------------------------------------------
Ran 19 tests in 0.693s
OK
You can merge this pull request into a Git repository by running:
$ git pull https://github.com/smallfish/thrift master
Alternatively you can review and apply these changes as the patch at:
https://github.com/apache/thrift/pull/82.patch
To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:
This closes #82
----
commit 4b5e276a43371b5d5cccbf9ca9fbcea790ae6881
Author: smallfish <[email protected]>
Date: 2014-03-04T16:34:59Z
THRIFT-1914 Python: Support for Multiplexing Services on any Transport,
Protocol and Server, add testcases
----
> Python: Support for Multiplexing Services on any Transport, Protocol and
> Server
> -------------------------------------------------------------------------------
>
> Key: THRIFT-1914
> URL: https://issues.apache.org/jira/browse/THRIFT-1914
> Project: Thrift
> Issue Type: Sub-task
> Components: Python - Library
> Reporter: Doug MacEachern
> Fix For: 1.0
>
> Attachments: python3_multiplex.patch, python_multiplex.patch
>
>
> *Motivation and Benefits*
> We plan to use Thrift with a large number of functions communicating among
> (at least) three languages. To keep maintainability high, we hope to avoid a
> single service defined with a large number of functions. This would require
> monolithic, unwieldy service implementations as the number of functions grows.
> Breaking up our API into multiple IDLs gives us multiple abstract base
> classes, which provides more flexibility in the object-oriented design of our
> server platform.
> Before our changes, the alternative was to open up additional ports with
> smaller service implementations on each. We'd rather not open additional
> ports.
> *Our Approach*
> We pursued an approach with the following in mind:
> - No modifications to existing Thrift code.
> - No modification to the Thrift protocol as described in the whitepaper.
> - No modification to any {{TServer}}, {{TProtocol}} or {{TTransport}}.
> - No need for any new {{TServer}} implementation. Works with any {{TServer}}
> implementation.
> - Work with any combination of {{TServer}}, {{TProtocol}} or {{TTransport}}.
> - Avoid language-specific features, to ease implementation in other languages.
> *Additions to Thrift*
> Convenience class:
> - {{TProtocolDecorator}} (extends {{TProtocol}}). This is a no-op decorator
> around the {{TProtocol}} abstract class.
> For use by clients:
> - {{TMultiplexedProtocol}} (extends {{TProtocolDecorator}}). This decorates
> any {{TProtocol}} by modifying the behaviour of
> {{writeMessageBegin(TMessage)}} to change {{TMessage.name}} from
> {{function_name}} to {{service_name + separator + function_name}}.
> For use by the server:
> - {{TMultiplexedProcessor}} (implements {{TProcessor}}). It should be used
> to communicate with a client that was written using {{TMultiplexedProtocol}}.
> It removes {{service_name + separator}} from {{TMessage.name}}, turning it
> back into the standard message format. It then brokers the service request
> to the {{TProcessor}} which is registered to handle requests for that service.
> *Sample Usage - Client*
> In this example, we've chosen to use {{TBinaryProtocol}} with two services:
> {{Calculator}} and {{WeatherReport}}.
> {code}
> TSocket transport = new TSocket("localhost", 9090);
> transport.open();
> TBinaryProtocol protocol = new TBinaryProtocol(transport);
> TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "Calculator");
> Calculator.Client service = new Calculator.Client(mp);
> TMultiplexedProtocol mp2 = new TMultiplexedProtocol(protocol,
> "WeatherReport");
> WeatherReport.Client service2 = new WeatherReport.Client(mp2);
> System.out.println(service.add(2,2));
> System.out.println(service2.getTemperature());
> {code}
> *Sample Usage - Server*
> {code}
> TMultiplexedProcessor processor = new TMultiplexedProcessor();
> processor.registerProcessor(
> "Calculator",
> new Calculator.Processor(new CalculatorHandler()));
> processor.registerProcessor(
> "WeatherReport",
> new WeatherReport.Processor(new WeatherReportHandler()));
> TServerTransport t = new TServerSocket(9090);
> TSimpleServer server = new TSimpleServer(processor, t);
> server.serve();
> {code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)