-
Notifications
You must be signed in to change notification settings - Fork 304
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JBatch and Postgresql db as job repository fails #195
Comments
Could you let me know your configuration. I have tested a simple batch application on Postgres and it seems to work. Connection pool Settings are; ResourceType: javax.sql.DataSource In my JBatch runtime configuration Postgres JDBC driver installed in glassfish/domains/domain1/lib |
Reproduced using Cargo tracker [#|2015-02-05T22:52:00.058+0000|WARNING|Payara 4.1|com.ibm.jbatch.container.impl.JobThreadRootControllerImpl|_ThreadID=221;_ThreadName=concurrent/__defaultManagedExecutorService-managedThreadFactory-Thread-2;_TimeMillis=1423176720058;_LevelValue=900;| [#|2015-02-05T22:52:00.058+0000|INFO|Payara 4.1|net.java.cargotracker.interfaces.handling.file.FileProcessorJobListener|_ThreadID=221;_ThreadName=concurrent/__defaultManagedExecutorService-managedThreadFactory-Thread-2;_TimeMillis=1423176720058;_LevelValue=800;| |
Reproduced also using cargo tracker but not using the jbatch payroll and job-operator-api samples. |
Error in not seen on other databases such as Oracle, MySQL and derby etc |
Oracle 11g which I tested with also has the transaction isolation set to read_committed so both postgres and oracle have the same transaction isolation level. Change also the tx isolation for the jbatch postgres pool to serializable and the same issue occurs. |
This issue is timing related as already noted. I believe this is what is happening we have two transactions, one is attempting to insert/update a row in the jobstatus table (tx1) while at the same time a select is done to retrieve the value of this row in another transaction (tx2). Since tx2 has started before tx1 has committed its data to the jobstatus table then we receive a NullPointerException since no value is present in the jobstatus table. The only way I believe to properly fix this issue is to ensure that when the SELECT is done to read the job status row value that updates to the JOBSTATUS table row data are done in the same transaction as we the select can view uncommitted changes if they are in the same transaction. From the postgres 9.3 docs Thoughts?? |
I'm currently testing payara 4.1.151 with a local postgresql db as job repository, but everytime when my batch-job get executed, I get the following exception:
Warnung: Caught throwable in main execution loop with Throwable message: null, and stack trace: java.lang.NullPointerException
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.updateBatchStatus(BaseStepControllerImpl.java:282)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markStepFailed(BaseStepControllerImpl.java:238)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markJobAndStepFailed(BaseStepControllerImpl.java:243)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:128)
at com.ibm.jbatch.container.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:112)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.originateExecutionOnThread(JobThreadRootControllerImpl.java:110)
at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)
Warnung: Caught throwable from run(). Stack trace: java.lang.IllegalStateException: Couldn't find entry to update for id = 1
at com.ibm.jbatch.container.services.impl.JobStatusManagerImpl.updateJobBatchStatus(JobStatusManagerImpl.java:82)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.persistJobBatchAndExitStatus(JobThreadRootControllerImpl.java:214)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.endOfJob(JobThreadRootControllerImpl.java:200)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.originateExecutionOnThread(JobThreadRootControllerImpl.java:128)
at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)
Warnung: Caught throwable in main execution loop with Throwable message: null, and stack trace: java.lang.NullPointerException
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.updateBatchStatus(BaseStepControllerImpl.java:282)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markStepFailed(BaseStepControllerImpl.java:238)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markJobAndStepFailed(BaseStepControllerImpl.java:243)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:128)
at com.ibm.jbatch.container.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:112)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.originateExecutionOnThread(JobThreadRootControllerImpl.java:110)
at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)
Warnung: Caught throwable in main execution loop with Throwable message: null, and stack trace: java.lang.NullPointerException
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.updateBatchStatus(BaseStepControllerImpl.java:282)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markStepFailed(BaseStepControllerImpl.java:238)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.markJobAndStepFailed(BaseStepControllerImpl.java:243)
at com.ibm.jbatch.container.impl.BaseStepControllerImpl.execute(BaseStepControllerImpl.java:128)
at com.ibm.jbatch.container.impl.ExecutionTransitioner.doExecutionLoop(ExecutionTransitioner.java:112)
at com.ibm.jbatch.container.impl.JobThreadRootControllerImpl.originateExecutionOnThread(JobThreadRootControllerImpl.java:110)
at com.ibm.jbatch.container.util.BatchWorkUnit.run(BatchWorkUnit.java:80)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at org.glassfish.enterprise.concurrent.internal.ManagedFutureTask.run(ManagedFutureTask.java:141)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
at org.glassfish.enterprise.concurrent.ManagedThreadFactoryImpl$ManagedThread.run(ManagedThreadFactoryImpl.java:250)
To reproduce this bug, you have to do the following:
The strange part is, if you set the logging for "fish.payara.jbatch.persistence.rdbms" to FINEST you can avoid the exception above, but this is not reliable. sometimes an exception gets thrown anyway.
For me it seems like some kind of raise-condition occurs.
The text was updated successfully, but these errors were encountered: