複数のサービス(異なる外部システム)との現在および将来の統合のために、アプリケーションの汎用RESTクライアントを作成する設計に取り組んでいます。以下は高レベルの図です
外部ホストごとにRestClientを作成し、サービス名をキー、RestClientを値としてマップに格納することを考えています。以下は、ResteasyWebTargetをラップするRestClient(キャッシュされる)クラスです。
public class RestClient {
private ResteasyWebTarget target;
@Singleton
public class RestClientRepository {
private final Map<String, RestClient> repository =
new ConcurrentHashMap<String, RestClient>()
デフォルトの実装ではRestEasyを使用します。私のクライアントコードは、webapp(マルチスレッド環境)の一部になるため。 PoolingClientConnectionManagerを使用します
ClientConnectionManager cm = new PoolingClientConnectionManager();
HttpClient httpClient = new DefaultHttpClient(cm);
ApacheHttpClient4Engine engine = new ApacheHttpClient4Engine(httpClient);
ResteasyClient client = ((ResteasyClientBuilder) ResteasyClientBuilder
.newBuilder()).httpEngine(engine).build();
このアプローチよりも良い解決策はありますか?
そもそもそれは正しいようですが、これらの実装の詳細を隠したいと思います。自問してみてください:ローカルデータベースと一部のリモートデータサーバーの違いは何ですか?
User
のような各リソースとUserStore
のようなストアにされたいと思うでしょう。各ストアには、次のような相互作用のためのいくつかのメソッドがあります。
public User getUser(String, String)
public User getUserById(long)
public void updateUser(User) throws ...
public void deleteUser(User)
public void createUser(User)
これにより、REST APIの実装の詳細が非表示になります。ローカルでのキャッシュの詳細など(ローカルでキャッシュしたい場合は、データを同期する必要があり、同期を正しく行うことは非常に困難です) !)