高度なカスタマイズ > Info*Engine ユーザーガイド > Web サービスフレームワーク > SOAP アタッチメントの使用
  
SOAP アタッチメントの使用
JAX-WS の Web サービスでは、SOAP リクエストにバイナリデータをスケーラブルに含めることができます。
レガシー Web サービスと同様に、バイナリデータ (Info*Engine タスクの入力ストリームで使用可能) をアップロードするには、javax.activation.DataSource タイプのタスクにパラメータを追加します。
標準の MIME SOAP アタッチメントが使用されていたレガシー Info*Engine Web サービスとは異なり、JAX-WS Web サービスでは、バイナリデータがインライン Web サービスのパラメータとして認識されるようにするためにアタッチメント参照が使用されます。ただし、この方法では、暗黙的に、SOAP クライアントにファイル名やコンテンツタイプなどのアタッチメントに関連付けられている情報を Content-Disposition MIME ヘッダーを使用して含めることができなくなりました。したがって、現在の Info*Engine Web サービスでは、ファイル名をアタッチメントに関連付けられている個別のパラメータとして指定できるようになりました。アタッチメントのファイル名を指定するために追加のパラメータが使用されない場合、アタッチメントのファイル名はデフォルトである unknown になります。
アタッチメントのコンテンツタイプを明示的に指定することもできます。ただし、これによって変更されるのは、受信データの Info*Engine コンポーネントに公開されるコンテンツタイプのみです。これが指定されていなければ、アタッチメントのコンテンツタイプのデフォルト値である application/octet-stream が使用されます。
以下に例を示します。
@param string fileName The filename
@param javax.activation.DataSource file The file to stage {fileName:fileName}
{contentType:image/jpeg}
前の例では、タスクは BLOB (アタッチメント) を受信し、アタッチメントのファイル名は付随する fileName パラメータの値によって指定されています。そのアタッチメントの Content-Type は、image/jpeg として Info*Engine タスクに公開されています。これによって達成されることは、受信アタッチメントの Content-Type の値が指定されることだけであることに注意してください。このため、Web サービスクライアントがデータを提供するときにその Content-Type に準拠している必要がありません。
レガシー Web サービスと同様に、アタッチメントをタスクから返すためには、そのリターンタイプを java.io.InputStream として指定します。アップロードとダウンロードのどちらの場合においても、Java Web クライアントには javax.activation.DataHandler タイプのパラメータまたは戻り値が提供されます。
アップロードとダウンロードのどちらの場合においても、Info*Engine Web サービスは、タスクと Web サービスクライアントの間のデータを Windchill との間で効率的に転送するためにトンネル化します。ただし、アップロードが効率的であるかどうかは、クライアントがデータを指定する方法に左右されます。少量のデータはメモリに内在させることができますが、大量のデータを送信するときは、クライアントが MIME データをチャンク化します。Java ベースのクライアントを使用する場合は、サーバーに送信されるデータをチャンク化するように明示的にクライアントに指示する必要があります。これを行わなければ、クライアントが OutOfMemoryError で停止する可能性があります。アタッチメントを Windchill にアップロードする前に、HTTP_CLIENT_STREAMING_CHUNK_SIZE プロパティをリクエストコンテキストに追加してください。これを行わなければ、アプリケーションが、Web サービスが実行されているサーバーのメモリリソースに過度の負荷をかける可能性があることにも注意してください。
以下に例を示します。
import java.io.File;
import javax.activation.FileDataSource;
import javax.activation.DataHandler;
import javax.xml.ws.BindingProvider;
import com.sun.xml.ws.developer.JAXWSProperties;
...
((BindingProvider)port).getRequestContext ().put ( JAXWSProperties.
HTTP_CLIENT_STREAMING_CHUNK_SIZE, 8192 );
File f = new File ( path );
DataHandler file = new DataHandler ( new FileDataSource ( f ) );
port.upload ( f.getName(), file );
さらに、ダウンロードの実行時には、結果として生成される DataHandler をテストして、それが StreamingDataHandler のインスタンスであるかどうかを確認してください。大量のデータをダウンロードすると、Sun のクラスがそのデータをテンポラリファイルに保存することがあります。StreamingDataHandler のインスタンスを明示的に閉じなければ、このテンポラリファイルがクライアントマシンに残ったままとなり、ディスク容量を占有します。
以下に例を示します。
import javax.activation.DataHandler;
import com.sun.xml.ws.developer.StreamingDataHandler;
...
DataHandler file = null;
try
{
file = port.download ( ... );
..
// transfer the data to another stream/file, etc.
file.writeTo ( ... );
}
finally
{
if ( file instanceof StreamingDataHandler )
((StreamingDataHandler)file).close(); // remove any temporary file
}