运行薄壁和EventMachine的模块化西纳特拉应用。 它开始两次?(Running a mo

2019-10-18 14:23发布

我在使用薄,与EventMachine的运行其他任务的模块化西纳特拉Web应用程序运行。

它的工作原理,但里面的东西有点古怪的Web服务器:任何要求,无论是成功还是404,不会出现在从薄/西纳特拉输出日志。 当我取消的过程中,服务器端的两倍。

下面是该应用程序的粗糙,基本结构:

Procfile:

web: ruby app.rb

app.rb:

require 'thin'
require 'eventmachine'
require 'app/frontend'

EM.run do
  # Start some background tasks here...

  EM.add_periodic_timer(1200) do
    # Do a repeating task here...
  end

  App::Frontend.run!
end

应用程序/ frontend.rb:

require 'sinatra/base'

module App
  class Frontend < Sinatra::Base
    get '/' do
      # Display page
    end
    # etc
  end
end

当我做foreman start然后我得到:

16:50:00 web.1  | started with pid 76423
16:50:01 web.1  | [messages about EventMachine background tasks starting]
16:50:01 web.1  | == Sinatra/1.4.3 has taken the stage on 5000 for development with backup from Thin
16:50:01 web.1  | >> Thin web server (v1.5.1 codename Straight Razor)
16:50:01 web.1  | >> Maximum connections set to 1024
16:50:01 web.1  | >> Listening on 0.0.0.0:5000, CTRL+C to stop

没有更多的是输出,当我要求现有的网页(其中加载OK)或不存在的网页。 当我取消的过程中,我得到:

^CSIGINT received
16:50:08 system | sending SIGTERM to all processes
SIGTERM received
16:50:08 web.1  | >> Stopping ...
16:50:08 web.1  | == Sinatra has ended his set (crowd applauds)
16:50:08 web.1  | >> Stopping ...
16:50:08 web.1  | == Sinatra has ended his set (crowd applauds)
16:50:08 web.1  | exited with code 0

这西纳特拉完成两次让我觉得我莫名其妙地跑了两次,而这服务于网页中的一个没有被记录......但我不知道我如何管理这个!

Answer 1:

该模块化与古典风格的文档提到,有一些更改默认设置,这些被记录,这是默认关闭的。

添加settings.logging = true到顶部class Frontend < Sinatra::Base给了我一个登录我的本地主机的终端窗口:5000级的要求。

我不认为第二个问题是,它创建了两个过程,而是它的杀了,并重新开始的过程中正确关闭服务器之前。 这可以通过以下的西纳特拉配方使用EventMachine的与西纳特拉,这是一个小比你做了什么更复杂的解决。 这里是他们的代码,修改,以适应您的应用程序:

app.rb

EM.run do
  server  = 'thin'
  host    = '0.0.0.0'
  port    = ENV['PORT'] || '8181'
  web_app = App::Frontend.new

  # Start some background tasks here...

  EM.add_periodic_timer(1200) do
    # Do a repeating task here...
  end

  dispatch = Rack::Builder.app do
    map '/' do
      run web_app
    end
  end

  Rack::Server.start({
    app:    dispatch,
    server: server,
    Host:   host,
    Port:   port
  })
end

( 原始源,从屈食谱 )

使用的ENV['PORT']在app.rb让您在工头使用多个实例(例如, foreman start -p 4000 -c web=2 ,这将运行在端口4000和4001服务)。 且二者出现在日志中!

希望帮助。



文章来源: Running a modular Sinatra app with Thin and EventMachine. It starts twice?