Mule 4 : Dataweave 2.0 : java.lang.StackOverflowError.

问题描述 投票:0回答:1

我有一个用例,我必须从两个不同的数据库中分别获取10k条记录,并做一些数据丰富,并将这20k条记录分批推送到第三个数据库。

我遵循的方法是

  1. 从数据库中获取数据,使用一个散点收集,这样我就可以在同一个Mule的payload中获取两个payload,并且我可以以payload[0].payload和payload[1].payload的形式访问它们。
  2. 使用数据编织变换器来连接记录。
  3. 用for每一个循环将数据以2k的批量大小插入到第三个数据库。

但是在做这个事情的时候,我经常在我的transform message组件中面临MULE JVM错误的意思。

Message               : java.lang.StackOverflowError.
Error type            : MULE:FATAL_JVM_ERROR

有没有什么博客或者mule中的设计模式可以更好的解决这个问题?

Dataweave代码。

<ee:transform doc:name="Outer Join And Merge" doc:id="fd801b56-9992-4a89-95a3-62ab4c4dc5a2">
<ee:message>
<ee:set-payload>%dw 2.0
import * from dw::core::Arrays
output application/java
var joinedData = outerJoin(vars.databaseOneRecords,vars.databaseTwoRecords,(obj)->obj.StudentID,(obj)->obj.RollNumber)
---
joinedData reduce ((item, acc = {
    'matched': [],
    'unmatched': []
})      
                            ->  if(item.l != null and item.r != null)
                                    {
    matched: (acc.matched default []) ++ [item.l ++ item.r],
    unmatched: acc.unmatched
}  
                                    else {
    matched: acc.matched,
    unmatched: (acc.unmatched default []) ++ [ if(item.l != null) item.l else item.r ]
} )</ee:set-payload>
</ee:message>
</ee:transform>



dataweave mule4
1个回答
1
投票

我通常在 "ETL "世界里看到2种模式。

  1. In-Memory: 找一台有大量内存的机器 在内存中处理所有的数据 就像你现在采取的方法一样。
  2. 经典的ETL。 他们使用一个暂存区,就像一个中间数据库,在那里你把所有的信息放进去,然后做一些查询,一次性提取你需要的所有信息。这种方法使用的内存要少很多。

具体说到Mule,他们是否全开内存,要看你如何从流中获取信息。例如,如果你做一些类似groupBy的事情,或者在上面做一些搜索,强制它回去,很可能就是全流进入Memory了。

© www.soinside.com 2019 - 2024. All rights reserved.