2016-05-23 4 views
0

文書の挿入と更新時にCPFを作成しました。これらのCPFパイプラインは、さまざまなタスクを実行するために複数のxdmp:spawn-tasksを作成します。私はこのアプローチにいくつかの質問があります。MarkLogicのCPFとタスクサーバー8

  1. 生成されたタスクの中には、元のドキュメントを変更するものがあります。これにより、CPFの更新ワークフローがトリガーされますか?ドキュメント上で、それが生成されたタスクからの更新であることを示すフラグを使用できます。しかし、これを行うよりエレガントな方法はありますか?
  2. デッドロックについて心配する必要はありますか?つまり、同じCPFから作成された2つのタスクが同じドキュメントを同じ時刻に更新しようとしたら、どうすればこの問題を回避できますか?

基本的には、挿入したドキュメントに封筒パターンを使用して、すべてのアーティファクトドキュメントを1つのドキュメントにまとめようとしています。私がこのアーティファクト文書を生成するためにCPFを使用しているのは、カスタムのRESTエンドポイントを使用する代わりに、MLCPやその他の方法でデータベースに文書をダンプして、CPFに処理を心配させて、カスタムRESTエンドポイント。

+2

なぜ最初に明示的にスポーンを使用していますか?個々のパイプラインの手順として作業を実行し、CPFにオーケストレーションを任せてみませんか?あなたの説明からあなたが達成しようとしていることは不明です。 –

+0

私はもともとCPFタスクで自分自身をやっていましたが、私はこれを行うと、時々メモリ例外から外れています。これは、「xdmp:document-filter」を使って文書からテキストを抽出するものです。しかし、タスクサーバーを使用して、私は何も得られなかったので、タスクの産卵..そして、私は元のドキュメントのサイズが問題だと思っていません..メモリの私の初期の仮定リリースされていないか何か...しかし、 – Ravi

+0

xdmp:document-filterはストリーミング結果を許可するので、必ずしも多くのメモリを消費する必要はありません。フィルタリングは重い処理になる可能性があります。他の詳細を共有し、なぜメモリ例外が発生するのか尋ねるには、別の質問を開く価値があるかもしれません.. – grtjn

答えて

0

私はタスクを生成して、手元のドキュメントに更新を適用することをお勧めします。このような更新は、CPF状態の自然な流れを妨げることになる。 CPF自体は、複数の州を経由して文書を取得するように設計されており、それぞれの移行が合計の変換に貢献します。

したがって、ドキュメントを複数のCPF状態にして、そのような状態遷移(パイプライン)のうちの1つ以上で更新を行います。各状態遷移はすでに別のトランザクションであるため、タスクを生成する必要はありません。

デッドロックについて心配する必要はありませんが、更新プログラムの並列実行によって、更新プログラムの一部が互いに上書きされる可能性があるため、失われると簡単に想像することができます。その種類は、使用している正確なコードに依存します。 MarkLogicのトランザクションメカニズムは、通常、これを守りますが、そのメカニズムをバイパスするコードを書くのは簡単です。

HTH!

+1

参考文献:[デッドロックの防止](http://docs.marklogic.com/guide/app-dev/transactions #id_85082) –

+0

evalとinvokeに適用されますが、スポーンにはなりませんが有用です。 – grtjn

+0

私はもともとCPFタスクでそれを実行していましたが、私はこれを行うと時々メモリ例外から外れます。 "xdmp:document-filter"を使用して文書からテキストを抽出するのですが、タスクサーバーを使用しても何も得られませんでした。したがって、タスクの生成が発生します。元の文書のサイズは問題だと思います。私の最初の想像は、メモリが解放されていない、または何かが...しかし、タスクがすべて正常に動作しています。 – Ravi

関連する問題