我正在使用protobuf来实现Java应用程序和用C ++编写的本机应用程序之间的通信协议。消息是事件驱动的:当C ++应用程序中发生事件时,会产生一个protobuf消息并发送。
message MyInterProcessMessage {
int32 id = 1;
message EventA { ... }
message EventB { ... }
...
}
在Java中,我在套接字上收到类的对象:MyInterProcessMessageProto
。从这里我可以很容易地得到我的数据,因为它们被相互封装:myMessage.getEventA().getName();
我面临两个问题:
如何委派处理收到的邮件?
因为,分析整个信息并区分不同的事件类型及其所暗示的行为导致了一个巨大的,不可维护的方法,包含许多if-cases。
我想找到一个模式,我可以保存这些消息,不仅可以应用它们,还可以撤消它们,就像Command pattern用来实现它一样。
我的第一种方法是:使用指定的apply()
和undo()
方法为每个事件创建不同的包装类,并以这种方式委派作业。
但是我不确定这是否正确,或者是否有更好的解决方案。
澄清我的申请:
Java应用程序为正在运行的Java虚拟机建模并保存信息,例如线程,监视器,内存等。
每个事件都会更改已建模JVM的当前状态。例如,一个新线程被启动,另一个线程进入阻塞状态,内存被释放等。在相同的意义上,事件被建模:ThreadEvent,MemoryEvent等。
这意味着,必须按顺序处理消息。为了迭代回JVM的先前状态,我想实现这个撤消功能。
对于撤消我已经尝试过了。 clearAllStates,将事件应用到事件#i。
不幸的是,对于20.000+事件,这是完全无效的。
答案 0 :(得分:0)
要提供量身定制的答案,最好知道您对收到的邮件做了什么,是否可以同时处理,以及撤消如何影响收到的邮件处理和撤消'ed消息。
但是,这是一个通用的建议:一种典型的方法是将收到的消息委托给queue-like处理程序类,该处理程序类通常在自己的线程中运行(让消息接收器为下一个传入消息做好准备尽可能)并按顺序处理收到的消息。您可以使用stack-like类来跟踪已处理的消息,以便撤消功能。您还可以为不同的事件类型使用特定的队列和堆栈。
基本上这类似于thread pool pattern。