2

ユーザーが作業中にビジネス クリティカルなアプリケーションでデータが失われるという、現在直面している非常に深刻な問題を解決するのを誰かが助けてくれることを願っています。

これはランダムに発生します。これを再現したことはありませんが、ユーザーは私よりもはるかに多くシステムに参加しています。

多数のフィールドを含むドキュメントが作成され、2 つのリッチ テキスト フィールドがあります。Domino 8.5.3 を使用しています - 使用中の拡張 lib コントロールはありません。ドキュメントにはワークフローが組み込まれており、すべての検証は、データ クエリの保存イベントから呼び出される SSJS 関数によって行われます。sessionscope.log には非常に多くのログが記録されており、これは (現在) 各ユーザーのメモ ドキュメントに記録されているため、ユーザーが何をしているかを確認できます。

ユーザーは、リッチ テキスト フィールドに入力し、ドロップダウン フィールドで選択する必要があるワークフロー ステップに到達し、ワークフロー ボタンを使用してドキュメントを送信することがあります。ワークフロー ボタンが押される (フル アップデートを実行する) と、一部のクライアント側 JS が最初に実行されます。

// Process any autogenerated submit listeners
if( XSP._processListeners ){ // Not sure if this is valid in all versions of XPages
    XSP._processListeners( XSP.querySubmitListeners, document.forms[0].id );
}

(ブログを読んだ後に RTF フィールドの値が失われるのを防ぐためにこれを追加しましたが、今のところ機能していません)

次に、サーバー側のイベントが実行され、view.save() を呼び出して QS コード (検証用) と PS コードをトリガーし、サーバー上でワークフロー エージェントを実行します。

95% の確率で、これで問題なく動作します。

ただし、5% の確率で、ページは RFT フィールド (CKEditor) とドロップダウン フィールドの両方に加えられたすべての変更を更新し、コンテンツなしで以前と同じように再読み込みされます。保存が行われていないようで、[完全更新] ボタンは送信ではなくページの更新のように機能するように決定されています。

通常の状況では、ワークフロー ボタンが押されると、QuerySave コードが開始され、True が返されることがログに示されます。次に、押されたワークフロー ボタンの ID がログに記録され (そのため、問題を確認するときにどのボタンが使用されているかがわかります)、PostSave コードが開始され、最後に true が返されます。

問題が発生すると、QuerySave イベントが実行され、検証に合格した場合は true を返し、失敗した場合は false を返し、停止します。ワークフロー ボタンの ID もログに記録されます。ただし、QuerySave が true を返した場合、コードは PostSave 関数を呼び出して続行する必要があります。PostSave 関数を開始していることも記録しません。

さらに悪いことに、PostSave コードの呼び出しに失敗した後、次にログに記録されるのは実行中の beforePageLoad イベントであり、これによりページがリロードされ、最近の編集が反映されていないため、ユーザーはすべてを失います。彼らが入力した情報!

これは、私が XPages でこれまでに遭遇した中で最も厄介な問題であるに違いありません。なぜなら、QuerySave が成功した (または必須フィールドが入力されていないために失敗した) と、ページがこのように更新されて、コンテンツ。誰かが私を正しい方向に向けるのを手伝ってください??

4

4 に答える 4

1

5% のユース ケースでは、ドキュメントが 30 分以上開かれ、XSP セッションがタイムアウトしているように聞こえます。サブミットによってコンポーネント ツリーが再作成され、空のページがユーザーに返されます。アプリケーションのタイムアウトを増やして、問題が解決するかどうかを確認してください。

于 2012-05-31T14:54:27.270 に答える
0

私の経験では、この問題はページをメモリに保持することが原因です。何らかの理由で、ページがメモリから消去されることがあります。これは、かなり複雑なバックエンド Java 処理を伴う部分的な更新が多数ある場合に発生します。この処理は、XPage が使用するメモリーのスペースを何らかの形で使用しているように見えます。

この問題は後のリリースで修正されている可能性がありますが、少なくとも 8.5.2 では見られます。

あなたの場合、CKEditor バグの他の回避策を見つけて、「ページをディスクに保持する」オプションを使用します。または、9.0.1 にアップグレードできれば、両方の問題が解決する可能性があります。

于 2013-11-07T14:02:03.897 に答える
0

フローを少し異なるように設計します。JSF/XPages では、検証は QuerySave イベントではなくバリデーターに属します。また、ボタンには送信を使用したいので、コードで view.save() をトリガーする必要はありません。これはJSFの一連のものに干渉しません-しかし、それは必ずしもあなたの問題の原因ではありません....それについての考え:

Jeremy が最初の停止としてタイムアウトを疑うように、次の停止は QuerySave イベントの致命的な問題であり、(何らかの理由で) ランタイムを狂わせます。次のようなことを試すことができます:

var qsResult = false;
// your code goes here, no return statements
// please and if you are happy
qsResult = true;
return qsResult;

悲観的なアプローチは、何かが間違っているかどうかを最終的に教えてくれます。また、中止があり、querySave が返された場合、このトラップで実行される可能性があります。

function noReturn() {return; }  //nothing comes back!

noReturn() == true;    --> false
noReturn() == false;   --> false
noReturn() != false;   --> true!!!!

確認する必要があること: パフォーマンス設定は何ですか: ディスクにシリアル化するか、メモリに保持するか、メモリに最新の状態を保持しますか? JavaScript ライブラリの動作方法に違反している可能性があります。

SSJS ライブラリは、必要なときに読み込まれます。内部の変数は初期化されます。ライブラリは、メモリ条件で必要になるとアンロードされ、関連するすべての変数が破棄されます。そのため、呼び出しの間に SSJS ライブラリ内にある JS 関数の変数に依存している場合、値が返される場合と返されない場合があり、エラー状態を説明できます。保持したいものはスコープに入れる必要があります(viewScopeはここにあるようです)。

もう少しトリッキーにするには: クロージャとファースト クラス関数を使用すると、ライブラリがアンロードされていない限り、これらの関数は親関数の変数にアクセスできます。また、関数 (スコープにパークすることもできます) はシリアル化されません (未解決の欠陥) ため、関数をスコープに入れるときは注意が必要です。

内容が非常に複雑な場合は、バッキング Bean を使用したほうがよい場合があります。それは役に立ちましたか?

于 2012-05-31T16:54:57.093 に答える
0

マネージド Bean (またはそれ以上) を作成するには、Per の記事を確認してください。バリデーターはアプリケーション Bean に配置されます。

<faces-config>
    <managed-bean>
       <managed-bean-name>workflowvalidator</managed-bean-name>
       <managed-bean-class>com.company.WfValidator</managed-bean-class>
       <managed-bean-scope>application</managed-bean-scope>
    </managed-bean>
</faces-config>

内部では、エラーメッセージにマップを使用します

public Map<String,String> getErrorMessages() {
     if (this.errorStrings == null) { // errorStrings implements the MAP interface
        this.loadErrorDefinitions(); //Private method, loads from Domino
     }
     return this.errorStrings;
}

次に、バリデーターのエラー メッセージ文字列で EL を使用できます。

 workflowvalidator.errorMessage("some-id");

これにより、XPages は適切なページを EL で直接選択でき、SSJS よりも高速です。次に、その Bean と対話する独自のカスタム Java バリデーターを実装できます (これにより、ここで SSJS をバイパスできます)。この例以外では、notes コードは入れませんが、WfValidator クラスに話しかけます。そのためには、Java でハンドルを取得する必要があります。

private WfValidator getValidatorBean() {
    FacesContext fc = FacesContext.getCurrentInstance();
    return (WfValidator) fc.getApplication()
                           .getVariableResolver()
                           .resolveVariable(fc, "workflowvalidator");
}

リゾルバーを使用すると、ロードされた Bean にアクセスできます。それが役立つことを願っています!

于 2012-06-02T16:29:14.860 に答える