【问题标题】:Drools Fusion Multiple Streams & PseudoclockDrools 融合多流和伪时钟
【发布时间】:2016-07-19 13:45:59
【问题描述】:

我目前正在研究我的硕士论文,该论文涉及使用 Drools Fusion 处理来自多个 XML 文件流的事件(因此我将每个文件作为流“重放”)。这些文件是一场足球比赛,球员身上安装了 GPS 传感器,监测他们的加速度和速度以及其他东西,如球员负荷等。

每个 XML 文件都包含事件实例,说明 ID、开始时间、结束时间和代码如下:

<file>
<SESSION_INFO>
<start_time>2015-09-17 19:02:31.31 +100</start_time>
</SESSION_INFO>
<SORT_INFO>
<sort_type>sort order</sort_type>
</SORT_INFO>
<ALL_INSTANCES>

<instance>
<ID>1</ID>
<start>0</start>
<end>1.51</end>
<code>Accel : 0.00 - 2.00</code>
</instance>

<instance>
<ID>2</ID>
<start>1.52</start>
<end>3.01</end>
<code>Accel : -2.00 - 0.00</code>
</instance>

<instance>
<ID>3</ID>
<start>3.02</start>
<end>4.01</end>
<code>Accel : 0.00 - 2.00</code>
</instance>

<instance>
<ID>4</ID>
<start>4.02</start>
<end>4.21</end>
<code>Accel : 2.00 - 4.00</code>
</instance>
</ALL_INSTANCES>

我有 9 个这样的文件,它们都需要同时处理,并将这些事件同时输入到引擎中。我当前的实现是一个 JAXB 解组器将这些事件馈送到流中,但不知道如何同时执行它(即:在每个流中馈送第一个事件,然后在每个流中馈送第二个事件等)。我正在考虑在实现的那部分使用线程,除非它们是我在 Drools 中错过的另一个工具来帮助做到这一点。但是搜索得相当彻底,没有全面的例子存在同时处理多个流。

我的另一个问题是关于 Pseudoclock。因为我有这 9 个不同的流,事件发生在不同的时间,所以我无法在每次插入后提前时间,因为每个流中的每个事件都发生在不同的时间,因此,这些事件不会排列。所有这些流开始的时间是相同的。例如,如果我在 XML 中的实例 1 发生在 1.51 的持续时间中,并且来自另一个流的另一个事件的持续时间为。说。 4 秒,假设我要推进这两个事件,那么它们将彼此不同步。

但是,我所有的时间相关数据都存在于每个流中。开始时间是 19:02:31,每个事件在通过“结束”时间戳开始后的流中都有一个时间戳(以秒为单位),每个事件的持续时间为(结束时间戳 - 开始时间戳)。我需要对这些流进行的处理包括获取这些加速事件,并将它们与其他流关联起来,只要 2 个或更多玩家以大致相同的持续时间/时间间隔以相同的速率加速。

谁能给我任何指示或帮助?总而言之,我需要知道一种将流同时插入引擎的更好方法,并且需要知道我是否需要伪时钟来实现/处理。我几乎是编程的初学者,所以我只想让系统运行。

非常感谢!

学生。

【问题讨论】:

    标签: java drools rule-engine drools-fusion


    【解决方案1】:

    您不需要同时处理九个 XML 文件,即分布在线程上。 &lt;instance&gt; 元素似乎是根据开始时间或结束时间排序的(这可能取决于在实例事件期间需要计算的内容),您可以按自然顺序处理它们 - 只需确定九流中的下一步是什么。

    这样,您与伪时钟有关的问题也不再是问题。确定后,您可以轻松地将时钟提前到下一个实例事件。

    在不知道所有细节的情况下,我认为每个&lt;instance&gt; 定义了两个事件:玩家开始移动和玩家停止移动。您可能必须重新评估这两个事件中的每一个事件的情况。

    【讨论】:

    • 感谢您的回复。我不确定您所说的“确定九个流中的下一步”是什么意思。您是指将事件输入 CEP 系统还是按照规则?我为每个循环创建了一个循环,它遍历实例集合并将它们插入到规则引擎中,然后每次都触发规则。但是当我通过规则引擎运行它们并打印出一些我想要突出显示的事件时,它会显示所有流 1,然后显示所有流 2。 (我现在只使用两个流)。
    • 确定九个流中的哪一个在当前位置有最旧的事件:这是下一个要插入的事件;在这里你推进职位。 - 这是要在运行会话的 Java 应用程序中编写的代码,其中您有一个循环不断查看所有流。
    • 我也不确定你对伪时钟的反应。如何确定如何推进全局伪时钟?如果我有这 9 个流的事件发生在不同的时间点,并且如果我在每个事件之后继续推进它们,那么整个游戏的结束时间将是它应该的时间长度的 x 9。对不起,如果我不明白。 Mabye 我想太多了。你有什么例子吗?正如我所说,相当初学者的编程和流口水。再次感谢。斯图尔特。
    • 如果时钟在 9:12 并且下一个事件是在 9:21,则将其提前 0:09 在插入事件之前。就这么简单。游戏的长度是从第一个事件的开始到最后一个事件的结束 - 与流的数量无关。
    • 我会试一试。非常感谢!
    猜你喜欢
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多