Hi,

  Thanks for pointing out the problems with compilation, I just checked
in some fixes for those.  The problem with just doing -s server is that
the start function does start the server, but the return of the
server start call is a pid which is then ignored.  Since that pid is
never linked into the supervision tree it dies.  So you get a
connection refused.

  What you really want to do is create an otp application, a supervisor
as well as the service which actually starts the server.  thrift_erl_skel
used to do this, but looking at it, I found it very out of date.  I sort
of updated it, but not super well, as there isn't currently a thrift
plugin for rebar, but if you have a thrift file and you want a server
with supervisor/application check out

https://github.com/djnym/thrift_erl_skel

Not too many instructions, and you'll have to have rebar and thrift
installed to get it to work, but it works for me :)

-Anthony

On Tue, Feb 15, 2011 at 11:26:51AM -0800, Paul Meier wrote:
> Hi,
> 
>       Thanks for getting back to me.  Incidentally, that's exactly what my
> server module looks like.  And while my wrapper script was using "erl -run
> server start" as opposed to "erl -s server", neither of them creates a
> server that accepts incoming connections from thrift clients, unless I
> invoke their server:start() from the erlang shell itself, which I found
> pretty bizarre.
> 
>       I just tried this with a vanilla Thrift install, so unless there's
> some differences in our Erlang VM's, one can probably reproduce it
> themselves by doing the following (assuming everything is built, etc):
> 
> 1. Generate the thrift tutorial files with 'thrift -r --gen erl
> tutorial.thrift'.
> 
> 2. Correct the errors in client.erl and server.erl:  they reference
> different constants than Thrift generates, so 'tutorial_ADD',
> 'tutorial_SUBTRACT' and their ilk should be 'tutorial_Operation_ADD',
> 'tutorial_Operation_SUBTRACT', etc.
> 
> 3. Run server.sh, which opens a shell if everything compiled successfully.
> Manually call server:start(), then call client:t().  This opens a Thrift
> server on Port 9999, runs the client, and works fine.
> 
> 4. Now edit the 'erl' invocation at the end of server.sh to have '-s server'
> as one of it's flags, and run it again (presuming you killed the previous
> process).  This automatically calls server:start().  Call client:t().
> Connection refused.
> 
>      If you edit the word 'localhost' to '127.0.0.1' in the Ruby client (and
> feed it port 9999), you'll observe the same thing.
> 
>      I'm completely baffled why the shell would require something like this,
> and I'll email the list if I find anything (I'm sort of new to the platform,
> so I'm reading up on erl(1), boot files, rel files, etc. to see if there's
> some semantic difference on invocation that I'm missing).  I just wanted to
> know if this was known, or if I'm doing anything blatantly wrong.
> 
>      As for thrift_erl_skel, I'm trying to add Thrift to a previously
> existing application, so I haven't looked at it too much for my project.
> But I'll play with the output it generates, see if it helps.
> 
>      Thanks,
> 
> -Paul
> 
> 
> 
> On Mon, Feb 14, 2011 at 9:18 PM, Anthony Molinaro <
> [email protected]> wrote:
> 
> > Hi,
> >
> >  What does your start function currently look like?  You can probably
> > do something like
> >
> > -module (server).
> > start () ->
> >  thrift_socket_server:start ([{port, 12345},
> >                               {name, ?MODULE},
> >                               {service, myService_thrift},
> >                               {handler, ?MODULE},
> >                               {framed, true},
> >                               {socket_opts, [{recv_timeout, 60000}]}]).
> >
> > Then you should be able to use
> >
> > % erl -s server
> >
> > in a server.  Also you could check out
> >
> > https://github.com/toddlipcon/thrift_erl_skel
> >
> > which will create a skeleton application, supervisor, and service.
> >
> > -Anthony
> >
> > On Mon, Feb 14, 2011 at 11:07:01AM -0800, Paul Meier wrote:
> > > Hi friends,
> > >
> > >      Forgive me if I'm missing something obvious, but when I try to run
> > an
> > > Erlang Thrift Server, it works if I run something like:
> > >
> > > erl +K true -pa all_your_beams/
> > >
> > >      And run server:start() from the Erlang command shell.
> > >
> > >      But if I write a bash wrapper that says something like
> > >
> > > erl +K true -pa all_your_beams/ -noshell -run server start
> > >
> > >      then connecting clients fail, saying Connection Refused, despite
> > there
> > > being a message saying there's a Thrift Service listening on the
> > appropriate
> > > port.  This is the case in both the tutorial and my own application.  Is
> > > this a known issue?  Has anyone else experienced this?
> > >
> > >      It's not mission-critical, but any help would be appreciated.
> >  Thanks
> > > ^_^
> > >
> > > -Paul
> >
> > --
> > ------------------------------------------------------------------------
> > Anthony Molinaro                           <[email protected]>
> >

-- 
------------------------------------------------------------------------
Anthony Molinaro                           <[email protected]>

Reply via email to