All Apache Thrift tutorials require that you have:
Generated the tutorial.thrift and shared.thrift files:
thrift -r --gen perl tutorial.thrift
Followed all prerequisites listed below.
# 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 = Thrift::Socket->new('localhost',9090); my $transport = Thrift::BufferedTransport->new($socket,1024,1024); my $protocol = Thrift::BinaryProtocol->new($transport); my $client = tutorial::CalculatorClient->new($protocol); eval{ $transport->open(); $client->ping(); print "ping()\n"; my $sum = $client->add(1,1); print "1+1=$sum\n"; my $work = tutorial::Work->new(); $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 '../../lib/perl/lib'; use lib 'gen-perl'; use Thrift::Socket; use Thrift::Server; use Thrift::ServerSocket; 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 = tutorial::InvalidOperation->new(); $x->whatOp($op); $x->why('Cannot divide by 0'); die $x; } $val = $num1 / $num2; } else { my $x = tutorial::InvalidOperation->new(); $x->whatOp($op); $x->why('Invalid operation'); die $x; } my $log = shared::SharedStruct->new();