Financial Lease Asset Management System(FLAS)プロジェクトの運用および保守の経験記録の要約--org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl

問題:

xml解析は例外をスローします。例外情報は次のとおりです。

javax.servlet.ServletException: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:268)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult.java:164)
at org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:191)
at com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:372)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:276)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at app.base.interceptor.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:65)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at org.apache.struts2.interceptor.DeprecationInterceptor.intercept(DeprecationInterceptor.java:41)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:168)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:76)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at org.apache.struts2.interceptor.DateTextFieldInterceptor.intercept(DateTextFieldInterceptor.java:125)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:253)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:140)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:567)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:652)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:612)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:503)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.xml.parsers.FactoryConfigurationError: Provider org.apache.xerces.jaxp.DocumentBuilderFactoryImpl not found
at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:127)
at org.apache.jasper.xmlparser.ParserUtils.parseXMLDocument(ParserUtils.java:128)
at org.apache.jasper.xmlparser.ParserUtils.parseXMLDocument(ParserUtils.java:194)
at org.apache.jasper.compiler.TagLibraryInfoImpl.parseTLD(TagLibraryInfoImpl.java:236)
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:183)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:386)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:450)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1400)
at org.apache.jasper.compiler.Parser.parse(Parser.java:130)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:255)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:137)
at org.apache.jasper.compiler.Parser.processIncludeDirective(Parser.java:296)
at org.apache.jasper.compiler.Parser.parseIncludeDirective(Parser.java:333)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:442)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1400)
at org.apache.jasper.compiler.Parser.parse(Parser.java:130)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:255)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:185)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:354)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:334)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:321)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:592)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
... 78 more
Caused by: java.lang.ClassNotFoundException: org/apache/xerces/jaxp/DocumentBuilderFactoryImpl
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:278)
at javax.xml.parsers.FactoryFinder.getProviderClass(FactoryFinder.java:123)
at javax.xml.parsers.FactoryFinder.newInstance(FactoryFinder.java:178)
at javax.xml.parsers.FactoryFinder.newInstance(FactoryFinder.java:147)
at javax.xml.parsers.FactoryFinder.find(FactoryFinder.java:219)
at javax.xml.parsers.DocumentBuilderFactory.newInstance(DocumentBuilderFactory.java:121)
... 103 more

この問題はときどき発生します。クラスターには3台のサーバー、ユーザーアクセス用に2台、時間指定タスク用に1台、ユーザーアクセス用に2台のサーバーがあります。この問題は基本的に隔週で発生します。問題が発生すると、システムこの機能は広範囲で麻痺し、正常に使用できなくなります。基本的に、この問題が2つのサーバーのいずれかで発生するたびに、最初の数回はサーバーを再起動することで解決しますが、この問題は頻繁に発生し、システムに影響を与えます。を使用しているので、根本的な原因が調査されているように感じます。

トラブルシューティング:

まず、調査方法は当然同じです。まず、Baiduがエラーメッセージを報告します。jarパッケージの競合など、インターネット上でこのエラーに関する意見がいくつかあります。xercesImpl.jarを削除し、JDK独自のxml解析を使用すると言う人もいます。 、など;他の人は実行中のコードはsetSysterProperty()によって処理されると言います;しかし、その時の分析の後、インターネット上で言及された競合するjarパッケージは見つかりませんでした、そしてエラーレポートはアプリケーションコードではなく他のコードでしたjarパッケージ。したがって、Baiduは解決策を見つけられませんでした。

同時に、他の同僚がこの問題の解決に協力しました。10年以上の経験を持つ3人の同僚と7年の経験を持つ2人の同僚は、問題の原因を発見しませんでした。これまでのところ、問題は保留されていますが、問題は少なくとも週に1回は発生しますが、機能は継続します。問題のトラブルシューティング、ソースコードの確認、分析後の異常情報の最後の部分の確認、ソースコードの場所の特定、ソースコードは次のとおりです(プロジェクトはjdk1.7を実行していて、私はこのブログ、パソコンjdk1.8を書いているので、異常な情報と次のコード行数は対応しませんが、私が表現するものには影響しません):

static <T> T find(Class<T> type, String fallbackClassName)
        throws FactoryConfigurationError
    {
        final String factoryId = type.getName();
        dPrint("find factoryId =" + factoryId);

        // Use the system property first
        try {
            String systemProp = ss.getSystemProperty(factoryId);
            if (systemProp != null) {
                dPrint("found system property, value=" + systemProp);
                return newInstance(type, systemProp, null, true);
            }
        }
        catch (SecurityException se) {
            if (debug) se.printStackTrace();
        }

        // try to read from $java.home/lib/jaxp.properties
        try {
            if (firstTime) {
                synchronized (cacheProps) {
                    if (firstTime) {
                        String configFile = ss.getSystemProperty("java.home") + File.separator +
                            "lib" + File.separator + "jaxp.properties";
                        File f = new File(configFile);
                        firstTime = false;
                        if (ss.doesFileExist(f)) {
                            dPrint("Read properties file "+f);
                            cacheProps.load(ss.getFileInputStream(f));
                        }
                    }
                }
            }
            final String factoryClassName = cacheProps.getProperty(factoryId);

            if (factoryClassName != null) {
                dPrint("found in $java.home/jaxp.properties, value=" + factoryClassName);
                return newInstance(type, factoryClassName, null, true);
            }
        }
        catch (Exception ex) {
            if (debug) ex.printStackTrace();
        }

        // Try Jar Service Provider Mechanism
        T provider = findServiceProvider(type);
        if (provider != null) {
            return provider;
        }
        if (fallbackClassName == null) {
            throw new FactoryConfigurationError(
                "Provider for " + factoryId + " cannot be found");
        }

        dPrint("loaded from fallback value: " + fallbackClassName);
        return newInstance(type, fallbackClassName, null, true);
    }

上記のソースコードを分析した後、実装クラスの完全修飾名が最初にsystemPropertyプロパティから読み取られていることがわかります。読み取れない(設定されていない)場合は、jaxから読み取ってみてください。 jdkのlibの下にあるプロパティ。読み取れない場合は、Webアプリケーション(META-INF / services / javax.xml.parsers.DocumentBuilderFactory)で紹介されているjarパッケージから探します。それでも見つからない場合。最終的には、jdk。org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImplに付属のcom.sunを使用しますが、上記の分析に基づいて、問題は見つかりませんでした。対応するjarパッケージもプロジェクトに存在します。論理的には、3番目のメソッドを使用して、実装クラスの完全修飾名を取得する必要があります。ただし、例外分析により、最初の型はなくなります。最初の型の後は、setSystemProperty()の場所である必要があります。対応するプロパティ値を設定するために呼び出されますが、最初のタイプがなくなった後にエラーが報告されるのはなぜですか?クラスローダーは対応するクラスをロードできないと推測されますが、ここではどのクラスローダーが呼び出され、なぜロードできないのですか?この質問では、jdkのJREでrt.jarを逆コンパイルし、javax.xml.parsers.FactoryFinderおよび関連クラスのメソッドを変更し、各キーポイントでログ出力を増やして、次に問題が発生したときに備えます。原因を分析します。問題を正確に把握しますが、同時に、最初のタイプが使用されたときに例外をtry catchでラップして、最初のタイプがエラーを報告した場合でも、プログラムが次のことを続行するようにするという2番目の考慮事項もあります。下向きに実行しますが、この方法では見つかりません。根本原因であり、jdkソースコードを変更する必要があるため、最初の方法を採用して問題の根本原因を見つけます。

案の定、しばらくしてから再びエラーが発生しました。今回のログ情報を確認したところ、確かに推測が確認されました。クラスローダーは対応するクラスをロードできませんでした。もちろん、最初のクラスのすべてがロードされたわけではありません。ただし、クラスがStandardClassLoaderとしてロードされる場合、ロードできず、WebAppClassLoaderをロードできます。追加されたログはクラスローダー情報を出力するため、前者が後者の親であることがわかり、Tomcatがここに含まれます。 。コンテナのクラス検索順序とjdkクラスの検索順序がわかりました。jdkのクラスロード順序がわかりました。当時、Tomcatコンテナはそれを知りませんでした。Baiduを事前に理解した後、問題の原因は一般的に理解されていました。

しかし、次のステップは解決策を見つけることです。直接的な理由は、対応するプロパティ値を設定するためにプロジェクトでsetSystemProperty()が呼び出される場合ですが、干し草の山で針を探すようなものです。どうすれば見つけることができますか?Iプロジェクト内のコードを検索しましたが、見つかりませんでした。例外として、最終的にjarパッケージから回答を見つけることにしました。

したがって、プロジェクト内のすべてのjarパッケージを解凍し、それらをファイルに圧縮し、このファイルを逆コンパイルし、次にこのファイルを解凍し、最後にEditPlusフォルダー内のすべてのファイルのグローバル検索方法を使用して、最後に問題を見つけます。特定の汎用モジュールのクラスでは、コードは静的静的コードブロックで実行されます。関数がクリックされてクラスがロードされている限り、このコードが実行されます。これまでのところ、問題の根本的な原因は次のとおりです。が見つかりましたが、それを解決する方法がわかりません。以前にエラーを報告しなかったのはなぜですか。突然エラーを報告し始めたのはなぜですか。幸い、根本原因を見つけたら、テストして確認することができます。この機能モジュールを操作することで、ユーザーがアクセスした2台のサーバーのみがエラーを報告し、スケジュールされたタスクを実行しているサーバーはエラーを報告しません。 2つのサーバーについて考えてみます。年末にクラスターに追加したのは新しく追加されたサーバーです。構成が異なり、最終的にTomcatにロックされているサーバーが異なる可能性があります。比較すると、 tomcatのバージョンが高くなり、クラスローダーが異なるという問題や場合によってはエラーが発生します。

解決する:

最後に、時限タスクを実行しているサーバーと、ユーザーがアクセスする2台のサーバーを比較すると、Tomcatのバージョンが異なり、2人のユーザーがアクセスするサーバーのバージョンが高いことがわかります。したがって、時限のTomcatはタスクはこれら2つのサーバー全体に移行されますサーバー上では、これまでのところ問題は完全に解決されています。

総括する:

この問題を解決する過程で最大のメリットは、さまざまなクラスローダーに対応するロードパスの定式化、Tomcatロードクラスの検索順序など、クラスローダーのクラスロードメカニズムを深く理解することです。 WebAppClassLoaderのアプリケーションからロードする優先度、次に[パスアップ]で、最上位レイヤーからロードダウンします。

このブログは主に個人的なプロジェクトの経験を記録するために使用されているので、正確な表現や説明はあまりありません。理解できます。同じ問題を抱えている友人がいる場合は、理解できない場合はコメントできます。回答。

おすすめ

転載: blog.csdn.net/weixin_44182586/article/details/108178459