我是EventMachine的新手,所以我不确定这意味着什么.我得到了这个例外:
EventMachine::ConnectionNotBound recieved ConnectionUnbound for an unknown signature: ef93a97d4d6441cb80d30fe2313d7de73
Run Code Online (Sandbox Code Playgroud)
该程序相当复杂,所以我无法解释可能导致它的所有内容.我需要的只是指向要寻找的东西.似乎没有记录该错误(查看http://eventmachine.rubyforge.org/).
我正在尝试一个非常基本的服务器/客户端演示.我在客户端(浏览器中的用户)和服务器的eventmachine Echo示例中使用socket.io.理想情况下,socket.io应向服务器发送请求,服务器将打印接收的数据.不幸的是,事情并没有像我期望的那样发挥作用.
来源粘贴在这里:
socket = new io.Socket('localhost',{
port: 8080
});
socket.connect();
$(function(){
var textBox = $('.chat');
textBox.parent().submit(function(){
if(textBox.val() != "") {
//send message to chat server
socket.send(textBox.val());
textBox.val('');
return false;
}
});
socket.on('message', function(data){
console.log(data);
$('#text').append(data);
});
});
Run Code Online (Sandbox Code Playgroud)
这是红宝石代码:
require 'rubygems'
require 'eventmachine'
require 'evma_httpserver'
class Echo < EM::Connection
def receive_data(data)
send_data(data)
end
end
EM.run do
EM.start_server '0.0.0.0', 8080, Echo
end
Run Code Online (Sandbox Code Playgroud) 我有一个EventMachine服务器,我用monit监控.有时会崩溃,我想弄明白为什么,但我不清楚如何记录所有顶级故障.我试过这样的代码:
begin
EventMachine::run do
EventMachine::start_server('0.0.0.0', PORT, MyServer)
end
rescue Exception => e
puts "FAILURE: #{e.class}: #{e}"
end
Run Code Online (Sandbox Code Playgroud)
但这似乎没有发现错误.我怀疑这可能是内存耗尽,我正在单独跟踪,但我仍然希望这台服务器记录其可能的失败原因.
关于Ruby的第一个问题.我正在尝试在Reactor循环中测试EventMachine交互 - 我猜它可以被归类为"功能"测试.
假设我有两个类 - 服务器和客户端.我想测试双方 - 我需要确定他们的互动.
服务器:
require 'singleton'
class EchoServer < EM::Connection
include EM::Protocols::LineProtocol
def post_init
puts "-- someone connected to the echo server!"
end
def receive_data data
send_data ">>>you sent: #{data}"
close_connection if data =~ /quit/i
end
def unbind
puts "-- someone disconnected from the echo server!"
end
end
Run Code Online (Sandbox Code Playgroud)
客户:
class EchoClient < EM::Connection
include EM::Protocols::LineProtocol
def post_init
send_data "Hello"
end
def receive_data(data)
@message = data
p data
end
def unbind
puts "-- someone disconnected from …Run Code Online (Sandbox Code Playgroud) 我正在研究ruby的并行/异步处理功能,并阅读了许多文章和博客文章.我浏览了EventMachine,Fibers,Revactor,Reia等等.不幸的是,我无法为这个非常简单的用例找到一个简单,有效(和非IO阻塞)的解决方案:
File.open('somelogfile.txt') do |file|
while line = file.gets # (R) Read from IO
line = process_line(line) # (P) Process the line
write_to_db(line) # (W) Write the output to some IO (DB or file)
end
end
Run Code Online (Sandbox Code Playgroud)
你可以看到,我的小脚本正在执行三个操作:读取(R),处理(P)和写入(W).让我们假设 - 为简单起见 - 每个操作只花费1个单位时间(例如10ms),因此当前代码将执行类似这样的操作(5行):
Time: 123456789012345 (15 units in total)
Operations: RPWRPWRPWRPWRPW
Run Code Online (Sandbox Code Playgroud)
但是,我希望它能做到这样的事情:
Time: 1234567 (7 units in total)
Operations: RRRRR
PPPPP
WWWWW
Run Code Online (Sandbox Code Playgroud)
显然,我可以运行三个进程(读取器,处理器和写入器)并将读取器的读取行传递到处理器队列,然后将处理过的行传递到写入器队列(所有这些都通过例如RabbitMQ进行协调).但是,用例非常简单,感觉不对.
关于如何做到这一点的任何线索(没有从Ruby切换到Erlang,Closure或Scala)?
我花了好几天现在为eventmachine找到了一些非echo服务器的例子,但似乎没有.假设我想编写一个接受文件并将其写入Tempfile的服务器:
require 'rubygems'
require 'tempfile'
require 'eventmachine'
module ExampleServer
def receive_data(data)
f = Tempfile.new('random')
f.write(data)
ensure
f.close
end
end
EventMachine::run {
EventMachine::start_server "127.0.0.1", 8081, ExampleServer
puts 'running example server on 8081'
}
Run Code Online (Sandbox Code Playgroud)
写入文件将阻止反应堆,但我不知道怎么做'Eventmachine风格'.我是否必须以块的形式读取数据并将每个块写入Em.next_tick块中的磁盘?
感谢Andreas的帮助
是否可以在单个事件计算机中运行多个服务器?
我的意思是单个客户端连接可以同时使用多个服务.例如,登录服务器对用户进行身份验证,然后用户可以同时使用聊天室和简单游戏(例如带有单个客户端套接字的检查程序)?
或者我是否需要为每项服务提供多个eventmachine反应器?
我正在尝试整个BDD方法,并希望测试我正在编写AMQP的vanilla Ruby应用程序的基础方面.在选择Minitest作为其功能和表现力平衡的测试框架而不是其他恰当命名的蔬菜框架之后,我开始写这个规范:
# File ./test/specs/services/my_service_spec.rb
# Requirements for test running and configuration
require "minitest/autorun"
require "./test/specs/spec_helper"
# External requires
# Minitest Specs for EventMachine
require "em/minitest/spec"
# Internal requirements
require "./services/distribution/my_service"
# Spec start
describe "MyService", "A Gateway to an AMQP Server" do
# Connectivity
it "cannot connect to an unreachable AMQP Server" do
# This line breaks execution, commented out
# include EM::MiniTest::Spec
# ...
# (abridged) Alter the configuration by specifying …Run Code Online (Sandbox Code Playgroud) 我有一个Sinatra应用程序,我作为守护程序运行,使用Apache端口转发在端口80和端口7655之间进行调解.这在过去一直运行良好.今天不太好.我无法弄清楚为什么.
问题:sudo ruby my_process.rb退货:
/var/lib/gems/1.9.1/gems/eventmachine-1.0.0/lib/eventmachine.rb:526:in `start_tcp_server': no acceptor (port is in use or requires root privileges) (RuntimeError)
Run Code Online (Sandbox Code Playgroud)
尝试:更新所有系统包,更新所有宝石.没有帮助(来自eventmachine的更明确的错误消息除外).
当我跑步时,sudo lsof -i :7655我什么也得不回来.当我运行时,sudo ps aux我根本看不到任何 Ruby进程.鉴于错误消息的性质,我发现这是非常不规则的!
那么在找出端口不可用的原因时我有什么遗漏?
也:
尝试更换端口,没有.我想知道它是否与"localhost"有关?当我ping localhost时,我得到所有丢弃的数据包.这似乎不正常.
我正在运行一个小型sinatra应用程序,该应用程序重新使用每个员工已安装的公司范围的客户端证书(由内部SSO_CA签名).我的Sinatra/Thin组合使用由内部公司CA签署的服务器证书,但期望由SSO_CA签署的客户端证书.
从技术上讲,这是正常的,直到我们在我们的PC上获得第二个自签名客户证书.浏览器不确定要使用哪个证书并且猜测错误,大多数用户不会读取和使用新证书,这会以403错误结束.
此外,浏览器会记住该决定,您必须向许多人解释如何重置SSL状态.
=> Sinatra/Thin/Eventmachine没有提供一个选项:SSLCACertificateFiles '/usr/sinatra/certs/SSO_CA.crt'
,告诉浏览器"请出示SSO_CA的客户端证书"
Webrick有它,但这不是"生产"的正确选择.搬到Nginx感觉很奇怪,因为我不能成为第一个在Thin中遇到这个问题的人.我记得有一个地方在某个论坛(再也找不到)有人告诉我这个功能已经丢失,但是在我明白这也是我的问题之前我发现了这一点.
有没有人知道如何强制Thin/Eventmachine转发客户端证书的特定CA建议?:SSLCACertificateFiles事实并非如此,我已经尝试过了.