2013-04-29 32 views
5

Tôi đang sử dụng private_pub để triển khai một ứng dụng giống như trò chuyện một-một.Ruby on Rails - Khung Faye - private_pub

Dưới đây là câu chuyện của tôi: khi một người sử dụng, tôi muốn nhận được một tin nhắn khi đối tác của tôi rời khỏi cuộc trò chuyện - đóng cửa sổ, vv

Nhìn qua các Faye Monitoring docs đây là nỗ lực của tôi ở bắt buộc đối với unsubscribe:


# Run with: rackup private_pub.ru -s thin -E production 
require "bundler/setup" 
require "yaml" 
require "faye" 
require "private_pub" 
require "active_support/core_ext" 

Faye::WebSocket.load_adapter('thin') 

PrivatePub.load_config(File.expand_path("../config/private_pub.yml", __FILE__),  ENV["RAILS_ENV"] || "development") 

wts_pubsub = PrivatePub.faye_app 

wts_pubsub.bind(:subscribe) do |client_id, channel| 
puts "[#{Time.now}] Client #{client_id} joined #{channel}" 
end 

wts_pubsub.bind(:unsubscribe) do |client_id, channel| 
    puts "[#{Time.now}] Client #{client_id} disconnected from #{channel}" 
    PrivatePub.publish_to channel, { marius_says: 'quitter' } 
end 

run wts_pubsub 

nhưng tôi cứ bị timeout: [ERROR] [Faye::RackAdapter] Timeout::Error

Tò mò vào PrivatePub#publish_to, dữ liệu chứa những gì tôi mong đợi cả khi tôi xuất bản từ Rails hoặc ứng dụng private_pub nhưng ứng dụng private_pub vẫn bị treo.

Tôi làm cách nào để xuất bản từ private_pub hoạt động?

+0

Chủ đề này hơi cũ; bạn đã tìm ra vấn đề là gì chưa? Tôi đã dành hàng giờ cho vấn đề chính xác này mà không thành công nhiều. – Etienne

Trả lời

0

Ràng buộc thứ hai của bạn phải là disconnect sự kiện thay vì unsubscribe.

Ngoài ra, hãy nhớ tắt sự kiện Faye/PrivatePub disconnect trong mã phía máy khách của bạn khi cửa sổ trình duyệt bị đóng.

Lưu ý: Bạn có thể cần phải làm điều này cho tất cả các phiên mở với máy chủ Faye hoặc chỉ trên một kênh theo từng kênh dựa trên thiết kế trò chuyện ứng dụng của

Trong đồng bằng JS này có thể là một cái gì đó như:

window.onbeforeunload = functionThatTriggersFayeDisconnectEvent; 

Xin lỗi vì không sử dụng đánh dấu thích hợp, đăng từ thiết bị di động.

+0

Cả hai sự kiện 'disconnect' và' unsubscribe' sẽ tự động được kích hoạt khi đóng tab - đây là [private_pub.rb đã sửa đổi] (https://gist.github.com/mariusbutuc/8cdd6d71e7595a2fb814#file-private_pub-rb) và [ sản lượng của nó] (https://gist.github.com/mariusbutuc/8cdd6d71e7595a2fb814#file-private_pub-out). Dường như không giải quyết được vấn đề của OP. –

0

Sau giờ nghiên cứu và rất nhiều nỗ lực, đây là giải pháp tôi tìm thấy:

Thay PrivatePub.publish_to channel, { marius_says: 'quitter' } với:

system "curl http://localhost:9292/faye -d 'message={\"channel\":\"#{channel}\", \"data\":{\"channel\":\"#{channel}\",\"data\":{\"message\":{\"content\":\"#{client_id} disconnected from this channel.\"}}}, \"ext\":{\"private_pub_token\":\"ADD_APPROPRIATE_SECRET_HERE\"}}' &" 

này sẽ kích hoạt một yêu cầu không đồng bộ (curl + &) mà sẽ bỏ qua các vấn đề . Không phải là sửa chữa tốt nhất, nhưng nó hoạt động.