0

私たちは以下を使用しています:

• Drools 5.0.x に付属の Drools Execution Server • Active Directory で設定された Drools Guvnor 5.2

実行サーバーと guvnor は同じ Tomcat で実行され、同じポートを使用します。

実行サーバーを使用すると、構成ファイル内のパッケージごとにリスナーを作成できます。drools バイナリ パッケージが手動でデプロイされるローカル ディレクトリを指す from-file-system.properties という 2 つのファイルがあります。これはうまくいきます。

しかし、5.3 Guvnor のパッケージ バイナリを指す with-guvnor.properties を使用しようとしています。ファイルは次のとおりです。

name=ndipiazza
newInstance=true
# Absolute path of the directory containing pc.drl: placeholder replaced by Ant.
url=http://localhost:9109/drools-guvnor/rest/packages/NDD_Test/binary
poll=10

次のエラーが表示されます。

RuleAgent(ndipiazza) INFO (Mon Jun 18 18:11:32 EDT 2012): Configuring package provider : URLScanner monitoring URLs:  http://localhost:9109/drools-guvnor/rest/packages/NDD_Test/binary
RuleAgent(ndipiazza) WARNING (Mon Jun 18 18:11:34 EDT 2012): Was an error contacting http://localhost:9109/drools-guvnor/rest/packages/NDD_Test/binary. Reponse header: {null=[HTTP/1.1 401 Unauthorized]

Guvnor 5.2 内の Active Directory 構成に関連する何らかの認証エラーが発生している可能性が非常に高いです。これは以前のバージョンの Guvnor で問題なく機能していました。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

そのため、今日は問題を切り分けました。Drools Server 5.0.x は、何らかの認証がある場合、URL エンドポイントをサポートできません。

バグを報告しました: https://issues.jboss.org/browse/JBRULES-3554

これらの変更がなければ、これは機能しません。

よだれコアのorg/drools/agent/HttpClientImpl.java

これらの 2 つの方法には、認証を追加する必要があり (START および END NDD でマークされています)、明らかにユーザー名/パスワードで切り替える必要があります。

public LastUpdatedPing checkLastUpdated(URL url) throws IOException {
        URLConnection con = url.openConnection();
        HttpURLConnection httpCon = (HttpURLConnection) con;
        try {
// **** START NDD ***** 
            BASE64Encoder enc = new sun.misc.BASE64Encoder();
            String userpassword = "ad-user" + ":" + "ad-password";
            String encodedAuthorization = enc.encode( userpassword.getBytes() );
            httpCon.setRequestProperty("Authorization", "Basic "+
                  encodedAuthorization);
            // **** END NDD *****             



            httpCon.setRequestMethod( "HEAD" );            


            String lm = httpCon.getHeaderField( "lastModified" );
            LastUpdatedPing ping = new LastUpdatedPing();

            ping.responseMessage = httpCon.getHeaderFields().toString();

            if ( lm != null ) {
                ping.lastUpdated = Long.parseLong( lm );
            } else {
                long httpLM = httpCon.getLastModified();
                if ( httpLM > 0 ) {
                    ping.lastUpdated = httpLM;
                }
            }

            return ping;
        } finally {
            httpCon.disconnect();
        }

    }

    public Package fetchPackage(URL url) throws IOException,
                                        ClassNotFoundException {
        URLConnection con = url.openConnection();
        HttpURLConnection httpCon = (HttpURLConnection) con;
        try {

            // **** START NDD ***** 
            BASE64Encoder enc = new sun.misc.BASE64Encoder();
            String userpassword = "ad-user" + ":" + "ad-password";
            String encodedAuthorization = enc.encode( userpassword.getBytes() );
            httpCon.setRequestProperty("Authorization", "Basic "+
                  encodedAuthorization);
            // **** END NDD *****             




            httpCon.setRequestMethod( "GET" );

            Object o = DroolsStreamUtils.streamIn( httpCon.getInputStream() );

            if ( o instanceof KnowledgePackageImp ) {
                return ((KnowledgePackageImp) o).pkg;
            } else {
                return (Package) o;
            }
        } finally {
            httpCon.disconnect();
        }
    }

謎が解けました。

于 2012-06-23T00:36:09.287 に答える