【问题标题】:Recommendations on providing integration api关于提供集成 api 的建议
【发布时间】:2012-01-13 18:21:07
【问题描述】:

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

第 3 点非常危险,因为它过多地干扰了数据完整性,但如果我们希望集成如此灵活,是否可行?

到目前为止的选项
1. 为特定操作提供钩子,例如如果发生这种情况,调用这个方法,客户端会为那个方法编写实现,但是这太死板了
2. 类似servlet过滤器的机制,实际动作执行前有代码,执行后有代码,虽然不太清楚怎么设计

如果这很重要,我们正在使用 Struts2。
这种集成必须能够检测到“状态变化”,而不仅仅是核心操作执行后的“结束状态”。
例如,如果订单将状态从 In Progress 更改为 Paid,那么它会做一些事情,但如果它从 Draft 更改为 Paid,它不应该做任何事情。
在这种情况下,核心操作是从数据库,将状态更改为已付费,然后再次保存(或执行 sql 更新)。

【问题讨论】:

    标签: java jakarta-ee architecture struts2 integration


    【解决方案1】:

    许多选项,包括:

    • 工作流程工具
    • AOP
    • 消息传递
    • DB 层挂钩

    最简单的(当时对我来说)是基于消息的方法。我使用 Struts 2 拦截器做了一些特别的事情,但更简洁的方法是使用 Spring 和/或 JMS。

    只要消息中包含相关信息,它几乎是完全开放的。拥有可通过服务/等访问的系统。意味着消息可以以您没有预料到的方式重新进入主应用程序。

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2011-06-06
      • 2016-03-22
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      相关资源
      最近更新 更多