是否有关于提供集成挂钩的任何建议,最佳实践或好文章?
假设我正在开发一个基于Web的订购系统。最终,我希望我的客户端能够编写一些代码,将其打包到jar中,将其转储到类路径中,这将改变软件的行为方式。
例如,如果订单进入,则代码为
1.可以发送电子邮件或短信
2.可以将一些额外的数据写入数据库中
3.可以更改数据库中的数据,或者确定不应该将订单保存到数据库中(取消数据保存)
第3点非常危险,因为它过多地干扰了数据的完整性,但是如果我们希望集成是灵活的,那么它是否可行?
目前为止的选项
1.提供特定动作的钩子,例如如果发生这种情况,请调用此方法,客户端将为该方法编写实现,但这太严格了
2.机制类似于servlet过滤器,在实际操作执行之前有代码和代码之后,不太确定如何设计这个
如果重要,我们正在使用Struts2
这种集成必须能够检测到“状态变化”,而不仅仅是核心动作执行后的“结束状态”
例如,如果订单将状态从“正在进行”更改为“付费”,那么它将执行某些操作,但如果它从“草稿”更改为“付费”,则它不应执行任何操作。
在这种情况下的核心操作是加载订单对象从数据库,将状态更改为付费,并再次保存(或进行SQL更新)。
答案 0 :(得分:2)
许多选项,包括:
最简单的(对我而言)是一种基于消息的方法。我使用Struts 2拦截器做了一些特别的事情,但更简洁的方法是使用Spring和/或JMS。
只要相关信息包含在消息中,它就完全是开放式的。通过服务等获得系统。表示消息可以以您未预料到的方式重新点击主应用程序。
如果您希望在没有系统重启的情况下工作,另一种选择是以动态语言(例如,Groovy)实现处理程序。功能可以存储在DB中。使用Spring工厂使这非常有趣,并降低了基于消息的方法的一些复杂性。
同步方法的一个问题是,如果处理程序死锁或需要很长时间;它可以至少影响该线程,或者在某些情况下影响整个系统。