dango 0.0.36 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/LICENSE +16 -0
- data/Manifest.txt +1 -1
- data/lib/dango/framework_base.rb +1 -1
- data/lib/dango/monitor/dango_monitor_client.rb +28 -9
- data/lib/dango/monitor/server_monitor_action.rb +37 -13
- data/lib/dango/server_framework.rb +81 -53
- data/lib/dango/version.rb +1 -1
- metadata +3 -3
- data/MIT-LICENSE +0 -21
data/LICENSE
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
Copyright (C) 2007 Keisuke Minami
|
2
|
+
|
3
|
+
This library is free software; you can redistribute it and/or
|
4
|
+
modify it under the terms of the GNU Lesser General Public
|
5
|
+
License as published by the Free Software Foundation; either
|
6
|
+
version 2.1 of the License, or (at your option) any later version.
|
7
|
+
|
8
|
+
This library is distributed in the hope that it will be useful,
|
9
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
10
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
11
|
+
Lesser General Public License for more details.
|
12
|
+
|
13
|
+
You should have received a copy of the GNU Lesser General Public
|
14
|
+
License along with this library; if not, write to the Free Software
|
15
|
+
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
16
|
+
|
data/Manifest.txt
CHANGED
data/lib/dango/framework_base.rb
CHANGED
@@ -162,7 +162,7 @@ module DangoFrameworkModule
|
|
162
162
|
if size_str == "<polic"
|
163
163
|
logger.debug "size_str=#{size_str.inspect}"
|
164
164
|
receive_data = sock.recv(18)
|
165
|
-
logger.
|
165
|
+
logger.info "flash policy file: dango_receive_data:receive_data=#{receive_data}"
|
166
166
|
raise(DangoFrameworkFlashPolicyError)
|
167
167
|
end
|
168
168
|
|
@@ -10,9 +10,8 @@
|
|
10
10
|
|
11
11
|
require 'dango/client_framework' # コネクションサーバーフレームワークの呼び出し
|
12
12
|
|
13
|
-
#
|
14
13
|
|
15
|
-
#
|
14
|
+
# モニター用のdangoクライアントクラス
|
16
15
|
class DangoMonitorClient < DangoClientFramework
|
17
16
|
ConnTimeout = 6
|
18
17
|
|
@@ -35,22 +34,42 @@ class DangoMonitorClient < DangoClientFramework
|
|
35
34
|
# 読み込みのみ
|
36
35
|
attr_reader(:is_session_closed)
|
37
36
|
|
38
|
-
#
|
39
|
-
def
|
40
|
-
logger.debug "DangoMonitorClient
|
37
|
+
# 情報取得系の処理を整理したもの
|
38
|
+
def get_server_info_common(monitor_action_name)
|
39
|
+
logger.debug "DangoMonitorClient:#{monitor_action_name}:#{ENV['RAILS_ROOT']}"
|
41
40
|
begin
|
42
|
-
ret_obj = send_action_return_notice(
|
41
|
+
ret_obj = send_action_return_notice("_monitor_#{monitor_action_name}", {})
|
43
42
|
raise("code is not 0 (faild). :code=#{ret_obj['code']}") if ret_obj['code'] != 0
|
44
|
-
return(ret_obj[
|
43
|
+
return(ret_obj[monitor_action_name])
|
45
44
|
rescue DangoFrameworkConnectionError
|
46
|
-
raise("
|
45
|
+
raise("#{monitor_action_name} Connection error")
|
47
46
|
rescue DangoFrameworkTimeoutError
|
48
|
-
raise("
|
47
|
+
raise("#{monitor_action_name} Timeout error")
|
49
48
|
ensure
|
50
49
|
dango_client_close
|
51
50
|
end
|
52
51
|
end
|
53
52
|
|
53
|
+
# サーバーの情報取得
|
54
|
+
def get_server_info
|
55
|
+
get_server_info_common("get_server_info")
|
56
|
+
end
|
57
|
+
|
58
|
+
# sharedの情報取得
|
59
|
+
def get_shared
|
60
|
+
get_server_info_common("get_shared")
|
61
|
+
end
|
62
|
+
|
63
|
+
# session_listの情報取得
|
64
|
+
def get_session_list
|
65
|
+
get_server_info_common("get_session_list")
|
66
|
+
end
|
67
|
+
|
68
|
+
# socket_listの情報取得
|
69
|
+
def get_socket_list
|
70
|
+
get_server_info_common("get_socket_list")
|
71
|
+
end
|
72
|
+
|
54
73
|
# サーバーのデータリロード
|
55
74
|
def server_reload
|
56
75
|
logger.debug "DangoMonitorClient:server_reload"
|
@@ -26,8 +26,17 @@ class ServerMonitorAction
|
|
26
26
|
if action_name == '_monitor_all_info' # メンテナンスアクション名なら
|
27
27
|
dango_server_monitor_all_info(ret_obj)
|
28
28
|
|
29
|
-
elsif action_name == '
|
30
|
-
|
29
|
+
elsif action_name == '_monitor_get_server_info' # メンテナンスアクション名なら
|
30
|
+
dango_server_monitor_get_server_info(ret_obj)
|
31
|
+
|
32
|
+
elsif action_name == '_monitor_get_shared' # メンテナンスアクション名なら
|
33
|
+
dango_server_monitor_get_shared(ret_obj)
|
34
|
+
|
35
|
+
elsif action_name == '_monitor_get_session_list' # メンテナンスアクション名なら
|
36
|
+
dango_server_monitor_get_session_list(ret_obj)
|
37
|
+
|
38
|
+
elsif action_name == '_monitor_get_socket_list' # メンテナンスアクション名なら
|
39
|
+
dango_server_monitor_get_socket_list(ret_obj)
|
31
40
|
|
32
41
|
elsif action_name == '_monitor_send_system_message' # メンテナンスアクション名なら
|
33
42
|
dango_server_monitor_send_system_message(ret_obj)
|
@@ -68,13 +77,9 @@ class ServerMonitorAction
|
|
68
77
|
end
|
69
78
|
|
70
79
|
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
71
|
-
def
|
72
|
-
logger.debug "
|
73
|
-
|
74
|
-
'shareds' => shared.to_hash,
|
75
|
-
'socket_list' => socket_list.keys,
|
76
|
-
'session_list' => session_list,
|
77
|
-
|
80
|
+
def dango_server_monitor_get_server_info(ret_obj)
|
81
|
+
logger.debug "dango_server_monitor_get_server_info:#{ret_obj.inspect}"
|
82
|
+
get_server_info = {
|
78
83
|
'server_start_time' => @parent.start_time.strftime("%Y-%m-%d %H:%M:%S"),
|
79
84
|
'up_time' => Time.now - @parent.start_time,
|
80
85
|
|
@@ -87,12 +92,31 @@ class ServerMonitorAction
|
|
87
92
|
'log_file' => @parent.log_file,
|
88
93
|
'log_max_size' => @parent.log_max_size,
|
89
94
|
'log_shift_age' => @parent.log_shift_age,
|
90
|
-
|
91
|
-
# 'dummy' => "dummy "*1000, # ダミー情報
|
92
95
|
}
|
93
96
|
|
94
|
-
send_obj = {'code'=>0, '
|
95
|
-
@parent.send_notice(session[:sid], '
|
97
|
+
send_obj = {'code'=>0, 'get_server_info'=>get_server_info}
|
98
|
+
@parent.send_notice(session[:sid], 'return__monitor_get_server_info', send_obj, :type=>2)
|
99
|
+
end
|
100
|
+
|
101
|
+
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
102
|
+
def dango_server_monitor_get_shared(ret_obj)
|
103
|
+
logger.debug "dango_server_monitor_get_shared:#{ret_obj.inspect}"
|
104
|
+
send_obj = {'code'=>0, 'get_shared'=>shared.to_hash}
|
105
|
+
@parent.send_notice(session[:sid], 'return__monitor_get_shared', send_obj, :type=>2)
|
106
|
+
end
|
107
|
+
|
108
|
+
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
109
|
+
def dango_server_monitor_get_session_list(ret_obj)
|
110
|
+
logger.debug "dango_server_monitor_get_session_list:#{ret_obj.inspect}"
|
111
|
+
send_obj = {'code'=>0, 'get_session_list'=>session_list}
|
112
|
+
@parent.send_notice(session[:sid], 'return__monitor_get_session_list', send_obj, :type=>2)
|
113
|
+
end
|
114
|
+
|
115
|
+
# メンテナンスコマンド:サーバーからクライアントへのデータ送信
|
116
|
+
def dango_server_monitor_get_socket_list(ret_obj)
|
117
|
+
logger.debug "dango_server_monitor_get_socket_list:#{ret_obj.inspect}"
|
118
|
+
send_obj = {'code'=>0, 'get_socket_list'=>socket_list.keys}
|
119
|
+
@parent.send_notice(session[:sid], 'return__monitor_get_socket_list', send_obj, :type=>2)
|
96
120
|
end
|
97
121
|
|
98
122
|
# メンテナンスコマンド:サーバーデータ再読み込み
|
@@ -36,6 +36,7 @@ class DangoServerFramework
|
|
36
36
|
HeartBeatReceiveWaitSec = 30.0 # C=>Sのheart beatの受信待ち秒数
|
37
37
|
GCIntervalSec = 5.0 # GCの発生タイミング
|
38
38
|
|
39
|
+
ServerStopWait = 0.2 # サーバー停止時のGServerの確認待ち時間
|
39
40
|
|
40
41
|
class DangoGServer < GServer
|
41
42
|
def initialize(parent, *args)
|
@@ -56,14 +57,37 @@ class DangoServerFramework
|
|
56
57
|
end
|
57
58
|
|
58
59
|
def starting()
|
60
|
+
log("#{self.class.to_s} #{@host}:#{@port} start")
|
59
61
|
@parent.starting()
|
60
62
|
end
|
61
63
|
|
62
64
|
def stopping()
|
65
|
+
log("#{self.class.to_s} #{@host}:#{@port} stop")
|
63
66
|
@parent.stopping()
|
64
67
|
end
|
65
68
|
end
|
66
69
|
|
70
|
+
def exit_process() # プロセス終了処理
|
71
|
+
# サーバーを停止
|
72
|
+
if @gserver && !@gserver.stopped?
|
73
|
+
@gserver.shutdown
|
74
|
+
@gserver.stop
|
75
|
+
# while(!@gserver.stopped?) do
|
76
|
+
# sleep ServerStopWait
|
77
|
+
# debug_print("waiting... #{@gserver.stopped?} #{@gserver.connections}")
|
78
|
+
# end
|
79
|
+
10.times do
|
80
|
+
break if @gserver.stopped?
|
81
|
+
sleep ServerStopWait
|
82
|
+
debug_print("waiting... #{@gserver.stopped?} #{@gserver.connections}")
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
debug_print("shutdown")
|
87
|
+
puts "shutdown"
|
88
|
+
exit!
|
89
|
+
end
|
90
|
+
|
67
91
|
def initialize(config)
|
68
92
|
@config = config # 設定ファイル
|
69
93
|
|
@@ -72,18 +96,12 @@ class DangoServerFramework
|
|
72
96
|
|
73
97
|
# SIGINT の捕捉
|
74
98
|
Signal.trap(:INT) do
|
75
|
-
#
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
debug_print("waiting... #{@gserver.stopped?} #{@gserver.connections}")
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
puts "shutdown"
|
86
|
-
exit!
|
99
|
+
exit_process() # プロセス終了処理
|
100
|
+
end
|
101
|
+
|
102
|
+
# 終了処理を登録しておく(これが無いとWindowsではエラーが出てもプロセスが落ちないことがある)
|
103
|
+
at_exit do
|
104
|
+
exit_process() # プロセス終了処理
|
87
105
|
end
|
88
106
|
|
89
107
|
# サーバー開始
|
@@ -107,11 +125,11 @@ class DangoServerFramework
|
|
107
125
|
def server_start()
|
108
126
|
set_server_variables() # 各種サーバー仕様の変数設定
|
109
127
|
|
110
|
-
logger.
|
111
|
-
logger.
|
112
|
-
logger.
|
113
|
-
logger.
|
114
|
-
logger.
|
128
|
+
logger.warn("===== server initialize =====") # loggerの準備
|
129
|
+
logger.warn("Process.pid=#{Process.pid}")
|
130
|
+
logger.warn("port=#{@server_port}")
|
131
|
+
logger.warn("host=#{@server_host}")
|
132
|
+
logger.warn("max_connections=#{@server_max_connections}")
|
115
133
|
|
116
134
|
open("tmp/pids/dango.pid", "wb"){|fh| fh.write Process.pid.to_s }
|
117
135
|
|
@@ -171,7 +189,7 @@ class DangoServerFramework
|
|
171
189
|
@gserver.shutdown
|
172
190
|
@gserver.stop
|
173
191
|
while(!@gserver.stopped?) do
|
174
|
-
sleep
|
192
|
+
sleep ServerStopWait
|
175
193
|
debug_print("waiting... #{@gserver.stopped?} #{@gserver.connections}")
|
176
194
|
end
|
177
195
|
|
@@ -270,7 +288,7 @@ class DangoServerFramework
|
|
270
288
|
# メインループ入り
|
271
289
|
loop do
|
272
290
|
if sock.closed?
|
273
|
-
logger.
|
291
|
+
logger.info "#{sock.inspect}:sock is closed..."
|
274
292
|
break
|
275
293
|
end
|
276
294
|
|
@@ -283,7 +301,7 @@ class DangoServerFramework
|
|
283
301
|
end
|
284
302
|
|
285
303
|
if is_flash_policy_file && @policy_file_request # Flashのポリシーファイルが来たら
|
286
|
-
logger.
|
304
|
+
logger.info "is_flash_policy_file #{sid} "
|
287
305
|
policy_data = '<?xml version="1.0"?><cross-domain-policy><allow-access-from domain="*" to-ports="*" /></cross-domain-policy>' + "\0" + "\n"
|
288
306
|
logger.debug policy_data
|
289
307
|
sock.write policy_data
|
@@ -296,7 +314,7 @@ class DangoServerFramework
|
|
296
314
|
|
297
315
|
else # 受信データがあれば
|
298
316
|
if !(ret_obj && ret_obj["action"]) # actionが無い場合はエラー
|
299
|
-
logger.
|
317
|
+
logger.warn "no action error:#{ret_obj.inspect}"
|
300
318
|
raise(DangoFrameworkError, "no action error")
|
301
319
|
end
|
302
320
|
|
@@ -313,7 +331,7 @@ class DangoServerFramework
|
|
313
331
|
ServerMonitorAction.new(self, @config, sock, ret_obj)
|
314
332
|
|
315
333
|
else # メンテナンスコマンド以外のユーザーアクション名なら
|
316
|
-
logger.
|
334
|
+
logger.info "receive_action:#{sid}:#{action_name}:"
|
317
335
|
begin
|
318
336
|
__send__("dango_receive_#{action_name}", ret_obj)
|
319
337
|
rescue NoMethodError
|
@@ -328,10 +346,10 @@ class DangoServerFramework
|
|
328
346
|
end # loop
|
329
347
|
|
330
348
|
rescue DangoFrameworkFlashPolicyError
|
331
|
-
logger.
|
349
|
+
logger.info "Flash policy file send. #{sid} "
|
332
350
|
|
333
351
|
rescue DangoFrameworkMonitorSecurityError
|
334
|
-
logger.
|
352
|
+
logger.warn "Monitor Security Error #{sid} "
|
335
353
|
|
336
354
|
rescue DangoFrameworkReadNoDataError
|
337
355
|
@recv_fail_count += 1 if @recv_fail_count # 受信失敗回数カウント
|
@@ -351,10 +369,10 @@ class DangoServerFramework
|
|
351
369
|
logger.error "Exception #{sid} #{error_message($!, 'u')}"
|
352
370
|
|
353
371
|
ensure
|
354
|
-
logger.info "#{sock.inspect} #{sid} is closing"
|
355
372
|
|
356
373
|
@mutex_proc_thread.synchronize do
|
357
374
|
begin
|
375
|
+
logger.info "#{sock.inspect} #{sid} is closing"
|
358
376
|
dango_close() # 接続解除時に呼び出されるメソッド
|
359
377
|
rescue Exception
|
360
378
|
logger.error "#{sock.inspect} #{sid} ERROR\n#{error_message($!, 'u')}"
|
@@ -363,15 +381,15 @@ class DangoServerFramework
|
|
363
381
|
begin
|
364
382
|
sock.close if !sock.closed? # ソケットを閉じる
|
365
383
|
rescue IOError
|
366
|
-
logger.
|
384
|
+
logger.error "IOError #{sock} #{sid}"
|
367
385
|
end
|
368
386
|
|
369
387
|
logger.info "#{sock.inspect} #{sid} is closed"
|
388
|
+
|
389
|
+
session_del()
|
370
390
|
end
|
371
|
-
|
372
391
|
end
|
373
392
|
|
374
|
-
session_del()
|
375
393
|
end
|
376
394
|
end
|
377
395
|
|
@@ -426,10 +444,10 @@ class DangoServerFramework
|
|
426
444
|
|
427
445
|
|
428
446
|
@start_time = Time.now # サーバー起動時間
|
429
|
-
@recv_count = 0
|
430
|
-
@send_count = 0
|
431
|
-
@recv_fail_count = 0
|
432
|
-
@send_fail_count = 0
|
447
|
+
@recv_count = 0 # 受信回数
|
448
|
+
@send_count = 0 # 送信回数
|
449
|
+
@recv_fail_count = 0 # 受信失敗回数
|
450
|
+
@send_fail_count = 0 # 送信失敗回数
|
433
451
|
end
|
434
452
|
|
435
453
|
attr_reader(:start_time, :recv_count, :send_count, :recv_fail_count, :send_fail_count)
|
@@ -541,11 +559,13 @@ class DangoServerFramework
|
|
541
559
|
# セッション
|
542
560
|
def session_init # セッション情報の初期化
|
543
561
|
@session_list = {}
|
562
|
+
@session_th_list = {}
|
544
563
|
end
|
545
564
|
def session
|
546
565
|
if !Thread.current[:session]
|
547
566
|
Thread.current[:session] = {}
|
548
567
|
@session_list[Thread.current.object_id] = Thread.current[:session]
|
568
|
+
@session_th_list[Thread.current.object_id] = Thread.current
|
549
569
|
end
|
550
570
|
Thread.current[:session]
|
551
571
|
# sid = Thread.current.object_id
|
@@ -554,9 +574,11 @@ class DangoServerFramework
|
|
554
574
|
end
|
555
575
|
def session_del # セッション情報の初期化
|
556
576
|
@session_list.delete(Thread.current.object_id)
|
577
|
+
@session_th_list.delete(Thread.current)
|
557
578
|
end
|
558
579
|
|
559
580
|
attr_reader(:session_list)
|
581
|
+
attr_reader(:session_th_list)
|
560
582
|
|
561
583
|
# ソケットとIDの対応
|
562
584
|
def socket_list_init
|
@@ -602,14 +624,16 @@ class DangoServerFramework
|
|
602
624
|
begin
|
603
625
|
sleep @gc_interval_sec
|
604
626
|
|
627
|
+
Thread.critical = true
|
605
628
|
logger.debug "GC start "
|
606
629
|
gc_start_time = Time.now
|
607
630
|
GC.enable
|
608
631
|
GC.start
|
609
632
|
GC.disable
|
610
633
|
logger.debug "GC end #{Time.now - gc_start_time}sec "
|
634
|
+
Thread.critical = false
|
611
635
|
|
612
|
-
rescue
|
636
|
+
rescue Exception
|
613
637
|
logger.error "Exception gc_thread_start #{error_message($!, 'u')}"
|
614
638
|
end
|
615
639
|
end
|
@@ -619,7 +643,7 @@ class DangoServerFramework
|
|
619
643
|
|
620
644
|
# ハートビートスレッドの開始
|
621
645
|
def heart_beat_thread_start
|
622
|
-
shared[:
|
646
|
+
shared[:_heart_beat_time_hash] = {}
|
623
647
|
|
624
648
|
th = Thread.start do
|
625
649
|
loop do
|
@@ -630,7 +654,7 @@ class DangoServerFramework
|
|
630
654
|
logger.debug "heart_beat_thread_start "
|
631
655
|
|
632
656
|
# クライアントから来るハートビートのチェック
|
633
|
-
heart_beat_time_hash = shared[:
|
657
|
+
heart_beat_time_hash = shared[:_heart_beat_time_hash]
|
634
658
|
|
635
659
|
# 全員へheart_beatパケットを送信
|
636
660
|
socket_list.keys.each do |sid|
|
@@ -638,15 +662,17 @@ class DangoServerFramework
|
|
638
662
|
# logger.debug "heart_beat_thread_start:sid=#{sid} #{sock} #{sock.closed?}"
|
639
663
|
# send_notice(sid, "_heart_beat", {}, {:timeout=>@heart_beat_response_wait_sec})
|
640
664
|
|
641
|
-
#
|
665
|
+
# クライアントから来たハートビートの時間チェックし、古ければsocketを閉じて、threadを殺す
|
642
666
|
if heart_beat_time_hash[sid] && heart_beat_time_hash[sid] < Time.now - @heart_beat_receive_wait_sec
|
643
|
-
logger.
|
667
|
+
logger.warn "!!!! heart_beat_thread_start:heart beat old:#{sid}:#{heart_beat_time_hash[sid]}:#{sock}:#{sock.closed?}"
|
644
668
|
sock.close if !sock.closed?
|
669
|
+
logger.warn "!!!! heart_beat_thread_start:thread kill:#{session_th_list[sid]}"
|
670
|
+
session_th_list[sid].kill
|
645
671
|
end
|
646
672
|
end
|
647
673
|
end
|
648
674
|
|
649
|
-
rescue
|
675
|
+
rescue Exception
|
650
676
|
logger.error "Exception heart_beat_thread_start #{error_message($!, 'u')}"
|
651
677
|
end
|
652
678
|
end
|
@@ -658,7 +684,7 @@ class DangoServerFramework
|
|
658
684
|
def dango_receive__notice_heart_beat(ret_obj)
|
659
685
|
logger.debug "dango_receive__notice_heart_beat:#{session[:sid]}:#{ret_obj['_hb_id']} "
|
660
686
|
|
661
|
-
shared.transaction(:
|
687
|
+
shared.transaction(:_heart_beat_time_hash) do |heart_beat_time_hash|
|
662
688
|
heart_beat_time_hash[session[:sid]] = Time.now
|
663
689
|
heart_beat_time_hash
|
664
690
|
end
|
@@ -666,7 +692,7 @@ class DangoServerFramework
|
|
666
692
|
|
667
693
|
# サーバーからクライアントへのデータ送信
|
668
694
|
def send_notice(sid, notice_name, send_obj, options = {})
|
669
|
-
logger.
|
695
|
+
logger.info "send_notice(#{sid.inspect}, #{notice_name.inspect}) "
|
670
696
|
# logger.debug "send_notice(#{sid.inspect}, #{notice_name.inspect}, #{send_obj.inspect}, #{options.inspect})"
|
671
697
|
|
672
698
|
raise(DangoFrameworkError, "send_obj is not Hash.") if ! send_obj.is_a?(Hash)
|
@@ -711,9 +737,11 @@ class DangoServerFramework
|
|
711
737
|
dango_send_data(sock, send_obj_dup, :type=>dtype) # データ送信
|
712
738
|
# logger.debug "send_notice:sent:notice_name=#{send_obj_dup['_id']} #{notice_name.inspect} #{sid} "
|
713
739
|
rescue DangoFrameworkConnectionError
|
714
|
-
logger.
|
740
|
+
logger.warn "send_notice:DangoFrameworkConnectionError:notice_name=#{notice_name.inspect} #{sid} "
|
715
741
|
rescue DangoFrameworkError
|
716
|
-
logger.
|
742
|
+
logger.warn "ERROR:send_notice:DangoFrameworkError:notice_name=#{notice_name.inspect} #{sid} \n #{error_message($!, 'u')}"
|
743
|
+
rescue Exception
|
744
|
+
logger.warn "ERROR:send_notice:Exception:notice_name=#{notice_name.inspect} #{sid} \n #{error_message($!, 'u')}"
|
717
745
|
end
|
718
746
|
end
|
719
747
|
|
@@ -745,10 +773,10 @@ class DangoServerFramework
|
|
745
773
|
if Time.now > end_reserved_time
|
746
774
|
logger.debug "send_notice:receive timeout:#{notice_name} #{sid} #{end_reserved_time}"
|
747
775
|
|
748
|
-
if notice_name.to_s == "_heart_beat" # heart beatだったらsockを止める
|
749
|
-
logger.info "!!!! send_notice:heart_beat timeout"
|
750
|
-
sock.close if !sock.closed?
|
751
|
-
end
|
776
|
+
# if notice_name.to_s == "_heart_beat" # heart beatだったらsockを止める
|
777
|
+
# logger.info "!!!! send_notice:heart_beat timeout"
|
778
|
+
# sock.close if !sock.closed?
|
779
|
+
# end
|
752
780
|
break
|
753
781
|
end
|
754
782
|
|
@@ -760,8 +788,8 @@ class DangoServerFramework
|
|
760
788
|
end
|
761
789
|
end
|
762
790
|
end # mutex
|
763
|
-
rescue
|
764
|
-
logger.
|
791
|
+
rescue Exception
|
792
|
+
logger.error "send_response_thread error:#{error_message($!, 'u')}"
|
765
793
|
end
|
766
794
|
end # Thread:end
|
767
795
|
|
@@ -776,7 +804,7 @@ class DangoServerFramework
|
|
776
804
|
key = $1
|
777
805
|
method_action_notice_shared(key, name, *args)
|
778
806
|
else
|
779
|
-
logger.
|
807
|
+
logger.error "method not found. #{name.inspect} #{args.inspect}"
|
780
808
|
raise(NameError, "method not found. #{name.inspect} #{args.inspect}")
|
781
809
|
end
|
782
810
|
end
|
@@ -790,21 +818,21 @@ class DangoServerFramework
|
|
790
818
|
|
791
819
|
# メインループ用の定義をするためのメソッド
|
792
820
|
def flameloop_thread(loop_method, options={})
|
793
|
-
logger.
|
821
|
+
logger.warn "flameloop_thread options:#{options.inspect}"
|
794
822
|
|
795
823
|
options = options.deep_dup
|
796
824
|
options[:rate] ||= 10
|
797
825
|
|
798
826
|
wait_sec = 1.0 / options[:rate]
|
799
|
-
logger.
|
827
|
+
logger.warn "flameloop_thread wait_sec:#{wait_sec.inspect}"
|
800
828
|
|
801
829
|
th = Thread.new do
|
802
830
|
loop do
|
803
831
|
@mutex_proc_thread.synchronize do
|
804
832
|
begin
|
805
833
|
__send__(loop_method)
|
806
|
-
rescue
|
807
|
-
logger.
|
834
|
+
rescue Exception
|
835
|
+
logger.error "flameloop_thread error:#{error_message($!, 'u')}"
|
808
836
|
end
|
809
837
|
end
|
810
838
|
sleep wait_sec
|
data/lib/dango/version.rb
CHANGED
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: dango
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-11-
|
6
|
+
version: 0.0.37
|
7
|
+
date: 2007-11-28 00:00:00 +09:00
|
8
8
|
summary: Realtime communications network framework for Ruby and Flash on Rails.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -31,7 +31,7 @@ authors:
|
|
31
31
|
files:
|
32
32
|
- Manifest.txt
|
33
33
|
- README.txt
|
34
|
-
-
|
34
|
+
- LICENSE
|
35
35
|
- lib/dango/client_framework.rb
|
36
36
|
- lib/dango/framework_base.rb
|
37
37
|
- lib/dango/server_framework.rb
|
data/MIT-LICENSE
DELETED
@@ -1,21 +0,0 @@
|
|
1
|
-
Copyright (c) 2007 Keisuke Minami
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
-
|