我试图用ruby-smpp发送短信。根据项目示例和对em-redis and 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列表是否为空,并且将来发送存储的消息和到达列表的消息。有什么建议吗?
答案 0 :(得分:0)
这看起来不像redis问题。例外来自CompanyGateway.send_mt。我的猜测是,当你在redis队列上启动项目时,你会尝试在连接完成之前发送消息。
您可以尝试在EM.add_timer(5){MessageSender.next}中包装初始MessageSender.next调用,以将初始调用延迟几秒钟以允许连接完成。