GlassFish允许您调整全局EJB池大小以及每个EJB的特定池大小。通过在max-pool-size
下设置glassfish-ejb-jar.xml
,我可以控制并行使用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()
将作业执行排队。
有人知道这是否可行?
答案 0 :(得分:4)
回答我自己的问题以供进一步参考。
默认情况下,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
,这是一个无限制的托管执行程序。
创建您自己的Managed Executor Service。
./asadmin create-managed-executor-service --maximumpoolsize=20 \
--taskqueuecapacity=5000 --longrunningtasks=true concurrent/myJobExecutor
这会将池限制为20个并发线程。如果当前正在使用所有线程,则执行器服务将在拒绝新条目之前排队最多5000个任务。
不幸的是,最后一个选项(--longrunningtasks=true
)在我的环境中无效。此标志很重要,它可以防止长时间运行的任务挂起。我必须手动设置属性:
./asadmin set resources.managed-executor-service.concurrent/\
myJobExecutor.long-running-tasks=true
调整批处理运行时配置以使用新的Managed Exercutor Service(我还必须设置数据源):
./asadmin set-batch-runtime-configuration --executorservicelookupname \
concurrent/myJobExecutor --datasourcelookupname jdbc/__TimerPool
解雇你的工作,享受美好,理智,平行。