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

Jakarta ee Glassfish设置并发批处理作业的最大数量,jakarta-ee,glassfish,threadpool,batch-processing,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> <b

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> 

MyExpensiveEJB
10
我想知道是否可以用JavaEE批处理API做类似的事情。我想配置并行作业的最大数量(全局或特定作业),以便在指定的限制后调用将作业执行排队


有人知道这是否可行吗?

回答我自己的问题以供进一步参考

问题 默认情况下,GlassFish批处理运行时使用
并发/\u 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
请注意,
最大池大小=2147483647
,这是一个不受限制的托管执行器

解决方案
  • 创造你自己的

    这将池限制为20个并发线程。如果所有线程当前都在使用中,executor服务将在拒绝新条目之前排队等待多达5000个任务

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

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

  • 解雇你的工作,享受美好、理智、平行



  • 您可以在

    中找到有关配置批处理运行时和配置托管执行器服务的更多信息,感谢alot Anthony,java.net最近关闭,所有文档现在都在
    ./asadmin set resources.managed-executor-service.concurrent/\
    myJobExecutor.long-running-tasks=true
    
    ./asadmin set-batch-runtime-configuration --executorservicelookupname \   
    concurrent/myJobExecutor --datasourcelookupname jdbc/__TimerPool