I have an application running on two instances and only communication between the instances is that they operate on a single database. I have few batch jobs running on it. For example: Copy records from the database to a file and deliver the file to a server. Since there is a common database for both the instances, I'm trying to write to a table that job has been triggered. Basically, a trigger condition is such a record doesn't exist on a given table. How can I perform this atomically, i.e., check the table that job hasn't been triggered then insert into table?
Java - Cron job - if an instance triggers a batch job, prevent other instance from doing the same
1.5k views Asked by rohan At
2
There are 2 answers
0
Peter Walser
On
Pesimistic locking can help here:
- Create a dedicated table that holds a lock record, with the last execution time
- In the scheduled execution, aquire (or create) the lock record over an injected
EntityManagerwithLockModeType.PESSIMISTIC_WRITE. - Check the execution time on the lock record: if it was recently updated, the job must have already been run on another instance
- Otherwise, execute the job, and update the last execution time on the lock record afterwards.
See Lock Modes (Java EE Tutorial) for more details an options.
Example application of such a locking mechanism: Liquibase's DATABASECHANGELOGLOCK table, documented here.
Related Questions in JAVA
- I need the BIRT.war that is compatible with Java 17 and Tomcat 10
- Creating global Class holder
- No method found for class java.lang.String in Kafka
- Issue edit a jtable with a pictures
- getting error when trying to launch kotlin jar file that use supabase "java.lang.NoClassDefFoundError"
- Does the && (logical AND) operator have a higher precedence than || (logical OR) operator in Java?
- Mixed color rendering in a JTable
- HTTPS configuration in Spring Boot, server returning timeout
- How to use Layout to create textfields which dont increase in size?
- Function for making the code wait in javafx
- How to create beans of the same class for multiple template parameters in Spring
- How could you print a specific String from an array with the values of an array from a double array on the same line, using iteration to print all?
- org.telegram.telegrambots.meta.exceptions.TelegramApiException: Bot token and username can't be empty
- Accessing Secret Variables in Classic Pipelines through Java app in Azure DevOps
- Postgres && statement Error in Mybatis Mapper?
Related Questions in SPRING
- HTTPS configuration in Spring Boot, server returning timeout
- Multi Tenancy in Spring - Partitioned Data Approach
- How to create beans of the same class for multiple template parameters in Spring
- org.telegram.telegrambots.meta.exceptions.TelegramApiException: Bot token and username can't be empty
- Springboot: How to get an entity optional property and check null?
- How do I propagate the current SecurityContext to my @RabbitListener in Spring Boot?
- Spring's XML based bean configuration for Object Mapper's Case Insensitive property
- Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. I'm using Postgresql
- springboot class org.hibernate.mapping.Bag cannot be cast to class org.hibernate.mapping.SimpleValue
- Issue while deploying JDK 17 and Spring 6 application in Tomcat 10.1.20
- Spring JPA Data Auditing - How to design it?
- Springframework test: Async not started
- Error: Cannot invoke "jakarta.servlet.http.HttpSession.getAttribute(String)" because "session" is null
- How does spring-retry determine which methods to retry when @Retryable is placed at the class level?
- problem with edge server registration in Eureka
Related Questions in MULTITHREADING
- How can I outsource worker processes within a for loop?
- OpenMP & oneTbb difference
- Receiving Notifications for Individual Task Completion OmniThreadLibrary Parallel.ForEach
- C++ error: no matching member function for call to 'enqueue' futures.emplace_back(TP.enqueue(sum_plus_one, x, &M));
- How can I create a thread in Haskell that will restart if it gets killed due to any reason?
- Qt: running callback in the main thread from the worker thread
- Using `static` on a AVX2 counter function increases performance ~10x in MT environment without any change in Compiler optimizations
- Heap sort with multithreading
- windows multithreading CreateMutex
- The problem of "fine-grained locks and two-phase locking algorithm"
- OpenMP multi-threading not working if OpenMPI set to use one or two MPI processor
- WPF Windows Initializing is locking the separated thread in .Net 8
- TCP Client Losing Connection When Writing Data
- vc++ thread constructor throwing compiler error c2672
- ASP.NET Core 6 Web API : best way to pause before resending email
Related Questions in JPA
- Hibernate SQL Error: Missing FROM-clause entry for table "th1_1"
- JPA Hibernate OneToOne Mapping
- Problem While Fetching the Entity data and its related Entity data with JPA(Lazy Initialization Exception)
- Why does Hibernate execute two SELECT queries instead of one when using @ManyToOne(fetch = FetchType.EAGER)
- JPA Two primary key at owning side and One Foreign Key at the Child
- Approaches to persist enum in java
- Problem with inserting objects into database that have composite ids
- Unique index or primary key violation Spring JPA
- Concurrently open statements
- JPA SPECIFICATION WITH INTERFACE PROJECTIONS
- Conditional uniqness
- Spring JPA + Hibernate + Rest services + long time transactions
- JPA/Hibernate JpaSystemException: identifier of an instance of X was altered from Y to Z
- How to Revert Database Changes Made in a Session Without Using Transaction Management?
- Hibernate generic type handling
Related Questions in ATOMIC
- Thread-safe lock-free min where both operands can change c++
- In Rust, what is the lock-free alternative of Arc<RefCell<T>> if T is already Sync & lock-free?
- Prevent reordering of prefetch instruction in c++
- What can be inferred according to the result of atomic operations?
- How can atomicModifyIORef cause leaks? And why does atomicModifyIORef' solve the problem?
- Critical section control with atomics
- Handling Concurrency, Overflow, and Periodic Draining in a Rust HashMap Collection
- Atomic Operations do not provide updated value to other threads
- memory order with multiple stores
- Why std::mutex of c++11 has no memory order?
- Pausing threads for synchronized operation
- EJB transactions behaving differently on Wildfly 8 between Windows and Linux deployments
- Atomically reorder huge list of documents in firestore
- Atomic increment does not work as expected in interrupt
- Most efficient way to signal consumer thread from multiple producer threads using condition variables
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Popular Tags
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
If you have a scheduled task that needs to be launched, for example, every 15 seconds and should only run on a single instance of app, then you can use ShedLock
It's pretty simple mechanism that basically does the same that you mentioned - creates a table (actually, you need to create it once) and periodically acquires lock for it. You can set up for how much time it should be locked and some others things.
Works with both SQL and NoSQL dbs, like Postgres and Mongo and requires just one annotation
@SchedulerLock. See below: