19 リソースフェッチング

19.1 フェッチング

URIの内容のフェッチングによって以下のことがVoiceXML処理コンテキストで起きる:

(1)処理のためのVoiceXMLドキュメントをフェッチする、あるいは、

(2)オーディオファイル、オブジェクト、文法、スクリプトのような他のドキュメントタイプをフェッチする。

フェッチング処理の詳細は以下の3つの属性によって決定される。

caching 内容の最新コピーを常に強制的にフェッチするか、もしそれがエクスパイアしてなかった場合に内容のキャッシュ済みコピーを使用するかを決める。指定がない場合、最も内側のcachingプロパティが用いられる。
fetchtimeout error.badfetchイベントを投げるまで、内容が返るのを待つ時間。指定がない場合、最も内側のfetchtimeoutプロパティが用いられる。
fetchhint 処理コンテキストがサーバから内容をいつ取得すべきかを定義する。prefetchはそのページがロードされたときファイルをダウンロードしてもよいことを示す。これに対してsafeは、実際に必要となった時点でのみダウンロードを許す。大容量のファイル(長時間のダウンロードを要する)またはオーディオソースをストリームする場合、streamにより内容すべての取得を待たないで処理コンテキストが内容の処理を始められる。指定がない場合、最も内側の*fetchhintプロパティの値が用いられる。

URIから内容がフェッチされる場合、caching属性は取得する場所(キャッシュを用いるか否か)を決定する。fetchtimeout属性は内容を待つ時間の長さ(リソースが必要とされた時点から計測する)を決定する。fetchhintはいつ内容をフェッチするかを決定する。VoiceXML処理コンテキストのキャッシングの方針は次のセクションで詳説する。

fetchhint属性はいつ内容をフェッチすることができるかを示し、これによって処理コンテキストの処理性能を高めることを助ける。処理コンテキストは実際にはsafeセッティング以外の方針でドキュメントをフェッチするとき、異なる処理を行う必要はない。しかしprefetchまたはstreamセッティングで処理に対応した処理コンテキストであっても、safeセッティングでの処理もできなくてはならない。

ある対話から別の対話へ遷移するとき、<subdialog>, <goto>, <submit>, <link>,または<choice>要素においては、処理系の振る舞いに影響する追加ルールがある。もし参照されたURIがドキュメント名に対話名をつけたものである(例:"doc#dialog")か、またはクエリーデータが提供されている(POSTまたはGETを通して)なら、新しいドキュメントが取得される(ローカルキャッシュまたはサーバから)。新しいドキュメントが取得された場合、そのドキュメントはその初期化フェーズ(例:必要ならば新しいアプリケーションルートドキュメントの取得、初期化、ドキュメント変数の初期化、そしてドキュメントスクリプトの実行)を通過する。要求された対話(指定されない場合は最初の対話)は、その後で初期化され、対話の実行が始まる。もし参照されたURIが対話名だけの場合(例:"#dialog")、ドキュメントは新たには取得されず、ドキュメントの初期化も実行されない。要求された対話は引き続いて処理される。

VoiceXMLドキュメントをフェッチする要素は以下の追加属性もサポートする:

fetchaudio フェッチの間再生されるオーディオクリップのURI。指定されない場合は、fetchaudioプロパティが使用され、もしプロパティがセットされていないなら、フェッチの間オーディオは再生されない。

fetchaudio属性は次のドキュメントの取得中に目立つ遅延がある場合、ユーザの好感度を高めるのに有用である。これは、BGMの再生またはアナウンスの連続再生に使用できる。ドキュメントの取得が完了した場合に、再生が続いていれば、そのオーディオファイルは中断される。

19.2 キャッシング

VoiceXML処理コンテキストは、ちょうどHTMLビジュアルブラウザのように、ドキュメントのフェッチングやその他のリソースにおいてパフォーマンスを向上するためにキャッシュを使用することができる;VoiceXMLドキュメントでのオーディオファイルはHTMLにおける画像と同様である。ビジュアルブラウザでは、最新でないと判断される内容のアップデートやリフレッシュの制御をエンドユーザも行うことができた。VoiceXML処理コンテキストの場合これとは違い、その後同等のエンドユーザコントロールが必要である。従って、キャッシュリフレッシュの実行は、VoiceXML処理コンテキストにより使用されるキャッシングの方針の特定の使用を通した随意のアプリケーションプログラムである。

VoiceXML処理コンテキストのデフォルトのcaching policyはHTMLブラウザ内で共通に使われるそれである。:

  1. もしURIにより参照されるドキュメントがキャッシュ内に残っているなら、キャッシュのコピーを使用する。
  2. もしURIにより参照されるドキュメントが終了されているまたはキャッシュ内に残っていないなら、使用するサーバから得たものをフェッチする。注:まだキャッシュ内に残っている終了したドキュメント上の"get if modified"を形成するための最適化である。

VoiceXMLではこのcaching policyは高速と知られている。しかし高速なキャッシュ使用法は異例な結果をロードすることができる為、VoiceXML処理コンテキストもまたsafe caching policyを実装する:

  1. たとえ、URIにより参照されるドキュメントがキャッシュ内に存在しかつ終了されていなくても、"get if modified"オペレーションを形成する。これはもし、さらに新しいバージョンのドキュメントが存在するなら、キャッシュされているバージョンのものから新しいバージョンへの置き換えを強要する。もしより新しいバージョンのものが存在しないなら、サーバはわざわざドキュメントを変更しに行かない。
  2. もしURIにより参照されるドキュメントが終了しているもしくはキャッシュ内に存在しないなら、使用するサーバから得たものをフェッチする。注:まだキャッシュ内に残っている終了したドキュメント上の"get if modified"を形成するための最適化である。

safe caching policyは、パフォーマンス(ドキュメントサーバへの余分なアクセスによる)を犠牲にして、VoiceXML処理コンテキストがいつもドキュメントの最新バージョンを持つことを確実にする。safe policyはHTMLビジュアルブラウザ内でいつも再読みこみまたはリフレッシュするWebページの影響と同様である。

VoiceXMLは作者にどちらのcaching policyを使用するか選択することを許している。確かな要素のcaching属性はその要素のために使用するデフォルトpolicyを決定するためにsafeかfastにセットされるべきである。もし属性が特定されないならば、policyはcachingプロパティの数値を特定する<property>要素により決定される。(17章参照)

例:

     <?xml version="1.0"?>
     <vxml version="1.0">
       <!-- このドキュメント内の要素はデフォルトで caching="fast" を使用する -->
       <property name="caching" value="fast"/>
       ...
       <form id="test">
         <block>
          <!-- Welcomeは滅多に変更されないので fast cachingが良い -->
          <audio src="http://www.weather4U.example/vxml/welcome.wav"/>
          <!-- Adsは常に変わるので、safe cachingが必要である  -->
<audio caching="safe" src="http://www.onlineads.example/weather4U/ad17"/>
         </block>
         ...
       </form>
       ...
     </vxml>

開発、ドキュメントとリソースが絶え間なく変更されているとき、そしてシステムテストとその後の製作に入るアプリケーションとして"safely"フェッチされたリソースとともにfast cachingを使用する間、safe cachingが使用されることは習慣である。

おそらくまずないが、デフォルトでsafe cachingを使用し、fast caching policyを使用するいくつかのリソースをフェッチする生産アプリケーションを持つことも可能である。