【问题标题】:Making code in Liferay Model Listeners Asynchronous (using concurrency)使 Liferay 模型监听器中的代码异步(使用并发)
【发布时间】:2013-06-08 05:46:17
【问题描述】:

问题

我们的 liferay 系统是与其他网络应用程序同步数据的基础。
为此,我们使用Model Listeners。
通过侦听器有很多 Web 服务调用和数据库更新,因此 Liferay 中的特定操作太慢了。

例如: 在 liferay 中添加User 时,我们需要触发大量 Web 服务调用来添加用户详细信息并使用用户数据更新其他系统,以及一些 liferay 自定义表。因此,添加用户需要花费大量时间,在极少数情况下,请求可能会超时!
由于UserListener中的代码只依赖于User Details,即使UserListener有任何异常,仍然会在Liferay中添加User,所以我们想到了以下解决方案。

我们在 liferay 中还有一个调度程序,如果在侦听器中执行代码时出现异常,它会修复问题。

建议的解决方案

我们考虑使用并发 API 使 UserListener 中的代码异步。

所以这是我的问题:

  1. 是否建议在 Model Listeners 中使用并发代码?
  2. 如果是,那么如果我们也通过此代码更新 Liferay 自定义表,例如事务或其他内容,是否会产生不利影响?
  3. 这种方法的其他一般优点和缺点是什么?
  4. 还有其他更好的方法可以在不影响用户体验的情况下实时更新其他系统吗?

感谢您对此事的任何帮助

【问题讨论】:

标签: liferay listener liferay-6 liferay-hook


【解决方案1】:

你想使用并发来解决这个问题是有道理的。

在修改模型的线程中执行密集的工作(例如调用 Web 服务等)并不是一个好主意,除了会对用户体验产生影响之外。

在模型的侦听器中触发线程可能有些复杂且难以维护。

您可以探索使用 Liferay 的消息总线范例,您可以将消息发送到断开连接的消息接收器,然后该接收器将在模型侦听器的调用线程之外完成所有密集工作。

在此处阅读有关消息总线的更多信息:

  1. Message Bus Developer Guide
  2. Message Bus Wiki

【讨论】:

  • 谢谢你会检查出来。
  • 那么你是不是建议我在我的UserListener 中编写消息发送者代码,比如MessageBusUtil.sendMessage 之类的代码?我认为这是唯一可行的方法。我会尝试这种方法,如果我在正确的轨道上,请告诉我。
  • 谢谢,我刚试过,效果很好。我认为这将是 Liferay 用于异步流程的最佳方法。
猜你喜欢
  • 1970-01-01
  • 2019-12-18
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2018-05-16
相关资源
最近更新 更多