私は現在、SAPシステムによってトリガーされるJava(およびMySQL接続を使用するJPA)でいくつかのWebサービスを開発しています。問題を単純化するために、2つの重要なエンティティをBlogEntryととして参照していCommentます。ABlogEntryは複数持つことができますComments。ACommentは常に1つだけに属しBlogEntryます。
したがって、3つのサービスがあります(SAPからエクスポートしたWSDLによって定義され、他のシステムとの通信に並列に使用されているため、再定義することはできません):CreateBlogEntry、、CreateCommentCreateCommentForUpcomingBlogEntry
それらは適切にトリガーされており、個別に呼び出されても問題はありCreateBlogEntryません。CreateComment
ただし、サービスCreateCommentForUpcomingBlogEntryはCommentと「外部キー」を送信して「今後」を識別しBlogEntryます。内部的にはCreateBlogEntry、実際のを作成するためにも呼び出しますBlogEntry。これらの2つのサービスは、非同期であるため、一致しています。
したがって、2つのオプションがあります。
- ダミー
BlogEntryを作成してそれに接続し、「到着」したらCommentを更新しBlogEntryますCreateBlogEntry - 待って、後で新しいものに
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 数秒間眠らせることはできましたが、それが適切な方法ではないと思います。
自分の各インスタンスとそれぞれのインスタンスにデータセットをリロードさせることはできますfacadesかEntityManagers?特定の条件に基づいて空になっているある種のキューにリクエストを入れることはできますか?
だから:存在するのを待たせるための最良の方法は何BlogEntryですか?
よろしくお願いします、デビッド
情報:
- GlassFishサーバー3.1.2
- EclipseLink、バージョン:Eclipse Persistence Services-2.3.2.v20111125-r10461