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 に答える