All Apache Thrift tutorials require that you have:
Generated the tutorial.thrift and shared.thrift files as discussed here
thrift -r --gen perl tutorial.thrift
Followed all prerequesets listed
#
use strict;
use warnings;
use lib '../../lib/perl/lib';
use lib '../gen-perl';
use Thrift;
use Thrift::BinaryProtocol;
use Thrift::Socket;
use Thrift::BufferedTransport;
use shared::SharedService;
use tutorial::Calculator;
use shared::Types;
use tutorial::Types;
use Data::Dumper;
my $socket = new Thrift::Socket('localhost',9090);
my $transport = new Thrift::BufferedTransport($socket,1024,1024);
my $protocol = new Thrift::BinaryProtocol($transport);
my $client = new tutorial::CalculatorClient($protocol);
eval{
$transport->open();
$client->ping();
print "ping()\n";
my $sum = $client->add(1,1);
print "1+1=$sum\n";
my $work = new tutorial::Work();
$work->op(tutorial::Operation::DIVIDE);
$work->num1(1);
$work->num2(0);
eval {
$client->calculate(1, $work);
print "Whoa! We can divide by zero?\n";
}; if($@) {
warn "InvalidOperation: ".Dumper($@);
}
$work->op(tutorial::Operation::SUBTRACT);
$work->num1(15);
$work->num2(10);
my $diff = $client->calculate(1, $work);
print "15-10=$diff\n";
my $log = $client->getStruct(1);
print "Log: $log->{value}\n";
$transport->close();
#
use strict;
use lib '../gen-perl';
use Thrift::Socket;
use Thrift::Server;
use tutorial::Calculator;
package CalculatorHandler;
use base qw(tutorial::CalculatorIf);
sub new {
my $classname = shift;
my $self = {};
return bless($self,$classname);
}
sub ping
{
print "ping()\n";
}
sub add
{
my($self, $n1, $n2) = @_;
printf("add(%d,%d)\n", $n1, $n2);
return $n1 + $n2;
}
sub calculate
{
my($self, $logid, $work) = @_;
my $op = $work->{op};
my $num1 = $work->{num1};
my $num2 = $work->{num2};
printf("calculate(%d, %d %d %d)\n", $logid, $num1, $num2, $op);
my $val;
if ($op == tutorial::Operation::ADD) {
$val = $num1 + $num2;
} elsif ($op == tutorial::Operation::SUBTRACT) {
$val = $num1 - $num2;
} elsif ($op == tutorial::Operation::MULTIPLY) {
$val = $num1 * $num2;
} elsif ($op == tutorial::Operation::DIVIDE) {
if ($num2 == 0)
{
my $x = new tutorial::InvalidOperation;
$x->what($op);
$x->why('Cannot divide by 0');
die $x;
}
$val = $num1 / $num2;
} else {
my $x = new tutorial::InvalidOperation;
$x->what($op);
$x->why('Invalid operation');
die $x;
}
my $log = new shared::SharedStruct;
$log->key($logid);
$log->value(int($val));