java - 将 Spring MVC 的 Controller 与 HTTPServlet 解耦

标签 java spring model-view-controller jms event-driven-design

我使用 Spring 已经有一段时间了,我意识到并非我的应用程序中收到的所有传入请求都是基于 HTTP 的。一些请求是基于电子邮件的,并且需要基于电子邮件的响应,其他请求是基于套接字的(当我的 NOSQL 存储中的值发生变化时接收通知)。尽管它们都或多或少地使用相同的 MVC 基础设施。

因此,我认为重新构建应用程序以消除 Controller 与 HTTP 基础设施之间的耦合可能会有所帮助。

调度程序不应再直接调用 Controller 方法,而是提取请求参数,并使用它们创建抽象消息(或事件),然后将其放在消息总线上。另一方面,每个 Controller 都会为不同的事件订阅其 Action (Action 类的实例 - 命令模式的实现)。

由于我对 Spring Integration、JMS 和其他类似的东西还很陌生,所以我不知道该选择哪种消息传递技术。另外,我很确定已经开发出这样的架构。也许,我什至可能没有走在正确的轨道上。

我接受关于如何进行的各种建议。

最佳答案

您说得对,在一些集成模式的帮助下,消息传递解决方案是“正确”的方式。

您是说电子邮件和一些 NoSQL 数据库已经在您的 Controller 中运行了吗?这意味着这些系统和您的 Controller 之间存在一些转换层。用Spring integration你会用 Mail-Receiving Channel Adapter处理传入的电子邮件和TCP and UDP Support用于 NoSQL 通知。 Spring MVC Controller 仍然可以用于“真正的”Web 请求,访问下面的消息 channel 。

每个 channel 适配器都有一组独特的 transformers翻译特定于适配器的 message成规范格式。最后来自每个端点的消息将是 routed同样message channel .

的确,您的示例非常适合类似 ESB 的解决方案。另请查看 Mule ESB ,更加成熟和强大。

关于java - 将 Spring MVC 的 Controller 与 HTTPServlet 解耦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8552657/

相关文章:

java - Spring MVC JSP Form使用多个对象需要下拉列表

php - 在 PHP 中使用命名空间::Fatal Error Core\App not found

java - Spring MVC中的表单处理页面

php - 如何在 MVC 应用程序 : CodeIgniter $routes or __remap() for controller selection? 中引导流量

java - struts 2.5.13 表达式语言注入(inject)漏洞

java - Hibernate Spring @Transaction 不起作用

java - Java中的Opencv SVM无法正确训练

java - 实现匿名用户投票

java - Lombok 生成器不工作

java - Java 中键值对的有序集合