在Drools中从工作记忆中检索到的对象的顺序

在Drools中从工作记忆中检索到的对象的顺序,drools,rule,Drools,Rule,我们已经编写了一个规则,用于更改在同一天重复且每天只应计费一次的已计费项目的状态。所有项目的状态都以2或3开头 如果在状态为2或3的项目上检测到重复代码,该项目将获得状态4,并且工作内存中的项目将被更新 当实现单元测试时,我们可以看到结果是正确的,但是一旦我们从工作内存中检索到对象,项目的顺序似乎已经变得非常随机。 这正常吗?为什么会发生?(显然,如果有异常,只需重新排列列表即可纠正) 对象以以下方式插入: Iterator<Object> it = objects.iterator

我们已经编写了一个规则,用于更改在同一天重复且每天只应计费一次的已计费项目的状态。所有项目的状态都以2或3开头

如果在状态为2或3的项目上检测到重复代码,该项目将获得状态4,并且工作内存中的项目将被更新

当实现单元测试时,我们可以看到结果是正确的,但是一旦我们从工作内存中检索到对象,项目的顺序似乎已经变得非常随机。 这正常吗?为什么会发生?(显然,如果有异常,只需重新排列列表即可纠正)

对象以以下方式插入:

Iterator<Object> it = objects.iterator();
while (it.hasNext()) {
    sessionStatefull.insert(it.next());
}
    List<Object> list = new ArrayList<Object>((Collection<Object>) sessionStatefull.getObjects());
输入总是相同的:

Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169800, units=1.0, code=1   ]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169801, units=1.0, code=1   ]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169802, units=1.0, code=2   ]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169803, units=1.0, code=2   ]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169804, units=1.0, code=6358]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169805, units=1.0, code=6007]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169806, units=1.0, code=6007]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169807, units=1.0, code=6385]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169808, units=1.0, code=6005]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169809, units=1.0, code=6225]
通过以下方式获得输出:

Iterator<Object> it = objects.iterator();
while (it.hasNext()) {
    sessionStatefull.insert(it.next());
}
    List<Object> list = new ArrayList<Object>((Collection<Object>) sessionStatefull.getObjects());
例2:

Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169804, units=1.0, code=6358]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=4, id=150107315169803, units=1.0, code=2   ]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=4, id=150107315169806, units=1.0, code=6007]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169805, units=1.0, code=6007]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=4, id=150107315169801, units=1.0, code=1   ]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169808, units=1.0, code=6005]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169807, units=1.0, code=6385]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169800, units=1.0, code=1   ]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169809, units=1.0, code=6225]
Item [date=Tue Jul 25 00:00:00 CEST 2017, status=2, id=150107315169802, units=1.0, code=2   ]
logger类的定义如下:

public class OutputDisplay {

    public void showText(String source, String text) {
        try {
            long time = System.currentTimeMillis();
            Date date = new Date(time);
            writeLog(time+" "+date.toString()+" A message from "+source+": "+text);

        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

writeLog打开一个文件并添加行。我们还没有注意到一些更复杂的日志记录(如logback…。

Drools在内部没有保持插入对象的顺序。您正在使用的
getObjects()
方法通过返回
集合而不是
列表来说明这一点

记录器按顺序显示对象,因为在将新对象插入工作内存时,会立即调用它

如果你想给你的对象一些逻辑顺序,我建议你在从工作记忆中检索它们之后再对它们进行排序


希望有帮助,

您是如何从工作记忆中提取这些对象的?您好,谢谢您的回复。我编辑这个问题是为了给你提供你想要的信息。你的回答绝对有帮助。很高兴知道,在内部,顺序不是在Drools中维护的,如果需要,应该在流程中实现某种顺序。
public class OutputDisplay {

    public void showText(String source, String text) {
        try {
            long time = System.currentTimeMillis();
            Date date = new Date(time);
            writeLog(time+" "+date.toString()+" A message from "+source+": "+text);

        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }