当前位置: 首页 > 面试题库 >

在多个服务之间重用CXF jaxb上下文

陈开宇
2023-03-14
问题内容

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


问题答案:

解决该问题的一种可能方法是在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设置为多个服务的全局实例是行不通的,因为在其initialize方法中有一个“
if”语句,一旦第一个服务设置了上下文,该语句就会返回。
这就是为什么我最终通过扩展类并收集所有必需的服务类和模型来结束。所有服务初始化结束后,我将创建一个具有所有必需类的全局上下文,并将其返回给所有服务。
您可以使用以下类。
初始化所有Web服务之后,调用compileGlobalJAXBContext方法以创建全局上下文。您可以在其中添加应用程序需要的其他类以及错过的初始化。
不要忘记将服务配置为与此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的最后一行中添加等号,因此只需将等号替换为相关的号即可。



 类似资料:
  • 我们有一个侦听事件的微服务,现在让我们调用这个。它侦听RabbitMQ上的审计事件()。任何想要调用的人都需要创建并激发。我们在一个公共模块中共享了pojo,因此可以共享它。 注意,最后一部分需要是同步的,这意味着如果数据库保存失败,我们不想发送电子邮件或类似的东西。目前,这是通过从中的事件处理程序中调用commandGateway来完成的,从调用commandGateway是否正确,如果不正确,

  • 问题内容: 我正在建立一个电子商务网站(基于shopify),并且使用多个小型angularjs应用程序来处理诸如快速购物车,收藏夹,过滤产品和其他一些较小物品的事情。我最初使用的是一个大型应用程序(具有路由和所有功能),但是当我没有完整的REST API时,这有点限制性。 我想在角度应用程序之间共享一些服务(购物车服务,所以我可以有一个快速添加按钮,它将反映在微型购物车等中),但我不确定最好的解

  • 我知道java中的关键字“synchronized”是用于多线程的。然而,副本不是多线程的,而是多进程的。我说的对吗?有什么想法吗?

  • 问题内容: 该Socket.io API具有发送消息的能力 所有 的客户。 通过一台服务器和所有套接字在内存中,我知道该服务器如何向其所有客户端发送消息,这是显而易见的。但是,使用Redis来存储套接字的多台服务器呢? 如果我的客户端 a 连接到服务器 y ,客户端 b 连接到服务器 z (以及商店的Redis框),并且我在一个服务器上运行,则另一台服务器上的客户端将收到此消息。怎么样? 实际连接

  • 本文向大家介绍Spring Cloud多个微服务之间调用代码实例,包括了Spring Cloud多个微服务之间调用代码实例的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Spring Cloud多个微服务之间调用代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 现在又一个学生微服务 user 和 学校微服务 school,如果u

  • 问题内容: 在Java中,自上而下的Web服务和自下而上的Web服务有什么区别?另外,SOAP和REST-ful Web服务之间有什么区别? 问题答案: 自顶向下意味着您从WSDL开始,然后一直使用Java创建所有必要的脚手架。 自下而上意味着您从Java方法开始,然后从中生成WSDL。 SOAP表示所有调用的URL都相同,只有Java方法的参数不同。REST表示URL加上在其上调用的HTTP方法