你如何在Rails应用程序中"生成"一个EventMachine?

Mik*_*cic 20 ruby ruby-on-rails eventmachine websocket ruby-on-rails-3

我有一个Rails应用程序,我希望为它添加某种WebSocket支持.从各种Google搜索,似乎最好的基于Ruby的WebSocket解决方案是在EventMachine上运行的em-websocket.

我想知道是否有办法将EventMachine反应器"集成"到Rails中?我在哪里放置初始化代码?这是实现这个目标的正确方法吗?

我已经看到这个回到Sinatra的例子来做一个EventMachine GET请求,但这并不是我想要的.

任何帮助表示赞赏.

tad*_*man 9

你不能在Rails本身内部运行Eventmachine引擎,因为它是一个永久阻止你的Rails进程的持久运行循环.通常做的是有一个使用Eventmachine的边进程,Rails通过套接字与它通信以发送通知.

Juggernaut就是这种事情的一个例子,它实现了一个Websocket客户端和一个Rails钩子来向它发送通知.该项目已经弃用了Ruby版本,转而支持JavaScript Node.js版本,但这仍然是如何使用Eventmachine的一个非常全面的例子.


小智 6

如果您在瘦服务器(bundle exec thin start)中运行rails应用程序,瘦服务器会为您运行EventMachine,然后您的rails应用程序可以在您需要的任何地方执行EM代码.

举例:

具有该代码的库o初始化程序:

EM.next_tick do
  EM.add_periodic_timer(20) do
    puts 'from Event Machine in rails code'
  end
end
Run Code Online (Sandbox Code Playgroud)

不阻止rails进程应用程序.


Chr*_*ini 5

不知道这是不是你想要的.但是如果你想提供某种套接字消息系统.

看看Faye.它为Node.js和Rack提供消息服务器.Ryan Bates 还为此设计了一个轨道,可以简化实施.

希望有所帮助.


Jon*_*nah 2

我尝试使用电磁同步来启动光纤中的反应器。在 Rails 应用程序中,您可能可以在初始化程序中启动它,因为听起来您只想让反应器运行以响应 Websocket 请求。正如其他答案所建议的,我认为您想要与您的反应器建立套接字通信,或者使用异步客户端之一来连接您的反应器和 Rails 代码都可以读取和写入以交换数据的数据存储。

我的一些同事整理了一些在 ruby​​ 代码中按需启动 EM 反应器的示例,以便在 EventMachine 中运行测试。我会尝试用它作为一个可能的例子;使用 eventmachine 进行收集和测试