当前位置: 首页 > 知识库问答 >
问题:

有没有一种干净的方法来定义节俭事件?

金何平
2023-03-14

在我的应用程序中,有几个组件将生成各种不同类型的特定于应用程序的事件。这些事件将发布到代理并传递给N个客户端。其中一些客户端是我的服务器端应用程序中的其他Java类,但主要消费者是我的基于javascript的WebUI。

到目前为止,我目前的方法是定义一个抽象事件基类来封装一些公共字段,然后为每个事件实现一个特定的事件类。

这一直工作正常,只是现在我需要在javascript和java端维护事件,以便任何一方都可以对其他事件做出反应。

今天早上我有一个想法,我可以利用Thrift(项目已经大量使用)来定义事件数据结构,并自动生成任意一方的类。这不仅解决了编写类文件的繁琐,而且确保了一致性。

我的问题是,由于thrifts中的数据对象是结构(不能扩展),因此我无法封装公共字段,也无法使用单个基类传递事件。

到目前为止,我提出的解决方法是在thrift IDL中定义一个结构作为“基类”,为我定义的每个事件类型都提供一个可选字段。这仍然可以让我有一个类来泛化引用事件,同时还可以让我在生成事件时捕获相关数据。

也许这只是我不太熟悉节俭,但这感觉像是一种黑客行为。我是不是走得太远了,还是这是一种可行的方法?有没有更好的方法来实现这一点?

共有1个答案

湛钊
2023-03-14

节俭作为一种序列化和RPC机制只允许一对一的连接,所以这不会真正解决任务。但是你没有迷路。

如果你想做一对多,你应该使用一些消息系统。节俭可以很容易地与不同级别的消息传递系统相结合。源代码树的contrib文件夹中有几个关于如何实现这一点的示例。

使用节俭的联合作为信封来保存所有各种数据结构是一个有效的解决方案,因为它允许最小化序列化和反序列化代码-您只需要一对函数来处理始终相同的信封结构(当然可能有不同的内容)。

struct Foo { ... some member fields ... }
struct Bar { ... some member fields ... }
struct Baz { ... some member fields ... }

union Envelope {
  1: Foo foo
  2: Bar bar
  3: Baz baz
}
 类似资料:
  • 我能够从赫尔辛基MOOC课程中弄清楚这个项目,但我认为有一种更干净、更容易阅读的方式来写它。目标是打印出:

  • 问题内容: 我知道对于JBoss,您需要在适当实例的/ deploy子目录中有一个[name] -ds.xml文件。我没有使用其他Java EE容器的经验,但是我试图尽可能地遵循标准。有没有定义和部署JDBC数据源的标准方法?如果可能的话,我想将我的数据源包含在* .ear文件中(例如,出于演示目的而嵌入的内存中HSQLDB数据源)? 如果没有标准方法,其他容器至少会接受jboss方法吗?(/de

  • 下面是: 下面是 为了简单起见,我使用了H2数据库,因为它是一个基于文件的数据库,很容易创建和测试。

  • 问题内容: 似乎有很多方法可以在Python中定义单例。关于堆栈溢出是否有共识? 问题答案: 我没有真正的需要,因为具有功能(而不是类)的模块可以很好地用作单例。它的所有变量都将绑定到模块,该模块无论如何都无法重复实例化。 如果您确实希望使用类,则无法在Python中创建私有类或私有构造函数,因此,您只能通过使用API​​的约定来保护自己免受多重实例化。我仍然将方法放在模块中,并将模块视为单例。

  • 基本上,对象(结构)是通过组合不同的组件来构造的。每个具体组件都很容易被与接口匹配的另一个组件交换(我猜是特征)。 我目前正在尝试使用一些特征来实现,这让我陷入了一些错误,并让我开始思考这是否是 Rust 中的常见做法。 这背后的主要思想是实现游戏中常用的组件模式。基本上,游戏将包含许多不同的对象,行为和包含的数据略有不同。没有一个大的类层次结构,对象是由标准组件组成的,更完整的例子是。