[SOA] Gone With the Wind?

「Enterprise Manager Fusion Middleware Controlから全てのSOAコンポジットが消えたんです。SOAコンポジットをローディング中にログには現れず、不吉なエラーメッセージがログ中にあるんですけど」というお客様の問い合わせに対応してきました。

症状
サーバー再起動後、SOAコンポジットが全く使えないことに気付きました。EM上に現れず、ログファイルには以下のメッセージが残っていました。
SEVERE: WLSFabricKernelInitializer.getCompositeList Error during parsing and processing of deployed-composites.xml file
このエラーメッセージは、deployed-composites.xmlをパースした時に何らかの問題が発生した、ということを意味しています。これは非常にまずい問題です。というのも、deployed-composites.xmlは、「何のSOAコンポジットをロードして、MDSのどこにSOAコンポジットが存在するか」を、SOAインフラに伝えるための目次なので、このファイルが読めない場合、どのSOAコンポジットもロードできません。

検証
JDeveloperからMDSにつなぐか、WLSTを使ってエクスポートするか、EMからSOA->soa-infra->管理(Administration)->MDS構成(MDS Configuration) を辿ってsoa-infra MDSパーティションまるごとエクスポートするなどすれば、deployed-composites.xmlを見ることができます。後々のことを考えれば、EMでエクスポートするのが一番簡単でしょう。
SOAサーバのローカルストレージにsoa-infraパーティションをエクスポートした後、deployed-composites/deployed-composites.xmlを以下のXSLファイルで変換しました。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/1999/xhtml">
    <xsl:output indent="yes"/>
    <xsl:template match="/">
        <testResult>
            <composite-series>
                <xsl:attribute name="elementCount"><xsl:value-of select="count(deployed-composites/composite-series)"/></xsl:attribute>
                <xsl:attribute name="nameAttributeCount"><xsl:value-of select="count(deployed-composites/composite-series[@name])"/></xsl:attribute>
                <xsl:attribute name="defaultAttributeCount"><xsl:value-of select="count(deployed-composites/composite-series[@default])"/></xsl:attribute>
                <composite-revision>
                    <xsl:attribute name="elementCount"><xsl:value-of select="count(deployed-composites/composite-series/composite-revision)"/></xsl:attribute>
                    <xsl:attribute name="dnAttributeCount"><xsl:value-of select="count(deployed-composites/composite-series/composite-revision[@dn])"/></xsl:attribute>
                    <xsl:attribute name="stateAttributeCount"><xsl:value-of select="count(deployed-composites/composite-series/composite-revision[@state])"/></xsl:attribute>
                    <xsl:attribute name="modeAttributeCount"><xsl:value-of select="count(deployed-composites/composite-series/composite-revision[@mode])"/></xsl:attribute>
                    <xsl:attribute name="locationAttributeCount"><xsl:value-of select="count(deployed-composites/composite-series/composite-revision[@location])"/></xsl:attribute>
                    <composite>
                        <xsl:attribute name="elementCount"><xsl:value-of select="count(deployed-composites/composite-series/composite-revision/composite)"/></xsl:attribute>
                        <xsl:attribute name="dnAttributeCount"><xsl:value-of select="count(deployed-composites/composite-series/composite-revision/composite[@dn])"/></xsl:attribute>
                        <xsl:attribute name="deployedTimeAttributeCount"><xsl:value-of select="count(deployed-composites/composite-series/composite-revision/composite[@deployedTime])"/></xsl:attribute>
                    </composite>
                </composite-revision>
                <xsl:apply-templates select="deployed-composites/composite-series"/>
            </composite-series>
        </testResult>
    </xsl:template> xmlns:xs="

    <xsl:template match="composite-series">
            <xsl:if test="not(@name) or not(@default) or composite-revision[not(@dn) or not(@state) or not(@mode) or not(@location)]">
                <ErrorNode>
                    <xsl:attribute name="elementPos"><xsl:value-of select="position()"/></xsl:attribute>
                    <xsl:copy-of select="."/>
                </ErrorNode>
            </xsl:if>
    </xsl:template>
</xsl:stylesheet>
出力結果によると、属性(nameとdefault)がない<composite-series>タグが存在する、ということを示しています。また、deployed-composites.xmlファイル中に、SOAコンポジットの個数(111)とコンポジットのリビジョン件数(115)が存在することがわかります。
<?xml version="1.0" encoding="UTF-8"?>
<testResult xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/1999/xhtml">
   <composite-series elementCount="111" nameAttributeCount="110" defaultAttributeCount="110">
      <composite-revision elementCount="115" dnAttributeCount="114" stateAttributeCount="115"
                          modeAttributeCount="115"
                          locationAttributeCount="114">
         <composite elementCount="115" dnAttributeCount="114" deployedTimeAttributeCount="115"/>
      </composite-revision>
      <ErrorNode elementPos="82">
         <composite-series xmlns="">
            <composite-revision state="on" mode="active">
               <composite deployedTime="2010-12-15T11:50:16.067+01:00"/>
            </composite-revision>
         </composite-series>
      </ErrorNode>
   </composite-series>
</testResult>

この結果から、<composite-series>要素の一つ(111個中の82個目)に問題があると目星をつけ、目算通りに問題を発見、修正しました。

解決方法
非常に簡単です。
  1. エクスポートしたMDSパーティションは安全のためにバックアップをとっておきます。
  2. 先ほど発見したdeployed-composites/deployed-composites.xml ファイルの<composite-series>タグを修正します。
  3. SOAドメインを再起動して、 デプロイ済のSOAコンポジットがEMに現れていることを確認します。
まとめ
SOA 11gを再起動した際にデプロイ済みのSOAコンポジットが見えなくなる原因の一つとして、deployed-composites.xmlファイルが壊れていることがあります。このファイルをMDSから取り出し、修正して、置き換えると解決します。何が原因でこのdeployed-composites.xmlが壊れるのかはまだわかっていません。

原文はこちら。
http://blogs.oracle.com/reynolds/2011/02/gone_with_the_wind.html

0 件のコメント:

コメントを投稿