Skip to content

Instantly share code, notes, and snippets.

@StephanieSunshine
Last active December 21, 2015 08:09
Show Gist options
  • Save StephanieSunshine/6276507 to your computer and use it in GitHub Desktop.
Save StephanieSunshine/6276507 to your computer and use it in GitHub Desktop.
I'm trying to subscribe to a redis server and have it echo what it hears to all the active websockets. I've been looking at example https://github.com/redis/redis-rb/blob/master/examples/pubsub.rb and https://github.com/celluloid/reel/blob/master/examples/websockets.rb. I'm using rubinius build just yesterday
require 'rubygems'
require 'bundler/setup'
require 'reel'
require 'celluloid/autostart'
require 'celluloid/redis'
require 'redis'
class TimeServer
include Celluloid
include Celluloid::Notifications
def initialize
async.run
@redis = Redis.new(:driver => :celluloid)
end
def run
# now = Time.now.to_f
# sleep now.ceil - now + 0.001
# every(1) { publish 'time_change', Time.now }
begin
@redis.subscribe(:one) do |on|
on.subscribe do |channel, subscriptions|
puts "Subscribed to ##{channel} (#{subscriptions} subscriptions)"
end
on.message do |channel, message|
publish 'time_change', message
#puts "##{channel}: #{message}"
#redis.unsubscribe if message == "exit"
end
on.unsubscribe do |channel, subscriptions|
puts "Unsubscribed from ##{channel} (#{subscriptions} subscriptions)"
end
end
rescue Redis::BaseConnectionError => error
puts "#{error}, retrying in 1s"
sleep 1
retry
end
end
end
class TimeClient
include Celluloid
include Celluloid::Notifications
include Celluloid::Logger
def initialize(websocket)
info "Streaming time changes to client"
@socket = websocket
subscribe('time_change', :notify_time_change)
end
def notify_time_change(topic, new_time)
@socket << new_time.inspect
rescue Reel::SocketError
info "Time client disconnected"
terminate
end
end
class WebServer < Reel::Server
include Celluloid::Logger
def initialize(host = "0.0.0.0", port = 1234)
info "Time server example starting on #{host}:#{port}"
super(host, port, &method(:on_connection))
end
def on_connection(connection)
while request = connection.request
case request
when Reel::Request
route_request connection, request
when Reel::WebSocket
info "Received a WebSocket connection"
route_websocket request
end
end
end
def route_request(connection, request)
if request.url == "/"
return render_index(connection)
end
info "404 Not Found: #{request.path}"
connection.respond :not_found, "Not found"
end
def route_websocket(socket)
if socket.url == "/timeinfo"
TimeClient.new(socket)
else
info "Received invalid WebSocket request for: #{socket.url}"
socket.close
end
end
def render_index(connection)
info "200 OK: /"
connection.respond :ok, <<-HTML
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Reel WebSockets time server example</title>
<style>
body {
font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
font-weight: 300;
text-align: center;
}
#content {
width: 800px;
margin: 0 auto;
background: #EEEEEE;
padding: 1em;
}
</style>
</head>
<script>
var SocketKlass = "MozWebSocket" in window ? MozWebSocket : WebSocket;
var ws = new SocketKlass('ws://' + window.location.host + '/timeinfo');
ws.onmessage = function(msg){
document.getElementById('current-time').innerHTML = msg.data;
}
</script>
<body>
<div id="content">
<h1>Time Server Example</h1>
<div>The time is now: <span id="current-time">...</span></div>
</div>
</body>
</html>
HTML
end
end
TimeServer.supervise_as :time_server
WebServer.supervise_as :reel
sleep
joshua@wopr:~/freetable/chatserver/celluloid/test1$ ./chat-server.rb
E, [2013-08-19T20:02:02.271027 #18585] ERROR -- : TimeServer crashed!
NoMethodError: undefined method `new' on Celluloid::Redis (Module)
kernel/delta/kernel.rb:81:in `new (method_missing)'
./chat-server.rb:16:in `initialize'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:25:in `dispatch'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:67:in `dispatch'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/actor.rb:326:in `handle_message'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:42:in `initialize'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks/task_fiber.rb:11:in `create'
kernel/bootstrap/proc.rb:22:in `call'
E, [2013-08-19T20:02:02.271341 #18585] ERROR -- : Celluloid::SupervisionGroup crashed!
NoMethodError: undefined method `new' on Celluloid::Redis (Module)
kernel/delta/kernel.rb:81:in `new (method_missing)'
./chat-server.rb:16:in `initialize'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:25:in `dispatch'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:67:in `dispatch'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/actor.rb:326:in `handle_message'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:42:in `initialize'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks/task_fiber.rb:11:in `create'
kernel/bootstrap/proc.rb:22:in `call'
(celluloid):0:in `remote procedure call'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:95:in `value'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/proxies/sync_proxy.rb:28:in `method_missing'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/legacy.rb:0:in `method_missing'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/proxies/actor_proxy.rb:25:in `_send_'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid.rb:140:in `new_link'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:136:in `start'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:124:in `initialize'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:82:in `add'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:73:in `supervise_as'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:25:in `dispatch'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:67:in `dispatch'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/actor.rb:326:in `handle_message'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:42:in `initialize'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks/task_fiber.rb:11:in `create'
An exception occurred running ./chat-server.rb
task was terminated (Celluloid::Task::TerminatedError)
Backtrace:
Celluloid::Task(Celluloid::TaskFiber)#suspend at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:61
Celluloid::Task.suspend at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:19
Celluloid.suspend at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid.rb:60
Celluloid::SyncCall#value at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:95
Celluloid::SyncProxy(Celluloid::ActorProxy)#method_missing at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/proxies/sync_proxy.rb:28
Celluloid::ActorProxy#supervise_as (method_missing) at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/legacy.rb:14
{ } in Celluloid::Supervisor.supervise_as at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervisor.rb:17
Celluloid::SupervisionGroup#initialize at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:63
Celluloid::Call(Celluloid::SyncCall)#dispatch at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:25
Celluloid::SyncCall#dispatch at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:67
{ } in Celluloid::Actor#handle_message at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/actor.rb:326
{ } in Celluloid::Task(Celluloid::TaskFiber)#initialize at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:42
{ } in Celluloid::TaskFiber#create at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks/task_fiber.rb:11
Proc#call at kernel/bootstrap/proc.rb:22
D, [2013-08-19T20:02:02.278390 #18585] DEBUG -- : Terminating 4 actors...
D, [2013-08-19T20:02:02.279416 #18585] DEBUG -- : Shutdown completed cleanly
@StephanieSunshine
Copy link
Author

E, [2013-08-19T19:35:10.120147 #18497] ERROR -- : TimeServer crashed!
NoMethodError: undefined method new' on Celluloid::Redis (Module) kernel/delta/kernel.rb:81:innew (method_missing)'
./chat-server.rb:16:in initialize' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:25:indispatch'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:67:in dispatch' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/actor.rb:326:inhandle_message'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:42:in initialize' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks/task_fiber.rb:11:increate'
kernel/bootstrap/proc.rb:22:in call' (celluloid):0:inremote procedure call'
E, [2013-08-19T19:35:10.120457 #18497] ERROR -- : Celluloid::SupervisionGroup crashed!
NoMethodError: undefined method new' on Celluloid::Redis (Module) kernel/delta/kernel.rb:81:innew (method_missing)'
./chat-server.rb:16:in initialize' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:25:indispatch'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:67:in dispatch' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/actor.rb:326:inhandle_message'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:42:in initialize' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks/task_fiber.rb:11:increate'
kernel/bootstrap/proc.rb:22:in call' (celluloid):0:inremote procedure call'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:95:in value' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/proxies/sync_proxy.rb:28:inmethod_missing'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/legacy.rb:0:in method_missing' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/proxies/actor_proxy.rb:25:insend'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid.rb:140:in new_link' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:136:instart'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:124:in initialize' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:82:inadd'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:73:in supervise_as' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:25:indispatch'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:67:in dispatch' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/actor.rb:326:inhandle_message'
/usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:42:in initialize' /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks/task_fiber.rb:11:increate'
An exception occurred running ./chat-server.rb
task was terminated (Celluloid::Task::TerminatedError)

Backtrace:
Celluloid::Task(Celluloid::TaskFiber)#suspend at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:61
Celluloid::Task.suspend at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:19
Celluloid.suspend at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid.rb:60
Celluloid::SyncCall#value at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:95
Celluloid::SyncProxy(Celluloid::ActorProxy)#method_missing at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/proxies/sync_proxy.rb:28
Celluloid::ActorProxy#supervise_as (method_missing) at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/legacy.rb:14
{ } in Celluloid::Supervisor.supervise_as at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervisor.rb:17
Celluloid::SupervisionGroup#initialize at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/supervision_group.rb:63
Celluloid::Call(Celluloid::SyncCall)#dispatch at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:25
Celluloid::SyncCall#dispatch at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/calls.rb:67
{ } in Celluloid::Actor#handle_message at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/actor.rb:326
{ } in Celluloid::Task(Celluloid::TaskFiber)#initialize at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks.rb:42
{ } in Celluloid::TaskFiber#create at /usr/rubinius/2.0/gems/gems/celluloid-0.14.1/lib/celluloid/tasks/task_fiber.rb:11
Proc#call at kernel/bootstrap/proc.rb:22
D, [2013-08-19T19:35:10.131110 #18497] DEBUG -- : Terminating 4 actors...
D, [2013-08-19T19:35:10.131781 #18497] DEBUG -- : Shutdown completed cleanly

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment