ORCL0030CheckServer
OpenDolphin で CLAIM 送信した後,送った CLAIM の処理が終了したことを知らせるサーバを ruby で作った。CLAIM 処理が完了すると,ORCA サーバのシステムログに
Feb 24 12:22:22 orca panda/dbstub[3720]: module ORCL0030: /var/tmp/claim_rcv_0
というログが出るのを検出して知らせるといういかにも素人くさい方法。CLAIM 処理終了が確認できるので,CLAIM 処理が終わる前にORCAの「中途終了」ボタンを押してしまって,「中途終了データはありません」と言われなくてすむようになる。
ORCA サーバでの立ち上げ方法。11792 は適当な空きポート。
$ sudo tail -f -n0 /var/log/syslog | ruby ORCL0030CheckServer.rb 11792
ORCL0030CheckServer.rb
#!/usr/bin/ruby
require "socket"
require "timeout"
default_port = "11792"
if ARGV.length == 0
port = default_port
else
port = ARGV.shift
end
ACK = 0x06.chr
# receive ACK from client
class GetAck
def initialize(s)
@sock = s
end
def get
begin
timeout(1) {
while ACK != @sock.read(1); end
}
return true
rescue Timeout::Error
end
end
end
# send ORCL0030 to client
class SendOrcl
def initialize(s)
@sock = s
end
def send
ack = GetAck.new(@sock)
max = 5
str = "ORCL0030"
for i in 1..max do
begin
@sock.puts(str)
break if ack.get
rescue Errno::EPIPE
$stdout.puts("retry: " + i.to_s)
sleep 1
end
end
return i < max
end
end
# クライアントと接続したスレッドを保持する配列
thr = []
# stdin を監視するスレッド
Thread.start() {
while line = $stdin.gets
line.chop!
if /ORCL0030.*claim_rcv/ =~ line
for t in thr
t.wakeup
end
end
end
}
gsock = TCPServer.open(port)
# クライアントと接続したスレッドを作り thr に登録
while true
$stdout.puts("Wait for another connection")
Thread.start(gsock.accept) do |sock|
addr = sock.peeraddr
$stdout.puts("Connected " + addr.join(":"))
thr.push(Thread.current)
# クライアントと接続したら指示があるまで待つ
while true
Thread.stop
break if !SendOrcl.new(sock).send
end
sock.close
$stdout.puts("Close socket")
thr.delete(Thread.current)
end
end
ORCL0030Listener
java で書いたクライアント。(NetBeans 6.9.1 のプロジェクト)ダウンロード ORCL0030.zip (1475.0K)
| 起動画面 | ORCL0030 を受けると,うさぎアイコンが跳ねる |
« 3年間の運用まとめ | トップページ | com.sun.image.codec の置き換え »
「ダウンロード」カテゴリの記事
- OpenDolphin-1.3.0.1 ソース公開(2009.03.24)
- ORCA マスター登録ソフト(2009.03.27)
- OpenDolphin-1.3.0.2 ソース公開(2009.09.19)
- 紹介状作成 NeoOffice マクロ(2009.09.21)
- OpenDolphin-1.3.0.3 公開(Java 1.6 専用)(2009.10.29)



