Java 关于提供集成api的建议

Java 关于提供集成api的建议,java,jakarta-ee,architecture,struts2,integration,Java,Jakarta Ee,Architecture,Struts2,Integration,是否有关于提供集成挂钩的建议、最佳实践或好文章? 假设我正在开发一个基于web的订购系统。最后,我希望我的客户能够编写一些代码,将其打包到一个jar中,并将其转储到类路径中,从而改变软件的行为方式。 例如,如果收到订单,则代码 1.可以发送电子邮件或短信 2.可能会将一些附加数据写入数据库 3.可能更改数据库中的数据,或决定不将订单保存到数据库中(取消数据保存) 第3点非常危险,因为它对数据完整性的干扰太大,但如果我们希望集成变得如此灵活,它可行吗? 迄今为止的选项 1.为特定的操作提供钩子

是否有关于提供集成挂钩的建议、最佳实践或好文章?
假设我正在开发一个基于web的订购系统。最后,我希望我的客户能够编写一些代码,将其打包到一个jar中,并将其转储到类路径中,从而改变软件的行为方式。
例如,如果收到订单,则代码
1.可以发送电子邮件或短信
2.可能会将一些附加数据写入数据库
3.可能更改数据库中的数据,或决定不将订单保存到数据库中(取消数据保存)

第3点非常危险,因为它对数据完整性的干扰太大,但如果我们希望集成变得如此灵活,它可行吗?

迄今为止的选项
1.为特定的操作提供钩子,例如,如果发生这种或那种情况,调用此方法,客户端将为该方法编写实现,尽管这太严格了
2.机制类似于servlet过滤器,在执行实际操作之前有代码,在执行之后有代码,但不太确定如何设计它

如果有必要,我们将使用Struts2。
这种集成必须能够检测到“状态变化”,而不仅仅是核心操作执行后的“结束状态”。

例如,如果订单将状态从“进行中”更改为“已付款”,则它将执行某些操作,但如果订单从“草稿”更改为“已付款”,则它不应执行任何操作。
这种情况下的核心操作是从数据库加载订单对象,将状态更改为“已付款”,然后再次保存(或执行sql更新)。

许多选项,包括:

  • 工作流工具
  • AOP
  • 消息传递
  • DB层挂钩
最简单的(当时对我来说)是基于消息的方法。我使用Struts 2拦截器做了一些特别的事情,但更干净的方法是使用Spring和/或JMS

只要相关信息包含在消息中,它几乎是完全开放的。通过服务/等访问系统意味着消息可以以您意想不到的方式回击主应用程序

如果希望在不重新启动系统的情况下工作,另一个选项是用动态语言(例如Groovy)实现处理程序。功能可以存储在数据库中。使用Spring工厂使这变得非常有趣,并降低了一些基于消息的方法的复杂性

然而,同步方法的一个问题是,如果处理程序死锁或需要很长时间;它至少可以影响该线程,或者在某些情况下影响整个系统