发明内容
有鉴于此,本发明提供一种稳定可靠、时序性好的消息处理方法以及消息处理装置。
为实现上述目的,根据本发明的一个方面,提供了一种消息处理方法,包括:判断接收到的当前消息所属的类型,该类型包括更新类型、插入类型和删除类型;若判断所述当前消息属于更新类型,则在所述当前消息中加入时间限制条件以得到修饰后的当前消息,所述时间限制条件为数据库最近操作时间戳小于当前消息时间戳;执行所述修饰后的当前消息;若执行所述修饰后的当前消息失败,则生成与所述当前消息对应的插入类型的衍生消息;执行所述插入类型的衍生消息;若执行所述插入类型的衍生消息失败,则重新执行所述修饰后的当前消息。
可选地,所述生成与所述当前消息对应的插入类型的衍生消息的步骤包括:将所述当前消息中的java对象的操作属性重新赋值为插入属性,以得到所述插入类型的衍生消息。
可选地,在所述判断接收到的当前消息所属的类型的步骤之后,还包括:若判断所述当前消息属于插入类型,则执行所述当前消息。
可选地,在所述判断接收到的当前消息所属的类型的步骤之后,还包括:若判断所述当前消息属于删除类型,则执行所述当前消息。
根据本发明的另一方面,提供了一种消息处理装置,包括:判断模块,用于判断接收到的当前消息所属的类型,该类型包括更新类型、插入类型和删除类型;第一处理模块,用于在所述判断模块判断所述当前消息属于更新类型的情况下,在所述当前消息中加入时间限制条件以得到修饰后的当前消息,所述时间限制条件为数据库最近操作时间戳小于当前消息时间戳;第一执行模块,用于执行所述修饰后的当前消息;第二处理模块,用于在所述第一执行模块执行失败的情况下,生成与所述当前消息对应的插入类型的衍生消息;第二执行模块,用于执行所述插入类型的衍生消息;第三执行模块,用于在所述第二执行模块执行失败的情况下,重新执行所述修饰后的当前消息。
可选地,所述第二处理模块还用于,将所述当前消息中的java对象的操作属性重新赋值为插入属性,以得到所述插入类型的衍生消息。
可选地,还包括:第四执行模块,用于在所述判断模块判断所述当前消息属于插入类型的情况下,执行所述当前消息。
可选地,还包括:第五执行模块,用于在所述判断模块判断所述当前消息属于删除类型的情况下,执行所述当前消息。
根据本发明的技术方案,针对接收到的更新消息加上了“数据库最近操作时间戳小于当前消息时间戳”的限制条件,因此能够保证各条更新消息之间的执行顺序正确。同时,在更新消息首次执行失败后重新包装为插入消息,这样可以保证同一条记录的插入消息和更新消息的执行顺序正确。因此本发明的技术方案具有稳定可靠、时序性好等优点。
具体实施方式
以下结合附图对本发明的示范性实施方式做出说明,其中包括本发明实施方式的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施方式做出各种改变和修改,而不会背离本发明的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
图1是根据本发明实施方式的消息处理方法的主要步骤的示意图。如图1所示,本发明实施方式的消息处理方法可以主要包括如下的步骤A至步骤F。
步骤A:判断接收到的当前消息所属的类型,该类型包括更新类型、插入类型和删除类型。
步骤B:若判断当前消息属于更新类型,则在当前消息中加入时间限制条件以得到修饰后的当前消息,时间限制条件为数据库最近操作时间戳小于当前消息时间戳。
步骤C:执行修饰后的当前消息。
步骤D:若执行修饰后的当前消息失败,则生成与当前消息对应的插入类型的衍生消息。其中,可以将当前消息中的java对象的操作属性重新赋值为插入属性,以得到插入类型的衍生消息。
步骤E:执行插入类型的衍生消息。
步骤F:若执行插入类型的衍生消息失败,则重新执行修饰后的当前消息。需要说明的是,如果重新执行修饰后的当前消息失败,则输出提示消息以提示当前消息是过时的消息。
在本发明的实施方式中,在步骤A之后,还可以包括如下步骤:若判断当前消息属于插入类型,则执行当前消息。
在本发明的实施方式中,在步骤A之后,还可以包括如下步骤:若判断当前消息属于删除类型,则执行当前消息。
图2是根据本发明实施方式的消息处理装置的主要模块的示意图。如图2所示,本发明实施方式的消息处理装置20包括:判断模块21、第一处理模块22、第一执行模块23、第二处理模块24、第二执行模块25以及第二处理模块26。
判断模块21用于判断接收到的当前消息所属的类型,该类型包括更新类型、插入类型和删除类型。
第一处理模块22用于在判断模块21判断当前消息属于更新类型的情况下,在当前消息中加入时间限制条件以得到修饰后的当前消息,时间限制条件为数据库最近操作时间戳小于当前消息时间戳。
第一执行模块23用于执行修饰后的当前消息。
第二处理模块24用于在第一执行模块23执行失败的情况下,生成与当前消息对应的插入类型的衍生消息。可选地,第二处理模块24还用于将当前消息中的java对象的操作属性重新赋值为插入属性,以得到插入类型的衍生消息。
第二执行模块25用于执行插入类型的衍生消息。
第三执行模块26用于在第二执行模块25执行失败的情况下,重新执行修饰后的当前消息。
根据本发明实施方式的消息处理装置还可以包括第四执行模块(图2中未示出)。第四执行模块用于在判断模块21判断当前消息属于插入类型的情况下,执行当前消息。
根据本发明实施方式的消息处理装置还可以包括第五执行模块(图2中未示出)。第五执行模块用于在判断模块判断当前消息属于删除类型的情况下,执行当前消息。
为使本领域技术人员更好地理解本发明的内容,下面结合具体实施例作详细描述。
首先判断接收到的当前消息所述的类型。如果当前消息是插入类型,直接执行数据插入操作即可(有可能插入失败,忽略)。如果当前消息是删除类型,直接执行数据删除操作即可(有可能删除失败,忽略)。如果当前消息是更新类型,则进入下一步。
将前一步接收到的更新类型的当前消息记为massage A。在该massage A的where条件上加上“数据库最近操作时间戳小于当前消息时间戳”的时间限制条件,得到了修饰后的当前消息,记为massage A’。
需要说明的是,在更新类型消息的sql语句的where条件里,不加分支与加上分支这两种情况的执行效果是完全不同的。例如:原来的massage A翻译成sql语句是:updatetableA set fieldA=“abc”where id=12345。加上时间戳限制条件后的massage A’翻译成sql语句变为:update tableA set fieldA=“abc”where id=12345and ts<T1。这种情况下,数据库的tableA表的id=12345的那条数据记录,如果按照原来的sql语句,就会更新fieldA字段;如果按照后面的sql语句,如果这条记录的ts时间戳字段的值比T1大,就不会更新fieldA字段。
执行修饰后的当前消息,即执行massage A’。若执行成功,表示无异常情形发生,则结束流程。若执行失败,则需要进入下一步作后续的判断处理。
这里先假设是因为时间顺序的问题才导致massage A对应记录的insert消息没有传输过来,进一步导致数据库无法更新。针对这种情况,需要将massage A重新包装成插入类型的衍生消息(记为massage B)。“包装”就是指把massage A的java对象里的operation重新赋值为“insert”,更具体细节的需要参考代码来讨论,此处不赘述。
执行插入类型的衍生消息massage B。若执行成功,则结束流程。如果massage B执行失败,这意味着massage A在包装为massage B的过程中,这条记录对应的insert消息已经插入了,需要进入下一步。
重新执行修饰后的当前消息,即重新执行massage A’。若执行成功,表示无异常情形发生,则结束流程。若执行失败,则意味着在前面两步的过程中,已经有更加新鲜的更新消息被执行过了,也就是说当前目标数据库中已经是最新记录,直接忽略掉过时的massageA即可。
图3是根据本发明实施方式的消息处理方法的工作原理示意图。本领域技术人员可以参考图3对本发明实施方式的消息处理方法以及装置有更好地理解。
根据本发明的技术方案,针对接收到的更新消息加上了“数据库最近操作时间戳小于当前消息时间戳”的限制条件,因此能够保证各条更新消息之间的执行顺序正确。同时,在更新消息首次执行失败后重新包装为插入消息,这样可以保证同一条记录的插入消息和更新消息的执行顺序正确。因此本发明的技术方案具有稳定可靠、时序性好等优点。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。