Thrift: Python Server, Erlang Client Errors… {thrift_socket_server,244,{child_error,function_clause,[]}}

我与影子孤独终老i 提交于 2019-12-12 14:27:54

问题


This is actually my first question on stackoverflow, but I've been having a problem that I can't really seem to solve. I'm making a Python server that calls an erlang client through thrift. The only function I've made in thrift is one called bar, which takes in an integer and prints bar (integer). Heres the Python Client, its not too complicated:

#!/usr/bin/env python

import sys
sys.path.append('../gen-py')

from foo import Foo
from foo.ttypes import *
from foo.constants import *

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

try:
   # Make socket
   transport = TSocket.TSocket('localhost', 9999)

   # Buffering is critical. Raw sockets are very slow
   transport = TTransport.TBufferedTransport(transport)

   # Wrap in a protocol
   protocol = TBinaryProtocol.TBinaryProtocol(transport)

   # Create a client to use the protocol encoder
   client = Foo.Client(protocol)

   # Connect!
   transport.open()

   msg = client.bar(1452)
   print msg

   transport.close()

except Thrift.TException, tx:
   print "%s" % (tx.message)

Here is my thrift client, which is listening on port 9999:

-module(foo_service).

-include("foo_thrift.hrl").
-include("foo_types.hrl").

-export([start_link/0, stop/1,
         handle_function/2,

% Thrift implementations
% FILL IN HERE
         bar/1]).

%%%%% EXTERNAL INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

start_link() ->
  thrift_socket_server:start ([{port, get_port()},
                               {name, ?MODULE},
                               {service, foo_thrift},
                               {handler, ?MODULE},
                               {framed, true},
                               {socket_opts, [{recv_timeout, 60*60*1000}]}]).

stop(_Server) ->
  thrift_socket_server:stop (?MODULE),
  ok.

%%%%% THRIFT INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

handle_function(Function, Args) when is_atom(Function), is_tuple(Args) ->
  case apply(?MODULE, Function, tuple_to_list(Args)) of
    ok -> ok;
    Reply -> {reply, Reply}
  end.

%%%%% HELPER FUNCTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

get_port() ->
  {ok, Result} = application:get_env(foo, service_port),
  Result.

%% ADD THRIFT FUNCTIONS HERE
bar(I) ->
  io:format("bar (~p)~n", [I]).

So I start up the thrift client, and from the python server I call client.bar(1452), and unfortunately get a child error:

=CRASH REPORT==== 5-Jul-2013::08:34:32 ===
  crasher:
    initial call: thrift_socket_server:acceptor_loop/1
    pid: <0.51.0>
    registered_name: []
    exception error: no function clause matching 
                     thrift_socket_transport:read({data,#Port<0.1067>,3600000},
                                                  -2147418111) (src/thrift_socket_transport.erl, line 53)
      in function  thrift_transport:read/2 (src/thrift_transport.erl, line 67)
      in call from thrift_framed_transport:read/2 (src/thrift_framed_transport.erl, line 79)
      in call from thrift_transport:read/2 (src/thrift_transport.erl, line 67)
      in call from thrift_binary_protocol:read_data/2 (src/thrift_binary_protocol.erl, line 315)
      in call from thrift_binary_protocol:read/2 (src/thrift_binary_protocol.erl, line 286)
      in call from thrift_binary_protocol:read/2 (src/thrift_binary_protocol.erl, line 175)
      in call from thrift_protocol:read_specific/2 (src/thrift_protocol.erl, line 186)
    ancestors: [foo_service,foo_sup,<0.46.0>]
    messages: []
    links: [<0.48.0>,#Port<0.1067>]
    dictionary: []
    trap_exit: false
    status: running
    heap_size: 987
    stack_size: 27
    reductions: 513
  neighbours:

=ERROR REPORT==== 5-Jul-2013::08:34:32 ===
{thrift_socket_server,244,{child_error,function_clause,[]}}

Any Ideas? Thanks for any help!


回答1:


Figured it out! I was using TBufferedTransport when I had specified framed transport in my erlang file. I changed it to TFramedTrasport, recompiled my thrift files, and everything worked nicely.



来源:https://stackoverflow.com/questions/17494031/thrift-python-server-erlang-client-errors-thrift-socket-server-244-child

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!