我目前正在开发由Java(与MySQL连接的JPA)由SAP系统触发的一些Web服务。为了简化我的问题,我将两个关键实体称为BlogEntry和Comment。一个BlogEntry可以有多个Comments。 Comment始终完全属于一个BlogEntry。因此,我有三个服务(我不能也不想重新定义,因为它们是由我从SAP导出的WSDL定义的,并用于与其他系统并行通信):CreateBlogEntry,CreateComment,它们已被正确触发,分别调用它们时,CreateCommentForUpcomingBlogEntry或CreateBlogEntry绝对没有问题。但是:服务CreateComment发送CreateCommentForUpcomingBlogEntry和“外键”以标识“即将到来的” Comment。在内部,它还调用BlogEntry创建实际的CreateBlogEntry。由于它们的异步性质,这两个服务是并发的。所以我有两个选择:创建一个虚拟BlogEntry并连接BlogEntry并更新Comment,一旦BlogEntry“到达”等待CreateBlogEntry,然后将CreateBlogEntry连接到新的Comment目前,我正在尝试使用前者,但是一旦两个服务都完全执行,我将得到两个BlogEntry。其中一个仅具有BlogEntries传递的ID,但已正确连接到CreateCommentForUpcomingBlogEntry(反之亦然)。另一个Comment具有所有其他信息(例如BlogEntry或postDate),但是body未与其连接。这是服务实现Comment的代码片段:@EJBprivate BlogEntryFacade blogEntryFacade;@EJBprivate 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);...这是实现CreateCommentForUpcomingBlogEntry的代码片段:@EJBprivate 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);}...这是种无法使事情按预期发生的事情。可悲的是,我还没有找到一种同步这些同时服务调用的方法。我可以让CreateBlogEntry睡眠几秒钟,但我认为这不是正确的方法。是否可以强制CreateCommentForUpcomingBlogEntry的每个实例及其各自的facades重新加载其数据集?我可以将请求放入某种根据特定条件清空的队列吗?因此:使EntityManagers存在的最佳方法是什么?提前致谢,大卫信息:GlassFish Server 3.1.2EclipseLink,版本:Eclipse Persistence Services-2.3.2.v20111125-r10461 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 如果确定收到CreateBlogEntry呼叫,请在CreateCommentForUpcomingBlogEntry呼叫中排队,并在收到CreateBlogEntry呼叫后将其出队并进行处理。由于您在应用程序服务器上,因此对于队列,您可能会使用自动刷新到存储的JMS队列,或者使用DB缓存引擎(Ehcache吗?),以防您收到大量调用或希望在重新启动时提供恢复机制。 (adsbygoogle = window.adsbygoogle || []).push({}); 08-07 00:08