应该使用什么样的模式或技术来生成事件报告?

时间:2016-05-01 13:03:57

标签: java design-patterns architectural-patterns

假设有一些系统在发生某些事情时填充数据库中的行:

  • 当用户只是登录时,会在表user_logins中使用登录类型和时间向数据库插入一行。
  • 当运营商向用户发出呼叫时,表outgoing_calls
  • 中的数据库中插入了运营商ID,用户ID和日期的行
  • 当运营商未应答用户呼叫时,将日期,用户ID和类型呼叫插入数据库的行

然后在一段时间结束后,比如说月份,我们需要一份报告,告诉谁打电话给谁,有多少电话没有接听,等等。应该用什么模式来组织这个功能?

乍一看这个过程似乎记录了很多,但是当我们存储具有某种格式的消息(date-processId-messageWithPlaceHolders)时,日志记录是一个过程。所以使用日志系统并不是很合适。

从另一个角度看,它看起来像事件处理,但是当" event"时,没有必要做任何动作。发生,没有听众,没有队列。只需存储到数据库以进行进一步报告。

那么应该使用什么样的模式或技术来有效地实现这个功能呢?

2 个答案:

答案 0 :(得分:1)

您的要求是每月生成一个谁叫谁报告,以便您可以,例如,了解您的通话成功(或任何原因)。

您无需考虑与日志记录或事件处理或任何事物的相似性。只需从上到下分析问题,即可获得完成任务所需的最少工作量:

  • 您需要每月生成一份报告
  • 为此,您需要运行一个每月至少生成一次结果的工作
  • 为此,您需要以您的工作可以理解的格式存储您的活动。

因此,一个好的解决方案是每月运行批处理作业。这可以是手动运行的java进程,cron作业,hadoop任务,...取决于你的技术堆栈。您的活动需要在发生时存储。同样,根据您的堆栈,它可以是关系数据库,键值存储,带有日志行的文件......,在您的技术堆栈中最容易使用的是什么。

所有这些选项都可能很好,但有些可能更好。例如,我建议不要使用纯字符串日志记录。您需要提取时间,数字等结构化属性,因此更喜欢一种可以帮助您保持类型安全的格式。

答案 1 :(得分:0)

我会使用刚刚实现它的业务服务模式:

BufferedReader

假设错过了一个电话,那么就会通知您的商业服务。如果没有答案应该触发数据库更新,我会改变逻辑并记录成功的答案:

void login(User user) {
    entityManager.persist(new UserLogin(user));
}

void call(Operator op, User user) {
    entityManager.persist(new PhoneCall(op, user));
}

void missedCall(User user, Operator op) {
    entityManager.persist(new MissedCall(user, op));
}

并报告void answeredCall(UserCall call, Operator op) { entityManager.merge(call).setAnsweredBy(op); }

的来电

在任何一种情况下,我都会通过查询数据库来进行报告。

<强>替代

如果您的业务服务中的大多数操作都需要如此记录,我可能会使用AOP拦截器自动执行此操作。