Apache Thrift, RPC’s between Java(server)-PHP(client), Hello World Application
sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev sudo apt-get install php5-dev php5-cli #for php sudo apt-get install libglib2.0-dev #for c_glib
For the final installation, download the tarball from the website, http://thrift.apache.org/download/
Then to install the tarball:
tar -xvf /path/to/tarball cd /path/to/extraction ./configure sudo make sudo make install
Also install the eclipse editor for thrift files.
Eclipse –> help –> Install new Software –>
add the URL: http://thrift4eclipse.sourceforge.net/updatesite/
tick the only package shown and install it.
Compiling the REQUIRED LIBRARIES (for the different languages that has to be supported):
- for JAVA
Go to folder /path/to/thrift-version/folder/lib/java/
execute the command “ant” – compiles using apache ant
Now the build folder contains all the lib files required. - for PHP
No need for compiling any files, php is used in its raw form.
Making the thrift file:
Tutorial can be found here : http://diwakergupta.github.com/thrift-missing-guide/
Thrift file will include all the services and structures shared between the two languages.
Start with:
namespace java package-name
Making the JAVA server:
Copy the lib files (libthrift-<version>.jar, build/lib/*) to <project-name>/WebContent/WEB-INF/lib/ folder.
Generate the auto-generated java files from the file using the command:
cd path/to/thrift-file/ thrift --gen java -out thrift-file-name
Now we have to implement the services mentioned in the thrift-file by:
- make a new file in the same package <package-name>.
- Wrie a class <service-implement> implementing <service-name>.Iface (like this implement all the services)
Now we have to make the server file:
public class server_name implements Runnable { /* port to listen */ private static final int PORT = 9090; public void run() { try { TServerSocket serverTransport = new TServerSocket(PORT); HelloService.Processor processor = new HelloService.Processor(new ()); TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor)); System.out.println("Starting server on port: "+PORT); server.serve(); } catch(TTransportException e) { System.out.println("Message: "+e.getMessage()); System.out.println("StackTrace: "); e.printStackTrace(); } } public static void main(String[] args) { new Thread(new server_name()).run(); } }
cd path/to/thrift-file/ thrift --gen php thrift-file-name
Create a new directory named “thrift” and copy all the php library files available in the directory /path/to/thrift-version-folder/lib/php/src/ to the newly created directory. Also create a new sub-directory named “packages” in “thrift” directory, and copy the auto-generated PHP package here.
Create a new file <client-file>.php adjacent to the “thrift” directory.
Contents of the PHP file will be:
// defining the port and server to listen define("PORT", '9090'); define("SERVER", 'localhost'); //Global variable where the php library files are stored $GLOBALS['THRIFT_ROOT'] = 'thrift'; //including the library files require_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php'; require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php'; require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php'; require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php'; //loading the auto-generated package require_once $GLOBALS['THRIFT_ROOT'].'/packages/hello/HelloService.php'; try { //create a thrift connection $socket = new TSocket(SERVER, PORT); $transport = new TBufferedTransport($socket); $protocol = new TBinaryProtocol($transport); //create a new hello service client $client = new HelloServiceClient($protocol); //open the connection $transport->open(); //calling the service $result = $client->sayHello(); echo "Result: ".$result; //closing the connection $transport->close(); } catch(TException $tx) { echo "Thrift Exception: ".$tx->getMessage()."\r\n"; }