使用Spring批处理2.2.1,我已经配置了Spring Batch Job,我使用了这种方法:
配置如下:
Tasklet使用ThreadPoolTaskExecutor限制为15个线程
throttle-limit等于线程数
块用于:
1个JdbcCursorItemReader的同步适配器,允许许多线程按照Spring Batch文档推荐使用它
您可以将调用同步到read(),只要处理和写入是块中最昂贵的部分,您的步骤可能仍然比单线程配置快得多.
JdbcCursorItemReader上的saveState为false
基于JPA的Custom ItemWriter.请注意,它对一个项目的处理可能在处理时间方面有所不同,可能需要几毫秒到几秒(> 60秒).
commit-interval设置为1(我知道它可能会更好,但不是问题)
关于Spring Batch doc Recommendmandation,所有jdbc池都没问题
由于以下原因,运行批处理会导致非常奇怪和糟糕的结果:
看看Spring Batch代码,根本原因似乎在这个包中:
这种工作方式是一种功能还是限制/错误?
如果它是一个功能,配置的方式是什么方式使所有线程不被长时间的处理工作挨饿而不必重写所有内容?
请注意,如果所有项目都占用相同的时间,一切正常,多线程就可以了,但如果其中一项处理需要花费更多时间,那么多线程在慢速进程工作时几乎无用.
注意我打开了这个问题:
我正在使用 Jetty Client 11,并且想计算每个请求发送/接收的字节。
我正在使用高级 HttpClient 。我已阅读此文档,但没有看到任何有关如何执行此操作的信息:
我发现有一种方法可以通过执行以下操作来获取此信息:
ConnectionStatistics connectionStatistics = new ConnectionStatistics();
httpClient.addBean(connectionStatistics);
Run Code Online (Sandbox Code Playgroud)
然后:
Request request = httpClient.newRequest(uri)
.version(HttpVersion.HTTP_2)
.timeout(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
request.send(listener);
ConnectionStatistics connectionStatistics = httpClient.getBean(ConnectionStatistics.class);
System.out.println(connectionStatistics.getSentBytes()+"/"+ connectionStatistics.getReceivedBytes());
Run Code Online (Sandbox Code Playgroud)
我肯定做错了什么,因为它甚至在全球范围内都不起作用,它总是给出 0。
无论如何,我不知道如何让它根据请求工作。
编辑:
我尝试过@sbordet 回答:
httpClient.newRequest(...)
.onRequestContent((req, buf) -> requestBytes.add(buf.remaining()))
...
.onResponseContent((res, buf) -> responseBytes.add(buf.remaining()))
...
send(...);
Run Code Online (Sandbox Code Playgroud)
它对于响应效果很好。 但是对于请求,我想测量发送的字节数,它总是给出 0 (注意我只有没有内容的获取),而我希望有原始大小(原始 HTTP 请求字节,包括标头大小...)
java ×2
performance ×2
http ×1
http2 ×1
jetty ×1
jetty-9 ×1
jmeter ×1
listener ×1
spring ×1
spring-batch ×1