jakarta-ee - Glassfish 设置并发批处理作业的最大数量

标签 jakarta-ee glassfish threadpool batch-processing

GlassFish 允许您调整全局 EJB 池大小以及每个 EJB 的特定池大小。通过设置 glassfish-ejb-jar.xml 下的 max-pool-size,我可以控制可以并行使用的 EJB 实例数量。

<glassfish-ejb-jar>
    <enterprise-beans>
        <ejb>
            <ejb-name>MyExpensiveEJB</ejb-name>
            <bean-pool>
               <max-pool-size>10</max-pool-size>
            </bean-pool>
        </ejb>
    </enterprise-beans>
</glassfish-ejb-jar> 

我想知道是否可以使用 Java EE Batch API 完成类似的操作。我想配置并行作业的最大数量(全局或特定作业),以便调用 BatchRuntime.getJobOperator().start()在指定限制后将作业执行排入队列。

有人知道这是否可行吗?

最佳答案

回答我自己的问题以供进一步引用。

问题

默认情况下,GlassFish Batch Runtime 使用 concurrent/__defaultManagedExecutor 作为其执行程序服务。

您可以通过以下方式检索其属性:

./asadmin get resources.managed-executor-service.concurrent/\
__defaultManagedExecutorService.*

在我的环境中,我得到以下值:

context-info=Classloader,JNDI,Security,WorkArea
context-info-enabled=true
core-pool-size=0
deployment-order=100
enabled=true
hung-after-seconds=0
jndi-name=concurrent/__defaultManagedExecutorService
keep-alive-seconds=60
long-running-tasks=false
maximum-pool-size=2147483647
object-type=system-all
task-queue-capacity=2147483647
thread-lifetime-seconds=0
thread-priority=5

请注意maximum-pool-size=2147483647,这是一个无限制的托管执行器。

解决方案

  1. 创建您自己的Managed Executor Service .

    ./asadmin create-managed-executor-service --maximumpoolsize=20 \
    --taskqueuecapacity=5000 --longrunningtasks=true concurrent/myJobExecutor
    

    这会将池限制为 20 个并发线程。如果当前所有线程都在使用,则执行程序服务将在拒绝新条目之前排队最多 5000 个任务。

  2. 不幸的是,最后一个选项(--longrunningtasks=true)在我的环境中不起作用。这个标志很重要,它可以防止长时间运行的任务被挂起。我必须手动设置属性:

    ./asadmin set resources.managed-executor-service.concurrent/\
    myJobExecutor.long-running-tasks=true
    
  3. 调整批处理运行时配置以使用新的托管执行器服务(我还必须设置数据源):

    ./asadmin set-batch-runtime-configuration --executorservicelookupname \   
    concurrent/myJobExecutor --datasourcelookupname jdbc/__TimerPool
    
  4. 解雇你的工作,享受美好、理智的并行性。


您可以在 GlassFish Administration Guide 中找到有关配置批处理运行时和配置托管执行程序服务的更多信息。

关于jakarta-ee - Glassfish 设置并发批处理作业的最大数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757550/

相关文章:

java - 如何配置eclipse支持java?

java - GlassFish 服务器无法从 Eclipse 启动,卡在 69%

jakarta-ee - Java EE 6 注入(inject)抽象类

java - newCachedThreadPool 和 ThreadFactory

hibernate - 我应该先学习什么,Spring 还是 Hibernate?

jakarta-ee - Spring-Security PasswordEncoder 返回 null

spring - 如何配置 glassfish 以使用应用程序托管实体管理器?

multithreading - 操作系统中多对多模型的问题

java - CompletableFuture.supplyAsync() 中 ForkJoinPool 的行为

java - 提交表单时渲染 wicket 组件