2

我尝试使用 ruby​​-smpp 发送 SMS 消息。按照项目示例和对em-redis 和 eventmachine 的一些研究,我有以下 gateway.rb 配置:

loop do
  EventMachine::run do             
    @@tx = EventMachine::connect(
      config[:host], 
      config[:port], 
      Smpp::Transceiver, 
      config, 
      self    # delegate that will receive callbacks on MOs and DRs and other events
    )

    MessageSender.next     # gets the messages from redis list and sends at each click of the EventMachine

  end
  puts "Disconnected. Reconnecting in 5 seconds.."
  sleep 5
end

MessageSender 是这个模块:

module MessageSender

  def self.redis
    @redis ||= EM::Hiredis.connect
  end

  def self.next
    redis.blpop("company-out", 0) do |item| 
      if item[1]
        message_hashed = JSON.parse(item[1])
        CompanyGateway.send_mt(message_hashed["from"], 
                               message_hashed["to"], 
                               message_hashed["message"])
      end      
      EM.next_tick(&method(:next))  
    end    
  end  

end

什么工作:我启动网关并连接到 SMSC 模拟器。我将消息添加到 redis 列表,它可以正常发送。什么中断:redis 列表中已经有值,并且运行 gateway.rb 中断并出现以下错误:

Exception in SMS Gateway: Transceiver is unbound. Cannot send MT messages. at /vagrant/lib/ruby-smpp/lib/smpp/transceiver.rb:28:in `send_mt'
/vagrant/lib/ruby-smpp/gateways/ucellgate.rb:87:in `send_mt'
/vagrant/lib/ruby-smpp/gateways/ucellgate.rb:66:in `block in next'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/em-hiredis-0.1.0/lib/em-hiredis/client.rb:149:in `block in method_missing'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/eventmachine-0.12.10/lib/em/deferrable.rb:134:in `call'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/eventmachine-0.12.10/lib/em/deferrable.rb:134:in `set_deferred_status'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/eventmachine-0.12.10/lib/em/deferrable.rb:173:in `succeed'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/em-hiredis-0.1.0/lib/em-hiredis/client.rb:75:in `block in connect'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/em-hiredis-0.1.0/lib/em-hiredis/event_emitter.rb:8:in `call'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/em-hiredis-0.1.0/lib/em-hiredis/event_emitter.rb:8:in `block in emit'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/em-hiredis-0.1.0/lib/em-hiredis/event_emitter.rb:8:in `each'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/em-hiredis-0.1.0/lib/em-hiredis/event_emitter.rb:8:in `emit'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/em-hiredis-0.1.0/lib/em-hiredis/connection.rb:21:in `receive_data'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run_machine'
/home/vagrant/.rvm/gems/ruby-1.9.2-p290/gems/eventmachine-0.12.10/lib/eventmachine.rb:256:in `run'
/vagrant/lib/ruby-smpp/gateways/ucellgate.rb:103:in `block in start'
/vagrant/lib/ruby-smpp/gateways/ucellgate.rb:102:in `loop'
/vagrant/lib/ruby-smpp/gateways/ucellgate.rb:102:in `start'
/vagrant/lib/ruby-smpp/gateways/ucellgate.rb:186:in `<main>'

无论redis列表是否为空,我都希望能够运行网关,并发送存储的消息和将来到达列表中的消息。有什么建议吗?

4

1 回答 1

0

这看起来不像是 redis 问题。异常来自 CompanyGateway.send_mt。我的猜测是,当您使用 redis 队列上的项目启动时,您会尝试在连接完成之前发送消息。

您可以尝试将初始 MessageSender.next 调用包装在 EM.add_timer(5) { MessageSender.next } 中,以将初始调用延迟几秒钟以完成连接。

于 2011-12-28T05:57:47.337 回答