XOP/MTOM について

XOP/MTOM についてちょっと調べたのでメモで残しておく。
情報はちょっと古いけどだいたい以下のような感じ。

XOP と MTOM は、SOAP メッセージの中に添付として含まれる
バイナリー・データの伝送をサポートするための標準。

これまで Microsoft は、DIME (Direct Internet Message Encapsulation)
と呼ばれる添付技術しかサポートしておらず、一方大部分のフレームワークでは、
それ以前に Microsoft が提案した SwA (SOAP Messages with Attachments)
と呼ばれるものしかサポートしていなかった。

XOP/MTOM は連携し、XML バイナリー最適化パッケージ
(XOP: XML-binary Optimized Packaging) で XML 文書が論理的に任意の
バイナリー・データの塊を組み込めるようにし、
MTOM (SOAP Message Transmission Optimization Mechanism) で XOP 手法を
SOAP メッセージに適用している。

XOP は base64 エンコード方式の文字データ・コンテンツを処理する。
XOP は実際の base64 テキストを XOP 名前空間の特殊な「Include」要素に置き換える。
Include 要素は、個別エンティティー (XML 文書の外部にあって、XML 文書に組み込まれる
実際のデータ) を識別する URI を指定する。

<xop:Include href="cid:1.urn:uuid:966CA4565647BEBA3D115028348657315@apache.org"
            xmlns:xop="http://www.w3.org/2004/08/xop/include" />


MTOM は XOP に基づき、まず SOAP メッセージで可能な XOP 使用方法の
抽象モデルを定義し、次にそのモデルを MIME Multipart/Related パッケージ用に
特殊化して、最後に HTTP トランスポートにモデルを適用する。


このメカニズム全体が、広く使用されている HTTP トランスポートで
XOP を SOAP メッセージに適用する標準方法となっている。

Oracle のアーカイブ・ログを削除する方法

Oracle のアーカイブ・ログは以下の手順で削除可能。

$ rman target / ← Oracle ユーザで実行
RMAN> delete archivelog all; ← すべてのアーカイブ・ログを削除

RMAN とは、Oracle の Recovery Manager のこと。
ちなみに、Linuxディストリビューションによっては rman というコマンドがあり、
このコマンドが呼ばれて以下のようなメッセージが出て失敗する。

rman: can't open target

この場合、パスの先頭に $ORACLE_HOME/bin を通しておくか、
$ORACLE_HOME/bin にある rman コマンドを直接実行すれば ok。

DTD 503 Error

この間、Xerces を使った XML ドキュメントのパース時に以下のエラーが発生した。

Caused by: java.io.IOException: Server returned HTTP response code:
503 for URL: http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd

どうやら W3C のサイトにある DTD に頻繁にアクセスが発生し負担になったため
制限しているらしい。(W3C Systeam's blog - W3C's Excessive DTD Traffic)


Xerces を使って XML ドキュメントをパースする際には、以下の方法で DTD
バリデーションをオフにすることもできるが、

setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

これだと DTD に定義されている実体参照を参照している場合に、
参照先の文字列に展開されないなどの問題が発生する。


EntityResolverを使えば、ローカルの DTD にアクセスするように変更することも
できそうだが、プログラムの修正が必要になる。


プログラムの修正をせずになんとか DTD にアクセスできないか調査したところ、
HTTP の「User-Agent」で制限していることが分かった。現在のところ以下の
条件にマッチした「User-Agent」の場合、W3CDTD にアクセスできないことが
分かっている。

  1. MSIE」が含まれている
  2. Java/<数字>」で始まる

例えば、「Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)」や
Java/1.5.0_12」だと、上記条件にマッチして W3CDTD にアクセスできない。


回避策としては「User-Agent」を上記条件にマッチしないように設定すればいいわけで、
プログラムの修正が可能であれば、 URLConnection クラスの setRequestProperty()
メソッドで任意の「User-Agent」をセットすればいいのだが、今回はプログラムの
修正はしたくないのでシステムプロパティ「http.agent」に任意の文字列をセット
するようすればいい。


そうすれば、例えば Java 1.5.0_12 だと「User-Agent」は以下のようになる。

<任意の文字列> Java 1.5.0_12

懸念事項としては、W3C で制限している条件が「Java/<数字> で始まる」ではなく、
Java を含む」などにした場合、上記対応では回避できなくなるということだ。


まあ、全うなやり方はやっぱりEntityResolverかな。

ORA-12547 が発生してデータベースが作成できない

この前 RHEL 4 x64 環境に Oracle 10g R2 をインストールしたところ、
データベースの作成で以下のエラーが発生した。

ORA-12547: TNS: 接続を失いました。

よくよく調べてみると、libaio.so は i386 版だけでなく、x86_64 版も必要らしい。
RHEL 4 のインストールメディアの 4 枚目にある libaio-0.3.105-2.x86_64.rpm
以下のコマンドでインストールしたところ、無事にデータベースが作成できた。

# rpm -ivh libaio-0.3.105-2.x86_64.rpm

Oracle のマニュアルには、デフォルトの状態で x86_64 版の libaio.so が
インストールされていて、i386 版の libaio.so だけ追加でインストールすれば
いいとのことだったが、自分の環境には x86_64 版の libaio.so も追加で
インストールする必要があった。


これはハマった・・・。