2016-05-01 46 views
-1

假设有一个有些系统中数据库中的行有事时都充满:应该使用哪种模式或技术来生成事件报告?

  • 时用户只需登录,插入某一行与表user_logins登录和时间类型的数据库。
  • 时操作使用户一个电话,与运营商ID,用户ID和日期的行表数据库insertted outgoing_calls
  • 当操作员没有应答用户的呼叫,与日期一排,用户ID和类型插入到数据库中的呼叫

然后经过一段时间后,比如说月,我们需要一个关于谁呼叫谁,多少个呼叫未被应答等的报告等等。应该使用什么模式来组织这个功能?

乍一看这个过程看起来像记录了很多,但是当我们用某种格式(date-processId-messageWithPlaceHolders)存储消息时,日志记录是一个过程。因此使用这种测井系统不太合适。

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

那么应该使用哪种模式或技术来有效地实现此功能?

回答

1

您的要求是每月生成一个who-called-who报告,以便您可以了解您的电话的成功(或者您有任何理由)。

您不需要考虑与记录或事件处理或任何事物的相似性。只是分析从上往下的问题,让你需要完成任务的工作最少的:

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

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

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

0

我会用刚刚实行,它 - 在你的业务服务模式:

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); 
} 

,并报告调用其中call.answeredBy is null

无论哪种情况,我都会通过查询数据库来完成报告。

替代

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

相关问题