2011-12-28 3 views
2

У меня есть попытка отправить SMS-сообщения с ruby-smpp. Следуя примеры проектов и некоторые исследования в em-redis and eventmachine, у меня есть следующие конфигурации gateway.rb:Отправка сообщений с помощью Eventmachine и EM-Redis в ruby-smpp

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 пуст или нет, и отправьте как сохраненные сообщения, так и те, которые поступают в список в будущем. Любой совет?

ответ

0

Это не похоже на проблему redis. Исключение исходит от CompanyGateway.send_mt. Я предполагаю, что при запуске с элементами в очереди redis вы пытаетесь отправить сообщения до завершения соединения.

Вы можете попробовать обернуть начальный вызов MessageSender.next в EM.add_timer (5) {MessageSender.next}, чтобы задержать начальный вызов за несколько секунд, чтобы завершить соединение.

+0

Вы были правы, спасибо! – Bek

 Смежные вопросы

  • Нет связанных вопросов^_^