2

これがシナリオの説明であり、使用されたアプローチについてのコメントもいただければ幸いです。

私のアプリケーションの中核は、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呼び出しとして別のサービスに送信し、別のサービスが結果をサービスクライアントソケットに送り返します。私はこのアプローチがあまり好きではありませんが、もっとエレガントな解決策はありますか?

4

1 に答える 1

0

私はEclipseLinkJAXBおよびSDOの実装を主導し、それらの仕様でOracleを代表しているので、お役に立てれば幸いです。この質問は、私が9月にJavaOneで行っている話と非常によく似ています。

1)Webサービスのパラメーターとしてどのデータ型を使用する必要がありますか?この使用法にスキーマを利用するにはどうすればよいですか?このためにさまざまなXMLバインディングフレームワーク(特にJAXBとSDO)を検討していましたが、続行する方法がわかりませんでした。

これは、使用しているWebサービスフレームワークによって異なります。JAXBはJAX-WSではるかに使いやすく、JAXBはJAX-RS SDOでさらに使いやすいですが、可能な代替手段です。

2)元の汎用スキーマに基づいて動的に作成されたテンプレートを使用するように2つのサービス(ストアと検索と呼びます)を拡張するにはどうすればよいですか?サービスは引き続きメインスキーマタイプのドキュメントを受け入れますが、テンプレートに基づく内部属性リストがあります。たとえば、template1はintのみを必要とし、template2は(float)と(string)を必要とします。現在のJSPベースのプロトタイプは手動でこのテンプレートを作成しますが、手動で組み立てられたXMLドキュメント(<>タグがテキストに分散されている)として、タイプチェックがまったくないので、もっとうまくやれると思いました!

私はあなたがここで意味することを100%ではありませんが、以下が役立つかもしれません:

3)このシステムに簡単にアクセスするためのクイックWebアプリのプロトタイプを生成することは可能ですか(ここでもスキーマ(&templates)を使用して適切なXMLメッセージ構造を編集しますか?私が探しているのは(人間の)ユーザーが選択することですテンプレートを作成し、「空欄に記入」して送信するだけで、派手なルックアンドフィールは必要ありません。

JAX-RSは、迅速なプロトタイプを作成するための優れたフレームワークです。以下は私が作成した例です。

4)ソケット間での通信にこのXMLメッセージタイプを使用できますか、またはどのように使用できますか?

HTTPプロトコルを介して通信するJAX-RSのようなフレームワークが好きです。

5)サービスをステートレスEJBとしてデプロイするかどうかは重要ですか?それらをEJBにする必要がありますか、それともサーブレットで十分ですか?

私の好みは、サービスにEJBセッションBeanを使用することです。データベースを操作している場合は、Java Transaction API(JTA)を利用してデータベーストランザクションを管理できます。

SDO

EclipseLinkは、SDO 2.1.1(JSR-235)リファレンス実装です。以下にいくつかの例を掲載しています。あなたが特定の何かをする方法を探しているなら、私は関連する例を投稿しようとします。

JAXB

JAXBは静的です。また、SDOよりも人気があります。EclipseLinkでこれを認識し、動的JAXB機能を実装しました。JAXBスラントを使用したSDOの動的な側面を提供します。

編集#1

JAX-WSを扱っていて、モデルはほぼ完全に動的であるため、JAXBバインディングを完全にスキップする必要があると思います。次のリンクで、「データバインディングのスイッチオフ」のセクションを参照してください。

これにより、メッセージの本文がjavax.xml.transform.Sourceオブジェクトとして提供されます。動的テンプレートに基づいてXMLを処理する必要があります。ここではSDOが適しています。XMLスキーマを使用して、HelperContextに常に新しいタイプを追加できます。

helperContext.getXSDHelper().define(schema1, null);
helperContext.getXSDHelper().define(schema2, null);

次のように、Webサービスからソースをアンマーシャリングすることができます。

XMLDocument doc = helperContext.getXMLHelper().load(source, null, null);
DataObject rootDataObject = doc.getRootObject();
String someValue = rootDataObject.getString("attr3/childAttr/anotherChildAttr");

また、XMLHelperを使用して、別のサービスを呼び出すときにオブジェクトをXMLにマーシャリングすることもできます。

于 2010-09-01T14:21:27.363 に答える