[#40130] Ruby/Tk の講習会 — Hidetoshi NAGAI <nagai@...>

永井@知能.九工大です.

12 messages 2004/10/25

[ruby-list:40147] SOAPのTimeout::Errorを防ぐ方法

From: GOTO Naohisa <ngoto@...>
Date: 2004-10-30 13:34:12 UTC
List: ruby-list #40147
後藤といいます。

SOAPで時間のかかる処理を行わせると Timeout::Error が発生し
タイムアウトしてしまう現象に悩んでいます。

例を挙げると、国立遺伝学研究所が提供しているウェブサービス
(http://xml.nig.ac.jp/wsdl/index.jsp)のひとつに、
生物の塩基・アミノ酸データベースの検索を行うサービスがあります。
これを使用するため、
http://rrr.jin.gr.jp/rwiki?cmd=view;name=SOAP4R%A4%C7%CD%B7%A4%DC%A4%A6
を参考にして、以下のようなコードを書いてみました。

######################################################################
#
require 'soap/wsdlDriver'

# require 'timeout'
# alias timeout_orig timeout
# def timeout(x, &block)
#   timeout_orig(x * 100, &block)
# end

wsdl = 'http://xml.nig.ac.jp/wsdl/Blast.wsdl'

driver = SOAP::WSDLDriverFactory.new(wsdl).create_driver
driver.generate_explicit_type = true

query = <<__END__
>ADH1
MSTAGKVIKCKAAVLWELKKPFSIEEVEVAPPKAHEVRIKMVAVGICGTDDHVVSGTMVT
PLPVILGHEAAGIVESVGEGVTTVKPGDKVIPLAIPQCGKCRICKNPESNYCLKNDVSNP
QGTLQDGTSRFTCRRKPIHHFLGISTFSQYTVVDENAVAKIDAASPLEKVCLIGCGFSTG
YGSAVNVAKVTPGSTCAVFGLGGVGLSAIMGCKAAGAARIIAVDINKDKFAKAKELGATE
CINPQDYKKPIQEVLKEMTDGGVDFSFEVIGRLDTMMASLLCCHEACGTSVIVGVPPDSQ
NLSMNPMLLLTGRTWKGAILGGFKSKECVPKLVADFMAKKFSLDALITHVLPFEKINEGF
DLLHSGKSIRTILMF
__END__

puts 'small database (database = PDB)'
puts driver.searchSimple('blastp', 'PDB', query)

puts 'large database (database = DAD)'
puts driver.searchSimple('blastp', 'DAD', query)

######################################################################

比較的小さなデータベースの場合は正常に結果を取得できるのですが、
大きなデータベースに対する検索では Timeout::Error が発生します。

以下のようにして
    alias timeout_orig timeout
    def timeout(x, &block)
      timeout_orig(x * 100, &block)
    end
無理矢理タイムアウトの時間を長くすると、Ruby 1.8.2-pre2 では正常に
終了しました。Ruby 1.8.1 では、それでも Timeout::Error が発生します。

そこで質問なのですが、SOAP::WSDLDriverFactory を使用する場合、
どうやったらタイムアウトの時間を長くすることができるのでしょうか?

-- 
後藤 直久  ngoto@gen-info.osaka-u.ac.jp
大阪大学 遺伝情報実験センター  ゲノム情報解析分野 (安永研究室)

In This Thread

Prev Next