Faye ruby​​客户端只发布一次

Faye ruby​​客户端只发布一次,第1张

概述我有一个在localhost上运行的faye服务器(nodejs),我正在尝试设置一个服务器端 ruby客户端,它需要定期在服务器上发布.这是我试图使用的代码. (请忽略开头的评论代码). 我创建了一个类变量@@ client,并在类加载后立即初始化它.我定义了一个类方法pub,其任务是在faye服务器上发布一些东西. 最后,我只是调用pub方法两次.第一个发布回调已成功接收,但第二个发布不会进行 我有一个在localhost上运行的faye服务器(nodeJs),我正在尝试设置一个服务器端 ruby客户端,它需要定期在服务器上发布.这是我试图使用的代码.
(请忽略开头的评论代码).
我创建了一个类变量@@ clIEnt,并在类加载后立即初始化它.我定义了一个类方法pub,其任务是在faye服务器上发布一些东西.
最后,我只是调用pub方法两次.第一个发布回调已成功接收,但第二个发布不会进行回调或错误回复.由于控件尚未返回给应用程序,因此该应用程序就会挂起.
如果我将gobal变量$clIEnt(当前已注释),则行为是相同的.但是如果我每次调用pub都会创建客户端,那么发布会顺利进行.我在EM.run循环或外部启动它,行为是相同的. (如预期的那样)

每次我想发布一些东西都不想建立新的连接,因为这会破坏目的.此外,如果我每次调用方法时都在EM.run中创建一个新客户端,则客户端连接不会自行关闭.我可以看到它们在lsof命令中打开作为打开文件,很快我就会开始得到太多打开的文件错误.

我没有真正理解Event Machine,也许我错过了那里的东西.

require 'faye'require 'eventmachine'# $clIEnt = Faye::ClIEnt.new('http://localhost:5050/faye')class FayeclIEnt  puts "#{__liNE__}: Reactor running: " + EM.reactor_running?.to_s  # if !defined? @@clIEnt or @@clIEnt.nil?    @@clIEnt = Faye::ClIEnt.new('http://localhost:5050/faye')    puts "Created clIEnt: " + @@clIEnt.inspect  # end  def self.pub    puts "#{__liNE__}: Reactor running: " + EM.reactor_running?.to_s    # clIEnt = Faye::ClIEnt.new('http://localhost:5050/faye') #$clIEnt    # clIEnt = @@clIEnt    EM.run {      #clIEnt = Faye::ClIEnt.new('http://localhost:5050/faye') #$clIEnt      puts "#{__liNE__}: Reactor running: " + EM.reactor_running?.to_s      puts @@clIEnt.inspect      publication = @@clIEnt.publish('/foo','text' =>'Hello world')      puts "Publishing: #{publication.inspect}"      # puts "Publication methods: #{publication.methods}"      publication.callback do        puts "DID it #{publication.inspect}"        EM.stop_event_loop        puts "#{__liNE__}: Reactor running: " + EM.reactor_running?.to_s        # puts "#{clIEnt.methods}"#        puts clIEnt.inspect#        clIEnt.remove_all_Listeners#        puts clIEnt.inspect      end      publication.errback do |error |          puts error.inspect          EM.stop_event_loop      end    }    puts "OutsIDe event loop"    puts "#{__liNE__}: Reactor running: " + EM.reactor_running?.to_s  endendFayeclIEnt.pubFayeclIEnt.pub
解决方法 EM.run调用是阻塞的,你必须在一个单独的线程上运行它,并最终在一切结束时加入它.在示例中,我使用的是 Singleton,但这取决于您.

这正确地完成了2次faye电话.

#!/usr/bin/env ruby#require 'faye'require 'singleton'require 'eventmachine'class FayeclIEnt  include Singleton  attr_accessor :em_thread,:clIEnt  def initialize    self.em_thread = Thread.new do      EM.run    end    self.clIEnt = Faye::ClIEnt.new('http://localhost:8890/faye')  end  def pub    puts "#{__liNE__}: Reactor running: " + EM.reactor_running?.to_s    puts clIEnt.inspect    publication = clIEnt.publish('/foo','text' =>'Hello world')    puts "Publishing: #{publication.inspect}"    publication.callback do      puts "DID it #{publication.inspect}"      EM.stop_event_loop      puts "#{__liNE__}: Reactor running: " + EM.reactor_running?.to_s    end    publication.errback do |error |        puts error.inspect        EM.stop_event_loop    end  endendFayeclIEnt.instance.pubFayeclIEnt.instance.pubFayeclIEnt.instance.em_thread.join

根据我的个人经验,无论如何,不​​得不在Rails应用程序中处理EventMachine可能是一团糟,一些Web服务器使用EM,其他情况则不然,当您想要从控制台进行测试时,它可能无法按预期工作.

我的解决方案是回退到http调用:

RestClIEnt.post "http://localhost:#{Rails.configuration.faye_port}/faye",message: {foo: 'bar'}.to_Json

如果您不需要从这段代码接收消息,我发现这个解决方案更简单,更容易定制.

总结

以上是内存溢出为你收集整理的Faye ruby​​客户端只发布一次全部内容,希望文章能够帮你解决Faye ruby​​客户端只发布一次所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1286747.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-09
下一篇2022-06-09

发表评论

登录后才能评论

评论列表(0条)

    保存