在两个 WAR 之间共享应用程序上下文?

2023-11-27

有没有办法在两个部署的战争之间共享应用程序上下文?一场战争需要连接另一场战争的服务,我不知道从哪里开始。


我们的团队有相同的要求——在 Tomcat 中的多个 WAR 之间共享 Spring bean,老实说,诸如“不要这样做”之类的答案没有帮助。

该要求源于这样一个事实:我们有一个在 Tomcat 上运行的多 WAR 应用程序,并且所有 WAR 都需要访问相同的 RDBMS 来持久保存信息。我们使用 Spring 和 Hibernate 来访问 RDBM,并且所有 WAR 共享相同的模式,并且理想情况下可以使用相同的 Hibernate SessionFactory 和 Spring 事务管理器。

关于如何做到这一点的答案已发布在这里:

StackOverflow:在 EAR 中共享 ApplicationContext

总而言之,您在 web.xml 中执行以下操作:

<context-param>
  <param-name>parentContextKey</param-name>
  <param-value>sharedContext</param-value>
</context-param>
<context-param>
  <param-name>locatorFactorySelector</param-name>
  <param-value>classpath:beanRefContext.xml</param-value>
</context-param>
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:yourWarSpecificAppContext.xml</param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

其中 beanRefContext.xml 包含:

<beans>
  <bean id="sharedContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
      <list>
        <value>classpath:yourSharedAppContext.xml</value>
      </list>
    </constructor-arg>
  </bean>
</beans>

这使用了SpringContextSingletonBeanFactoryLocator公开并共享父上下文(在本例中使用名称“sharedContext”)。当第一个 WAR 引用共享上下文时,将延迟加载它。

无论您在共享上下文中引用什么 bean,都必须可供所有 WAR 访问,这意味着它们无法从特定 WAR 中的 WEB-INF/classes 或 WEB-INF/lib 加载。它们必须被共享,要么使用 EAR 文件,要么将包含 bean(和依赖项)的 jar 放在 Tomcat 共享“lib”文件夹($CATALINA_HOME/lib)中,这就是我们团队所做的。

公平警告,如果您使用此方法,您的大部分 JAR 可能位于共享 lib 文件夹中,而不是单个 Web 应用程序中。对于我们的项目来说,这是有意义的,因为大多数 Web 应用程序共享并访问相同的后端服务。

由于核心 Tomcat 开发人员可能会反对将大量代码放入 Tomcat 共享 lib 目录中,因此我将仅列举其他建议答案可能不起作用的一些原因。

  • 为每个 WAR 使用单独的应用程序上下文意味着有多个到数据库的连接池,每个 WAR 一个,并且为每个 WAR 单独初始化昂贵的 Hibernate SessionFactory,这会增加服务器启动时间和内存消耗。更一般地说,它不允许在同一 Tomcat 中运行的 Web 应用程序之间共享共享后端服务的状态。
  • 将持久性代码放入单独的 WAR 中并使用 REST 调用(至少在我们的例子中)对于开发人员来说完全不方便,并且与直接调用共享 bean 相比,增加了访问数据库的路径长度。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在两个 WAR 之间共享应用程序上下文? 的相关文章

随机推荐

  • 超出纳秒时间戳范围

    我在 Googlespeedsheet 中有一个变量 date hiring 格式如下 16 01 2016 我在Python中导入它 该变量有一个对象类型 我尝试转换为日期时间 from datetime import datetime
  • html或css中指定图像大小的区别

    这个链接非常接近我的问题 但似乎更适用于语法而不是实际渲染的输出 我看到图像的高度和宽度可以在实际的html中定义img标签 事实上我读它的方式should在那里定义 然而 我想知道当实际涉及到图像的显示方式时 什么才是重要的 如果我插入以
  • 分配新块时如何控制“std::deque”的块大小?

    当我们向a中插入一个新元素时std deque 如果现有的块都已满 它可能会分配一个新的块来包含该元素 然而 实现如何控制块大小呢 用户是否可以控制块大小 或者它仅取决于实现的选择 例如4K 还是 8K 这是实现的选定值 无法对其进行控制
  • 在系统分区写入文件

    我正在尝试将我的应用程序生成的文件写入系统分区 由于我无法在应用程序中创建 FileOutputStream 因此我在应用程序的数据目录中创建文件 更正权限 然后将其移动到系统分区 目前 下面的代码错过了 system 的可写重新安装 出于
  • 在命令行中将环境变量传递给java类

    我需要从本地文件中读取一些属性etc myconfig config 文件夹 我需要在命令行中给出这个文件路径 我已经给出了如下所述 但出现错误 显示如下 Error Could not find or load main class te
  • IntentService 不会启动使用 AlarmManager

    我知道对此有很多疑问 但我真的不知道我的错误在哪里 我的服务注册在AndroidManifest xml文件中
  • 无法加载文件或程序集“Oracle.DataAccess”或其依赖项之一。尝试加载格式不正确的程序

    我已在 IIS 7 0 Windows Server 2008 R2 64 位上安装了 Web 应用程序 我指的是 oracle DataAccess dll 当我尝试访问该应用程序时 我收到以下消息 无法加载文件或程序集 Oracle D
  • QT 5.0 QDebug编译错误

    我在使用 QDebug 编译代码时遇到问题 但我确实需要它 include
  • PHP 获取静态方法

    我想通过 var 调用类方法 如下所示 var read params array some parameter if MyClass has the static method var echo MyClass var params el
  • Zod Schema Validation 中至少一个/最少一个字段

    我已经使用 JOI 实现了此代码 其中用户必须发送 userId 和正文中的至少一个键 如何使用 ZOD 实现相同的功能 params Joi object keys userId Joi required custom objectId
  • 浅拷贝还是深拷贝?

    我对这两种将一个对象复制到另一个对象的方法有点陌生 我很困惑 无法找出深层复制和浅层复制之间的主要区别 我已经了解了很多关于此的理论 但我需要用适当的例子进行解释 我有一个程序 可以将一个对象复制到另一个对象中 gt class A pub
  • 计算两个日期间隔之间每月的天数

    我有一组事件 每个事件都有开始日期和结束日期 但它们发生的时间跨度为几个月 我想创建一个表格来显示每个月此事件的天数 我有下面的例子 event start date lt as Date 23 10 2012 d m Y event en
  • 上下文版本冲突错误,Google colab

    我正在尝试在 Google colab 上安装并运行 sunpy 它需要 astropy 版本 3 1 或更高版本的软件包 即使在安装 astropy 版本 3 2 1 后 当我导入 sunpy 时 它也会出现以下错误 Contextual
  • Android Activity 的唯一 ID

    我需要获取 Android 活动实例的唯一 ID 我想获取activitymanager在日志中写入的字符串 例如 ActivityManager HistoryRecord的活动暂停超时 450495a0 但我不知道如何得到它 有人知道我
  • 如何从 PHP 压缩或转换为低质量 MP3 文件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 是否有任何 PHP 库或函数可以将 MP3 文件转换为较低质量 我想通过 PHP 将 128Kbps 或更高质量的 MP3 文件压缩 转换为 64K
  • Javascript:console.log 到 html

    我想将 console log 输出写入 div 层 例如 document write console log 5 1 Incorrect random example 有人可以解决我的问题吗 谢谢 EDIT 我的意思是 例如 conso
  • Passport-local mongoose node.js 支持多种用户类型

    我想要两种类型的用户登录 用户 客户端 我到底如何在 app js 中为这两种类型创建 localStrategies 序列化和反序列化用户 我有两个单独的模式 都使用 PassportLocalMongoose 插件 我目前配置我的护照如
  • 在 Android 中按主页按钮后应用程序被杀死时未打开主活动

    在我的应用程序中 活动 A 是启动器活动 从 A 称为 B 从 B 称为 C 我有超过 5 个活动 在 C 中 当我按下主页按钮 并再次打开我的应用程序时 它会打开 C 这对我来说没问题 但是在按下 C 中的主页按钮后 当它空闲一段时间并且
  • System.exit(0) 没有关闭我的所有活动? [复制]

    这个问题在这里已经有答案了 我有 2 个活动 因此活动 1 转到活动 2 然后在活动 2 上我有一个退出按钮 但是当我点击它时 它只退出了活动2并再次返回到活动1 基本上感觉就像我刚刚再次启动应用程序一样 我不知道为什么 这是我的代码 Bu
  • 在两个 WAR 之间共享应用程序上下文?

    有没有办法在两个部署的战争之间共享应用程序上下文 一场战争需要连接另一场战争的服务 我不知道从哪里开始 我们的团队有相同的要求 在 Tomcat 中的多个 WAR 之间共享 Spring bean 老实说 诸如 不要这样做 之类的答案没有帮