2

私は現在、SAPシステムによってトリガーされるJava(およびMySQL接続を使用するJPA)でいくつかのWebサービスを開発しています。問題を単純化するために、2つの重要なエンティティをBlogEntryととして参照していCommentます。ABlogEntryは複数持つことができますComments。ACommentは常に1つだけに属しBlogEntryます。

したがって、3つのサービスがあります(SAPからエクスポートしたWSDLによって定義され、他のシステムとの通信に並列に使用されているため、再定義することはできません):CreateBlogEntry、、CreateCommentCreateCommentForUpcomingBlogEntry

それらは適切にトリガーされており、個別に呼び出されても問題はありCreateBlogEntryません。CreateComment

ただし、サービスCreateCommentForUpcomingBlogEntryCommentと「外部キー」を送信して「今後」を識別しBlogEntryます。内部的にはCreateBlogEntry、実際のを作成するためにも呼び出しますBlogEntryこれらの2つのサービスは、非同期であるため、一致しています。

したがって、2つのオプションがあります。

  1. ダミーBlogEntryを作成してそれに接続し、「到着」したらCommentを更新しBlogEntryますCreateBlogEntry
  2. 待って、後で新しいものにCreateBlogEntry接続しますCommentBlogEntry

現在、前者を試していますが、両方のサービスが完全に実行されると、2つ BlogEntriesになります。そのうちの1つはIDによって配信されるだけですが、CreateCommentForUpcomingBlogEntry適切に接続されていますComment(逆に)。もう一方BlogEntryには他のすべての情報(postDateまたはなどbody)がありますが、Commentは接続されていません。


サービス実装のコードスニペットは次のCreateCommentForUpcomingBlogEntryとおりです。

@EJB
private BlogEntryFacade blogEntryFacade;
@EJB
private CommentFacade commentFacade;
...
List<BlogEntry> blogEntries = blogEntryFacade.findById(request.getComment().getBlogEntryId().getValue());
BlogEntry persistBlogEntry;
if (blogEntries.isEmpty()) {
    persistBlogEntry = new BlogEntry();
    persistBlogEntry.setId(request.getComment().getBlogEntryId().getValue());
    blogEntryFacade.create(persistBlogEntry);
} else {
    persistBlogEntry = blogEntries.get(0);
}

Comment persistComment = new Comment();
persistComment.setId(request.getComment().getID().getValue());
persistComment.setBody(request.getComment().getBody().getValue());
/*
    set other properties
*/
persistComment.setBlogEntry(persistBlogEntry);
commentFacade.create(persistComment);
...

そして、これが実装のコードスニペットですCreateBlogEntry

@EJB
private BlogEntryFacade blogEntryFacade;
...
List<BlogEntry> blogEntries = blogEntryFacade.findById(request.getBlogEntry().getId().getValue());
BlogEntry persistBlogEntry;
Boolean update = false;
if (blogEntries.isEmpty()) {
    persistBlogEntry = new BlogEntry();
} else {
    persistBlogEntry = blogEntries.get(0);
    update = true;
}
persistBlogEntry.setId(request.getBlogEntry().getId().getValue());
persistBlogEntry.setBody(request.getBlogEntry().getBody().getValue());
/*
    set other properties
*/
if (update) {
    blogEntryFacade.edit(persistBlogEntry);
} else {
    blogEntryFacade.create(persistBlogEntry);
}
...

これは、想定どおりに物事を起こせない、いじくり回しです。

残念ながら、これらの同時サービス呼び出しを同期する方法が見つかりませんでした。CreateCommentForUpcomingBlogEntry 数秒間眠らせることはできましたが、それが適切な方法ではないと思います。

自分の各インスタンスとそれぞれのインスタンスにデータセットをリロードさせることはできますfacadesEntityManagers?特定の条件に基づいて空になっているある種のキューにリクエストを入れることはできますか?

だから:存在するのを待たせるための最良の方法は何BlogEntryですか?

よろしくお願いします、デビッド

情報:

  • GlassFishサーバー3.1.2
  • EclipseLink、バージョン:Eclipse Persistence Services-2.3.2.v20111125-r10461
4

1 に答える 1

1

電話がかかってきていることが確実な場合は、CreateBlogEntry電話をキューに入れ、キューから取り出して、電話がかかってきCreateCommentForUpcomingBlogEntryたら処理しますCreateBlogEntry

アプリケーションサーバー上にいるので、キューについては、ストレージに自動フラッシュする JMS キューを使用するか、DB キャッシュエンジン (Ehcache ?) を使用できます。これは、大量の呼び出しを受信したり、再起動時に回復メカニズムを提供したい場合に備えてあります。

于 2013-03-21T18:34:34.800 に答える