Seam3 交谈 SPI

发布者:    |       Seam

当 Pete 将 Weld 的领导权交给我时,他说我应该多写博客。:-) 虽然我很愿意这样做,但实际上很难在我的工作时间中挤时间写大量的博客。但当然,这并不意味着我不会完全写博客。在这里,改变一下,不涉及 MC,这是我第一篇以 Weld/CDI 为主题的博客。;-)

Seam3 的目标是实现 CDI 实现无关。实现这一目标的障碍之一是 CDI 处理会话范围的方式。由于某种原因,Pete 可能会更好地了解为什么通用的会话处理未能进入最终规范发布。目前,据我所知,只有 JSF 会话处理是强制性的。使用 Weld,我们已经在通用方式上解决了这个问题,这有助于一些 Seam3 模块利用这一点;例如,远程通信就是其中之一。但这意味着任何使用此功能的 Seam3 子项目都无法在不同 CDI 实现之间移植。

为了让我熟悉 Seam3 并在一定程度上了解其他非 Weld CDI 实际是如何工作的,我着手实现一个任务,即在 CDI 实现无关和通用方式下实现 Seam3 会话处理。

为了不重写轮子,并且这个方法已经被使用过,因此在一定程度上证明是有效的,我简单地使用了现有的 Weld 通用会话处理 SPI,并检查它是否可以在其他已知的 CDI 实现上工作。我很高兴地说,我成功了 :-),使这个“新”SPI 成为即将到来的 CDI 1.1 规范的合格候选人。

我相信仍然有一些错误,特别是在基于非 Weld 的 SPI 实现中,因此欢迎任何反馈。此外,目前 CanDI 的会话处理与 JSF API 密切耦合,因此我不得不使用一些 JSF 策略来解决这个问题。

现在让我解释、展示和列出一些细节。

代码现在是 Seam3 项目的组成部分

如您所见,为每个已知的 CDI 实现(如果遗漏了一些,请告诉我)都有一个模块,还有一个简单的 SPI 模块。

SPI基本上是一个单独的接口,其他类大多是辅助类。

public interface SeamConversationContext<T>
{
 /**
  * Associate storage with conversation context.
  *
  * @param storage the current storage
  * @return the flowing current SeamConversationContext instance
  */
 SeamConversationContext<T> associate(T storage);

 /**
  * Activate conversation with given id.
  *
  * @param conversationId the conversation id to activate
  * @return the flowing current SeamConversationContext instance
  */
 SeamConversationContext<T> activate(String conversationId);

 /**
  * Invalidate conversation context.
  *
  * @return the flowing current SeamConversationContext instance
  */
 SeamConversationContext<T> invalidate();

 /**
  * Deactivate conversation context(s).
  *
  * @return the flowing current SeamConversationContext instance
  */
 SeamConversationContext<T> deactivate();

 /**
  * Dissociate storage with conversation context.
  *
  * @param storage the current storage
  * @return the flowing current SeamConversationContext instance
  */
 SeamConversationContext<T> dissociate(T storage);
}

实际实现取决于底层存储类型,默认为HttpServletRequest,我们已经为所有已知的CDI实现提供了实现,但它可以是您喜欢的任何东西,只要您有后端实现。例如,在Weld中,也有基于Map的实现

在SeamConversationContextFactory中仍有一个TODO(请参见其match()),关于如何根据存储类型找到最佳匹配实现。欢迎提出任何想法。

要获取SeamConversationContext实例,只需注入它,或使用SeamConversationContextFactory::getContext。

如果您问我,还有另一件相当有用的东西我修改过,这可能是必需的,那就是对所有实现进行适当的测试。我正在测试SPI对Weld和OpenWebBeans的嵌入式Tomcat6,其中Resin4本身就是一个CanDI容器。如果没有出色的Arquillian项目,所有这些测试都不可能完成。在这里,我也想感谢Dominik Dorn提供了初始的Resin4集成,这是我借用的并稍微修改了一下,这是进行CanDI测试的必需品。您可以在以下位置找到我的Arquillian Resin4分支

我打算在接下来的几天内尝试进行一个正式的发布,这样就可以在其他可能需要它或任何其他希望利用CDI实现无关性的会话处理代码的Seam3模块中使用。因此,随着更广泛的使用,我们也应该能够修复任何随之而来的问题。

对于任何问题,请在此处留言,给我发电子邮件,或在http://issues.jboss.org/browse/SEAM下打开一个关于会话管理组件的JIRA问题,或者最好的方法是创建一个针对上游主分支的github pull request。


回到顶部