【发布时间】:2013-03-29 21:08:44
【问题描述】:
我正在尝试查看是否可以重构我继承的项目的架构,并且对 Apache Karaf 作为可能的解决方案感兴趣。
目前,我们为我们拥有的每个(非盈利)客户构建一个可执行 JAR,并 cron 让 JAR 在不同时间运行。每个“客户端 JAR”在其中使用多个“公共” JAR,并在其中包含特定于客户端的逻辑。总共有数百个客户端 JAR 和大约十几个常见 JAR。
这种架构的问题很多:
- 由于公共 JAR 只是作为库,因此没有供客户端 JAR 运行的公共平台。他们中的许多人使用 Apache Camel 并使用这些 JAR 本地的路由,并且在所有 JAR 中复制了大量的 Camel 代码。如果有一个解决方案,所有客户端 JAR 可以共享相同的 Camel 路由,那就太好了。
- 它将何时运行每个客户端 JAR 的业务逻辑置于 cron 手中,这很好,但这是 Java,我更希望有一个主 Quartz“调度程序”来控制所有 JAR 何时运行。李>
- 每次我需要向其中一个公共 JAR 中添加依赖项时,我都需要检查每个客户端 JAR 的每个 crontab 条目并修改类路径参数以获取额外的依赖项。
- 名单还在继续……
- 我只是不喜欢 cronning 可执行客户端 JAR 的想法,因为如果将它们部署到同一个容器中,它们可以更加紧密地工作。
所以基本上,我需要一个解决方案:
- 允许我随时部署/取消部署和重新部署新版本的客户端 JAR,而不会中断系统的其余部分
- 部署/取消部署任何公用 JAR,以便任何新的客户端 JAR 开始使用新版本的公用 JAR
- 允许我部署/取消部署 Quartz 调度程序(WAR 或 JAR),该调度程序可以 cron/调度每个客户端 JAR 以在一周的不同时间运行
- 允许我部署/取消部署一个消息代理,也许还有一个 ESB,例如 Camel 或 Mule,这样我的每个客户端 JAR 都可以使用相同的队列和路由
- 允许我部署/取消部署单个日志记录 JAR(log4j、commons 日志记录等)和单个 JPA 实现 JAR(Hibernate、MyBatis 等),并使其对所有客户端 JAR 通用/可用李>
是否可以使用 Karaf 完成以上所有操作?如果不能,我是否有任何选择(Felix、Equinox 等)?还是我在追逐梦想?鉴于我的问题域,是否有任何警告或理由让我坚持当前的解决方案?提前致谢!
请注意:如果有人认为 EJB3 对我来说是一个比 OSGi 更好的解决方案,我当然愿意听听你的论点,但是我的项目经理讨厌 EJB(他口中的坏品味从繁重的 EJB2 天剩下的)并且不太可能批准这样的解决方案。
【问题讨论】:
标签: java osgi containers executable-jar apache-karaf