これがシナリオの説明であり、使用されたアプローチについてのコメントもいただければ幸いです。
私のアプリケーションの中核は、P2Pデータベースに裏打ちされた一連のWebサービスです。1つのサービスは単純なXMLベースのレコードを受け入れます(私はそのための汎用スキーマを設計しました)。サービスはこのデータを処理し(主に特定の基準に基づいてキーを作成します)、作成されたキーとともに元のデータをリスニングP2Pノードの1つにあるリスニングSocketServerに渡します。このキーとデータのペアは適切なノードにルーティングされ、XMLデータベースにデータ(キーにIDとして関連付けられている)が格納されます。
2番目のサービスは、同じスキーマに基づいて構造化されているが、以前に保存されたものからの検索と照合に使用されるオプションの値を持つクエリドキュメントを受け入れます。したがって、2番目のサービスはこのクエリを(適切なキーを使用して)P2P部分に渡し、結果を取得してサービスクライアントに返します。
たとえば、最初のサービスに送信された元のレコードが<attr1> value1 </ attr1> <attr2> value2 </ attr2>(スキーマで義務付けられている他のメタデータとともに属性リスト)である場合、2番目のサービスはそのレコードを取得する必要があります。受信したクエリは<attr2>value2</attr2>でした
(基になるXMLデータベースがここで値の完全一致の代わりに許可するので、後でより複雑なXPathまたはXQueryクエリを使用することを考えることができますが、それはこの段階では重要ではありません。私が取り組んでいる3番目のサービスもありますが、それは取得に依存します最初の2つは適切な形で最初に)
だから私の質問は:
1)Webサービスのパラメーターとしてどのデータ型を使用する必要がありますか?この使用法にスキーマを利用するにはどうすればよいですか?このためにさまざまなXMLバインディングフレームワーク(特にJAXBとSDO)を検討していましたが、続行する方法がわかりませんでした。
2)元の汎用スキーマに基づいて動的に作成されたテンプレートを使用するように2つのサービス(ストアと検索と呼びます)を拡張するにはどうすればよいですか?サービスは引き続きメインスキーマタイプのドキュメントを受け入れますが、テンプレートに基づく内部属性リストがあります。たとえば、template1はintのみを必要とし、template2は(float)と(string)を必要とします。現在のJSPベースのプロトタイプは手動でこのテンプレートを作成しますが、手動で組み立てられたXMLドキュメント(<>タグがテキストに分散されている)として、タイプチェックがまったくないので、もっとうまくやれると思いました!
3)このシステムに簡単にアクセスするためのクイックWebアプリのプロトタイプを生成することは可能ですか(ここでもスキーマ(&templates)を使用して適切なXMLメッセージ構造を編集しますか?私が探しているのは(人間の)ユーザーが選択することですテンプレートを作成し、「空欄に記入」して送信するだけで、派手なルックアンドフィールは必要ありません。
4)ソケット間での通信にこのXMLメッセージタイプを使用できますか、またはどのように使用できますか?
5)サービスをステートレスEJBとしてデプロイするかどうかは重要ですか?それらをEJBにする必要がありますか、それともサーブレットで十分ですか?
現在、現在の要件のサブセットを対象とした(以前の開発者からの)基本的な実装があります(サービスを改善し、新しい派生サービスを追加しています)が、スキーマも検証も行われず、データは基本として渡されます文字列、したがって弱い型付けを提供し、手動解析を更新するのは困難です。これをより強力なバインドされたタイピングに更新したい理由は、システム全体に簡単に渡されるデータスキーマの変更を導入するためです。基本的に、システムを使用するデータ形式/スキーマとの結合をできるだけ少なくしたいと思います。現在のプロトタイプはデータと結合しすぎているため、システムを壊さずにデータを変更することは非常に困難です。
最初の調査でJAXBを検討しましたが、静的型付けのみをサポートしています(後で使用するために保持したいスキーマ/型を実行時に動的に作成することはできません)。そこで、動的型と静的型の両方を備えたSDOに出くわしました。問題は、このアプローチを使用する十分なコミュニティや例がないため、リスクがあるように見えることです(Apache TuscanyおよびEclipselinkの実装の例は非常に少なく、5年以上経過していない完全な例を見つけることができませんでした(これはhttp://www.ibm.com/developerworks/java/library/j-sdo/)であり、SDOのXMLユースケースにも取り組んでいます(ほとんどの場合、SDOのリレーショナル使用法に焦点を当てているようです)。
プログラミングの助けを求めるのはこれが初めてです(ここや他の場所で)ので、ご容赦ください。ネットでたくさん検索しましたが、あちこちで足りないものしか見つかりませんでした。
コメントやヒントは本当にありがたいです。
trfndr
編集
私は一つのことを忘れました:検索サービスはどのように結果を取り戻すのでしょうか?クライアントソケット接続を開いているため、結果を同期的に返す方法はありません。現在の実装では、サービスクライアントがランダムポートでリスニングソケットを開き、この連絡先情報をクエリドキュメントに配置することで、これに取り組んでいます。検索Webサービスがクエリをp2p部分に送信すると、終了します。p2pは、結果をWS呼び出しとして別のサービスに送信し、別のサービスが結果をサービスクライアントソケットに送り返します。私はこのアプローチがあまり好きではありませんが、もっとエレガントな解決策はありますか?