jeudi 12 janvier 2012

Apache Thrift Example


- Used third party tools
  • Eclipse
  • thrift-0.8.0
  • JDK1.7
1- Download thrift-0.8.0.exe from the following url (http://www.apache.org/dyn/closer.cgi?path=/thrift/0.8.0/thrift-0.8.0.exe)


2-  Create the thrift description file:


time.thrift



# time.thrift
namespace java tserver.gen
typedef i64 Timestamp
service TimeServer 
{
   Timestamp time()
}


3 - Generate the java classes for server and client


Command:
> thrift-0.8.0.exe --gen java time.thrift
-> We will find all java generated classes in gen-java directory


4- Implements Iface server class:


package com.sample.thrift.server;


import org.apache.thrift.TException;
import tserver.gen.*;


class TimeServerImpl implements TimeServer.Iface 
{
   @Override
   public long time() throws TException 
   {
      long time = System.currentTimeMillis();
      System.out.println("time() called: " + time);
      return time;
   }
}


5- Create server class:


Server.java


package com.sample.thrift.server;


import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TSSLTransportFactory;
import org.apache.thrift.transport.TSSLTransportFactory.TSSLTransportParameters;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import tserver.gen.TimeServer;


public class Server
{
private void startSampleServer()
{
try 
{
TServerSocket serverTransport = new TServerSocket(7911);         
TimeServer.Processor processor = new TimeServer.Processor(new TimeServerImpl());
Factory protFactory = new TBinaryProtocol.Factory(true, true);
TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor).protocolFactory(protFactory));
System.out.println("Starting server on port 7911 ...");
server.serve();

catch (TTransportException e) 
{
e.printStackTrace();
}
}


private void startSslServer()
{
try 
{
TSSLTransportFactory.TSSLTransportParameters params = new TSSLTransportFactory.TSSLTransportParameters();
params.setKeyStore("C:/Users/jamel/eclipse.helios.workspace/ThriftClientServer/certificat_ssl/saskeystore.jks", "sas001");
TServerSocket serverTransport = TSSLTransportFactory.getServerSocket(7912, 10000, InetAddress.getByName("localhost"), params);
TimeServer.Processor processor = new TimeServer.Processor(new TimeServerImpl());
Factory protFactory = new TBinaryProtocol.Factory(true, true);
TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor).protocolFactory(protFactory));
System.out.println("Starting server on port 7912 ...");
server.serve();

catch (TTransportException e) 
{
e.printStackTrace();
}
catch (UnknownHostException e) 
{


}
}


public static void main(String args[])
{
Server srv = new Server();
//srv.startSampleServer();
srv.startSslServer();
}
}


6- Create Client Class:


TimeClient.java

package com.sample.thrift.client;


import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSSLTransportFactory;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import tserver.gen.TimeServer.Client;


public class TimeClient 
{
private void startSampleClient()
{
TTransport transport;
try 
{
transport = new TSocket("localhost", 7911);
TProtocol protocol = new TBinaryProtocol(transport);
Client client = new Client(protocol);
transport.open();
long time = client.time();
System.out.println("Time from server:" + time);
transport.close();
}
catch (TTransportException e) 
{
e.printStackTrace();
}
catch (TException e) 
{
e.printStackTrace();
}
}


private void startSslClient()
{
TTransport transport;
try 
{
TSSLTransportFactory.TSSLTransportParameters params = new TSSLTransportFactory.TSSLTransportParameters();
params.setTrustStore("C:/Users/jamel/eclipse.helios.workspace/ThriftClientServer/certificat_ssl/sastruststore.jks", "sas001");
transport = TSSLTransportFactory.getClientSocket("localhost", 7912, 10000, params);
TProtocol protocol = new TBinaryProtocol(transport);
Client client = new Client(protocol);
//transport.open();
long time = client.time();
System.out.println("Time from server:" + time);
transport.close();
}
catch (TTransportException e) 
{
e.printStackTrace();
}
catch (TException e) 
{
e.printStackTrace();
}
}


public static void main(String[] args) 
{
TimeClient c = new TimeClient();
//c.startSampleClient();
c.startSslClient();
}
}


7- Create keystore and trustore for SSL


createSQSKeystoreaAndTruststore.bat


@echo off


if "%JAVA_HOME%" == "" (
set "JAVA_HOME=C:\Program Files\Java\jdk1.7.0\"
)
set "KEYTOOL_CMD="%JAVA_HOME%bin\keytool.exe""


rem créer le fichier de keystore
%KEYTOOL_CMD% -genkeypair -alias sascertificatekey -keyalg RSA -validity 7 -keystore saskeystore.jks -storepass sas001 -keypass sas001
echo saskeystore.jks crée


rem créer le fichier cert.cer
%KEYTOOL_CMD% -export -alias sascertificatekey -keystore saskeystore.jks -rfc -file cert.cer -storepass sas001 -keypass sas001
echo cert.cer crée


rem créer le fichier de sastruststore
%KEYTOOL_CMD% -import -alias certificatekey -file cert.cer -keystore sastruststore.jks -storepass sas001 -keypass sas001
echo Certificat importée avec succée


@pause



END

Aucun commentaire: