【问题标题】:Reuse CXF jaxb context between multiple services在多个服务之间重用 CXF jaxb 上下文
【发布时间】:2012-10-02 09:14:06
【问题描述】:

我有多个服务可以返回数千个课程的结果。
由于每个 CXF 服务都包含一个几乎相同的私有 JAXB 上下文,因此会造成巨大的内存浪费。
有没有办法自己创建 JAXB 上下文并在服务之间共享?

【问题讨论】:

  • 有趣的问题,但我不知道答案。
  • 这适用于 jaxrs,但也可能适用于 jaxws:cxf.apache.org/docs/…

标签: java web-services jaxb jax-ws cxf


【解决方案1】:

解决此问题的一种可能方法是在 spring 配置中添加以下内容:

<bean class="org.apache.cxf.jaxb.JAXBDataBinding" >
    <constructor-arg index="0" value="#{GlobalContextBean.context}"/>
</bean>

其中的值只是对持有全局(单个)JAXBContext 并具有以下方法的 bean 的引用:

public javax.xml.bind.JAXBContext getContext() {...}

您可以在以下线程中查看更多详细信息(包括 CXF 大师 Daniel Kulp 的输入):
Reuse-JAXB-context-in-jaxws

经过测试,我发现将当前的 JAXBDataBinding 设置为多个服务的全局实例是行不通的,因为它的初始化方法中有一个“if”语句,一旦第一个服务设置了上下文,该语句就会返回。
这就是为什么我最终扩展了该类并收集了所有必需的服务类和模型类。在所有服务初始化结束后,我创建一个包含所有必需类的全局上下文并将其返回给所有服务。
您可以使用以下类。
初始化所有 Web 服务后,调用 compileGlobalJAXBContext 方法来创建全局上下文。您可以在其中添加应用程序需要和 init 错过的其他类。
不要忘记配置服务以使用此 bean。

public class GlobalJAXBDataBinding extends JAXBDataBinding
{
private Set<Class<?>> globalContextClasses;
private boolean contextBuilt = false;

public GlobalJAXBDataBinding(Set<Class<?>> classes) {
    globalContextClasses = new HashSet<>(classes);
    globalContextClasses.add(CPUUID.class);
}

public GlobalJAXBDataBinding() {
}

}

public synchronized void initialize(Service service) {
    if (contextBuilt)
        return;
    super.initialize(service);
    globalContextClasses.addAll(getContextClasses());
    super.setContext(null);
}

public void compileGlobalJAXBContext() {
    if (contextBuilt) return;
    setContext(JAXBContext.newInstance(globalContextClasses));
    contextBuilt *equals* true; 
}

由于某种奇怪的原因,编辑器不允许我在 compileGlobalJAXBContext 的最后一行添加等号,所以只需将等号替换为相关符号即可。

【讨论】:

  • 我很感激这已经有点老了,但是如果你还有这个课程,你介意发布它吗?
  • @DarthPablo 我已经附上了课程
  • 谢谢 - 这很有帮助!
猜你喜欢
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
相关资源
最近更新 更多