- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一项服务 (spring-boot),它获取一个 ID 列表,一个一个地从数据库中获取对象,将这些对象聚合成批处理,然后将它们保存在其他地方。目前,聚合后的批量大小约为 50 个对象,大约每秒 10 个对象被发送到聚合路由。现在,我正试图了解如何加快我的路线,或者至少了解瓶颈在哪里。
这是将请求并发发送到 direct:findObject
的 bean@Produce(uri = "direct:findObject")
private ProducerTemplate producerTemplate;
public void send() {
List<Long> listOfIDs = someService.getIDList(); //1000000 ids in the list
listOfIDs.parallelStream().forEach(producerTemplate::sendBody);
}
我的 Camel 路线:
from(direct:findObject)
.bean(objectDaoBean)
.marshal().json(JsonLibrary.Gson, MyObject.class)
.to("direct:aggregator");
from("direct:aggregator")
.unmarshal().json(JsonLibrary.Gson, MyObject.class)
.aggregate(constant(true), new GroupedBodyAggregationStrategy())
.parallelProcessing()
.completionInterval(TimeUnit.SECONDS.toMillis(5))
.completionSize(1000)
.marshal(new GsonDataFormat(new TypeToken<List<MyObject>>() {}.getType()))
.to("direct:bulkSave");
from("direct:bulkSave")
.unmarshal(new GsonDataFormat(new TypeToken<List<MyObject>>() {}.getType()))
.bean(bulkSaveBean);
非常感谢任何有关如何加快整个过程的帮助或见解。
更新:我已经通过@Fábio Carmo Santos 提出的更改设法提高了总体性能(至少 x10)
应用程序属性:
camel.threadpool.pool-size=10
camel.threadpool.max-pool-size=400
camel.threadpool.max-queue-size=-1
更新生产者:
@Produce("direct:splitter")
private ProducerTemplate producerTemplate;
public void sendList() {
List<Long> listOfIDs = getIDList(); //1000000 ids in the list
producerTemplate.sendBody(listOfIDs);
}
修改后的 Camel 路线:
from("direct:splitter")
.split(body())
.parallelProcessing()
.bean(new DaoBean()) //fetch an object by id from db here
.to("direct:aggregator");
from("direct:aggregator")
.aggregate(body(), new GroupedBodyAggregationStrategy())
.parallelProcessing()
.completionInterval(TimeUnit.SECONDS.toMillis(5))
.completionSize(1000)
.to("direct:bulkSave");
from("direct:bulkSave")
.bean(new SaveBean());
在我有日志之前:
Saving... Batch size 30
Saving... Batch size 45
Saving... Batch size 41
Saving... Batch size 53
Saving... Batch size 47
Saving... Batch size 50
并且总体执行时间至少为数小时(从不等到它完成)
现在它更好更快了
Saving... Batch size 499
Saving... Batch size 1000
Saving... Batch size 401
Saving... Batch size 1000
Saving... Batch size 257
Saving... Batch size 1000
最佳答案
getIDList()
时 ID 是否不同?如果不是,您可以区分它们以消除重复的 ID。只有您可以决定它是否有意义。
你为什么不发送路由列表,让 Camel 为你拆分它? Split 中的流媒体选项很有帮助。 PS.: 只有在最近的项目中使用它,我才设法将处理时间从 1 分 30 秒减少到 15 秒!
看看 Threading Model以及。也许,您会想要编辑线程池配置文件。它默认最大为 20。
其实有很多种处理方式。您还可以通过对集合进行分区来对搜索进行分页,然后通过一次从数据库中获取多条记录(假设每次投票 200 条)来丰富您的 Exchange,而不是一条一条地获取,如果需要则使用 AggregationStrategy 或只是拆分搜索结果。
关于java - 如何加快 Camel 路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68853098/
我创建了一个 spring-boot 应用程序,我在其中使用 camel-reSTLet 组件将我的 camel 路由公开为 rest 端点。 我的 camel 路由很简单:它们接受来自北向休息端点的
我有一条路由 (route1),它将数据发送到 HTTP 端点。为此,它必须设置授权 header 。 header 值每小时超时一次,必须更新。 为此,我创建了另一个路由 (route2),它使用提
我正在使用 camel-cdi,它正在注入(inject) CamelContext,检测项目中的所有路由。但是我想要一个带有注册表的 CamelContext,因为我有一些在 Camel route
我想使用来自网络服务的数据并将其放入 Camel eh-cache 中。后来我想通过 CacheManager 在 Camel 上下文之外使用这个缓存。我没有找到任何方法。 在下面的代码中,我跳过了
问题描述: 我无法从我的 Camel servlet 路由到 cxfbean。路由初始化失败并显示以下错误消息: "Failed to create route route1 at: >>> To[c
我想了解 Camel 中的工作单元概念。我有一个简单的问题,希望这里有人可以提供帮助。 例如,如果路由 Exchange 涉及多个路由 from("aws-sqs:Q1").to("direct:pr
首先是我正在尝试做的事情的基本轮廓 我有一个 MQ,我想从 读取消息 预处理 XML,并在 Exchange 上设置属性 发出 HTTP 请求 处理来自 http 请求和初始交换中的属性的数据 将其放
我有一个 SFTP 路由(在 Spring XML 中),它的 from 路径以每日更改的目录(即/yyyyMMdd)结尾,并且在 autoCreate=true 时一切正常或者路径开始时目录存在。但
如何用 Camel 实现这样的过程: 拆分 处理每个拆分的项目 聚合结果 如果发生异常: 停止 split 返回异常前所有item的聚合结果及异常信息 split时定义.stopOnException
我在 Camel 中有一条路线,我想在发生异常时重试,但我想设置一个属性,以便路线第二次可以做一些稍微不同的事情,以尝试阻止错误在重试时再次发生。这是说明我目前正在尝试的想法的路线。 from("di
这两个有何不同 from(endpoint).to(endpoint:a, endpoint:b) from(endpoint).multicast().to(endpoint:a, endpoint
我的 Camel 路线如下(示例) from (activemq:xyz) --- 从 QUEUE 接收消息 to(smpp:abc) --- 提交短信至短信中心 to(cxf:hij) --- 基于
我的 Camel 路线如下(示例) from (activemq:xyz) --- 从队列接收消息 to(smpp:abc) --- 将消息提交给 SMSC to(cxf:hij) --- 基于 SM
当捕获异常时,有什么方法可以停止路由执行(显示日志消息后)? java.lang.IllegalA
我正在使用 Camel 进行集成。我有一个用例,其中 Camel 应该将 1 条消息从一个队列传输到另一个队列,但它不断向队列发送相同的消息。请查看我的以下路线: ProducerTemplate正在
当异常在多播内部抛出时,Camel 不会传播异常。 考虑到以下设置,其中 direct:route 从其 beanRef 抛出异常: rest("/...") .pos
有没有办法使用生产者模板设置 Camel 交换属性? 想象一个接收客户订单的休息端点(尚未在 Camel route )。使用生产者模板,我想 在交易所上设置客户 ID 属性。 稍后在路由 需要时使用
再见,我的基本要求是有一个可以发送消息的路由,并将其放在 JMS 队列中。 camel 上下文在 JavaEE 6 容器中运行,即 JBoss AS 7.1.1,因此它是 HornetQ for JM
Camel 2.23.1 Karaf 4.2.4 白羊座蓝图(用于注册所有内容的外部容器) Camel 蓝图(用于 Camel 路线) Camel CXF(用于 rsServer) CXF 核心(用于
现在我在 Java EE 7 应用程序上使用 JMS 2.0 和 Artemis 1.2.0,我想用 Camel 做一些集成任务。 现在查看 camel-jms 文档,没有提及如何使用通用的 came
我是一名优秀的程序员,十分优秀!