You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by zh...@apache.org on 2023/02/10 14:25:29 UTC

[camel] branch main updated: Rewrite JdbcOrphanLockAwareIdempotentRepository::insert to not rely on exception (#9286)

This is an automated email from the ASF dual-hosted git repository.

zhfeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new 6d566472a81 Rewrite JdbcOrphanLockAwareIdempotentRepository::insert to not rely on exception (#9286)
6d566472a81 is described below

commit 6d566472a8138218ce5f74ad2e902fe08ab8312d
Author: Marco Bungart <32...@users.noreply.github.com>
AuthorDate: Fri Feb 10 15:25:21 2023 +0100

    Rewrite JdbcOrphanLockAwareIdempotentRepository::insert to not rely on exception (#9286)
    
    * Removed the transaction since:
    - the initial exception will mark the transaction as dirty, blocking subsequent changes
    - not all databases support rollback of DDL (e.g MySQL, older Oracle DBs)
    
    * rewrote insert such that no exception is thrown
    
    * reverted changes to JdbcMessageIdRepository
    
    * format fixes
---
 .../jdbc/JdbcOrphanLockAwareIdempotentRepository.java    | 16 +++++++++-------
 .../idempotent/jdbc/JdbcMessageIdRepositoryTest.java     |  3 +--
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcOrphanLockAwareIdempotentRepository.java b/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcOrphanLockAwareIdempotentRepository.java
index a84cbff205f..2934a71e153 100644
--- a/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcOrphanLockAwareIdempotentRepository.java
+++ b/components/camel-sql/src/main/java/org/apache/camel/processor/idempotent/jdbc/JdbcOrphanLockAwareIdempotentRepository.java
@@ -31,7 +31,6 @@ import javax.sql.DataSource;
 import org.apache.camel.CamelContext;
 import org.apache.camel.ShutdownableService;
 import org.apache.camel.spi.ExecutorServiceManager;
-import org.springframework.dao.DuplicateKeyException;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.transaction.support.TransactionTemplate;
 
@@ -119,12 +118,15 @@ public class JdbcOrphanLockAwareIdempotentRepository extends JdbcMessageIdReposi
         Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis());
         long stamp = sl.writeLock();
         try {
-            int result = jdbcTemplate.update(getInsertString(), processorName, key, currentTimestamp);
-            processorNameMessageIdSet.add(new ProcessorNameAndMessageId(processorName, key));
-            return result;
-        } catch (DuplicateKeyException e) {
-            //Update in case of orphan lock where a process dies without releasing exist lock
-            return jdbcTemplate.update(getUpdateTimestampQuery(), currentTimestamp, processorName, key);
+            if (jdbcTemplate.queryForObject(getQueryString(), Integer.class, processorName, key) == 0) {
+                int result = jdbcTemplate.update(getInsertString(), processorName, key, currentTimestamp);
+                processorNameMessageIdSet.add(new ProcessorNameAndMessageId(processorName, key));
+                return result;
+            } else {
+                //Update in case of orphan lock where a process dies without releasing exist lock
+                return jdbcTemplate.update(getUpdateTimestampQuery(), currentTimestamp,
+                        processorName, key);
+            }
         } finally {
             sl.unlockWrite(stamp);
         }
diff --git a/components/camel-sql/src/test/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepositoryTest.java b/components/camel-sql/src/test/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepositoryTest.java
index 904724d411d..5d11a8bff2c 100644
--- a/components/camel-sql/src/test/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepositoryTest.java
+++ b/components/camel-sql/src/test/java/org/apache/camel/processor/idempotent/jdbc/JdbcMessageIdRepositoryTest.java
@@ -45,7 +45,6 @@ public class JdbcMessageIdRepositoryTest extends CamelSpringTestSupport {
     protected static final String PROCESSOR_NAME = "myProcessorName";
 
     protected JdbcTemplate jdbcTemplate;
-    protected DataSource dataSource;
 
     @EndpointInject("mock:result")
     protected MockEndpoint resultEndpoint;
@@ -58,7 +57,7 @@ public class JdbcMessageIdRepositoryTest extends CamelSpringTestSupport {
     public void setUp() throws Exception {
         super.setUp();
 
-        dataSource = context.getRegistry().lookupByNameAndType("dataSource", DataSource.class);
+        DataSource dataSource = context.getRegistry().lookupByNameAndType("dataSource", DataSource.class);
         jdbcTemplate = new JdbcTemplate(dataSource);
         jdbcTemplate.afterPropertiesSet();
     }