私は現在、SAPシステムによってトリガーされるJava(およびMySQL接続を使用するJPA)でいくつかのWebサービスを開発しています。問題を単純化するために、2つの重要なエンティティをBlogEntry
ととして参照していComment
ます。ABlogEntry
は複数持つことができますComments
。AComment
は常に1つだけに属しBlogEntry
ます。
したがって、3つのサービスがあります(SAPからエクスポートしたWSDLによって定義され、他のシステムとの通信に並列に使用されているため、再定義することはできません):CreateBlogEntry
、、CreateComment
CreateCommentForUpcomingBlogEntry
それらは適切にトリガーされており、個別に呼び出されても問題はありCreateBlogEntry
ません。CreateComment
ただし、サービスCreateCommentForUpcomingBlogEntry
はComment
と「外部キー」を送信して「今後」を識別しBlogEntry
ます。内部的にはCreateBlogEntry
、実際のを作成するためにも呼び出しますBlogEntry
。これらの2つのサービスは、非同期であるため、一致しています。
したがって、2つのオプションがあります。
- ダミー
BlogEntry
を作成してそれに接続し、「到着」したらComment
を更新しBlogEntry
ますCreateBlogEntry
- 待って、後で新しいものに
CreateBlogEntry
接続しますComment
BlogEntry
現在、前者を試していますが、両方のサービスが完全に実行されると、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