Соединения через EventMachine UNIX: как их использовать при работе Thin в качестве службы? - PullRequest
0 голосов
/ 08 июля 2011

Как я могу использовать EventMachine.connect_unix_domain во время работы Thin в качестве службы (используя скрипт инициализации (отрывок) и приведенную ниже конфигурацию).Код, приведенный ниже, является проблемой (я получаю ошибку eventmachine not initialized: evma_connect_to_unix_server).Второй пример кода работает, но не позволяет мне демонизировать thin (я не думаю).Разве у Thin еще нет запущенного экземпляра EventMachine?

ОБНОВЛЕНИЕ: как ни странно: остановка сервера (с service thin stop), похоже, попадает в файл config.ru и запускает приложение (чтобы оно работало,пока команда stop не истечет время и не убьет процесс).Что происходит, когда тонкие остановки могут вызывать такое поведение?

Код проблемы

class Server < Sinatra::Base
# Webserver code removed
end

module Handler
  def receive_data data
    $received_data_changed = 1
    $received_data = data
  end
end

$sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler)

Рабочий код

EventMachine.run do
  class Server < Sinatra::Base
  # Webserver code removed
  end

  module Handler
    def receive_data data
      $received_data_changed = 1
      $received_data = data
    end
  end
  $sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler)
  Server.run!(:port => 4567)
end

Выдержка сценария инициализации

DAEMON=/usr/local/bin/thin
SCRIPT_NAME=/etc/init.d/thin
CONFIG_PATH=/etc/thin

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

case "$1" in
  start)
    $DAEMON start --all $CONFIG_PATH
    ;;

Тонкий Конфиг

--- 
chdir: /var/www
environment: development
timeout: 30
log: log/thin.log
pid: tmp/pids/thin.pid
max_conns: 1024
max_persistent_conns: 512
require: []

wait: 30
servers: 1
socket: /tmp/thin.server.sock
daemonize: true

Ответы [ 2 ]

0 голосов
/ 12 июля 2011

Я закончил тем, что удалил EventMachine.run do ... end и просто заключил сокетное соединение в EM.next_tick{ $sock = EventMachine.connect_unix_domain("/tmp/mysock.sock", Handler) }.

Могу поклясться, что я пробовал это раньше ... но теперь это работает.

РЕДАКТИРОВАТЬ: Идея для next_tick пришла от здесь .

0 голосов
/ 09 июля 2011

Thin построен поверх EventMachine.Я думаю, что вы должны использовать EventMachine для обслуживания вашего приложения.Попробуйте отладить дальше, как Тонкий не демонизирует.(Какую версию ты используешь?).Также вы можете запустить Thin на другом порту, например 4000, а затем передать его в качестве вышестоящего сервера на прокси-сервер пересылки, если это то, чего вы хотите достичь.

...