Cramp フレームワークを Redis gem と em-synchrony および WebSockets と共に使用して、チャット関連の Web アプリケーションを構築していますが、いくつか問題があります。
次のコードを検討してください。
class DrawingAction < Cramp::Action
use_fiber_pool
self.transport = :websocket
on_start :user_joined
on_data :message_received
on_finish :user_left
def user_joined
# Create pub/sub clients for the user who just joined
initialize_pub_sub
end
def initialize_pub_sub
@@redis_client ||= Redis.new(:driver => :synchrony)
@publisher ||= Redis.new(:driver => :synchrony)
@subscriber ||= Redis.new(:driver => :synchrony)
end
def handle_join(join_data)
room_name = join_data[:room_name]
@subscriber.subscribe(room_name) do |on|
on.message do |channel, message|
render message
end
end
puts "fetching history items"
history_items = history_for_room(room_name)
render "{ \"history\": true, \"time:\": #{Time.now.to_f}, \"data\": [#{history_items.join(',')}] }"
end
handle_join
私の Cramp アクションのイベント ハンドラーから呼び出されていon_message
ます。cramp は同期とファイバーをサポートしているため、クライアントがチャネルに参加した後、@subscriber.subscribe ブロックは本来のようにノンブロッキングとして動作します。つまり、pubsub でフェッチされたメッセージを受け入れることを意味します。チャネル、およびプロセス内の他のすべてをブロックしません (アプリケーションはブロックされません)、しかし、次の行に移動しません ( puts "fetching history items"
) 私にとって大きな問題です。この問題を修正するには?