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