From 96ae788412fd6e4dc11a8530ddf1ddbbf6b4f623 Mon Sep 17 00:00:00 2001 From: GiuseppeS Date: Mon, 21 Oct 2024 11:51:33 +0200 Subject: [PATCH] Migliorata gestione del transaction group id nelle sincronizzazioni --- .../model/Migration_20241021113736.java | 47 +++++++++++++++++++ .../it/integry/ems/sync/AsyncManager.java | 40 +++++----------- .../ems_model/entity/StbPublications.java | 19 ++++++-- 3 files changed, 76 insertions(+), 30 deletions(-) create mode 100644 ems-core/src/main/java/it/integry/ems/migration/model/Migration_20241021113736.java diff --git a/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20241021113736.java b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20241021113736.java new file mode 100644 index 0000000000..71db1d0922 --- /dev/null +++ b/ems-core/src/main/java/it/integry/ems/migration/model/Migration_20241021113736.java @@ -0,0 +1,47 @@ +package it.integry.ems.migration.model; + +import it.integry.ems.migration._base.BaseMigration; +import it.integry.ems.migration._base.MigrationModelInterface; +import it.integry.ems_model.entity.StbPublications; +import it.integry.ems_model.types.OperationType; +import it.integry.ems_model.utility.UtilityDB; + +import java.util.List; + +public class Migration_20241021113736 extends BaseMigration implements MigrationModelInterface { + + @Override + public void up() throws Exception { + if (isHistoryDB()) + return; + + String sql = "ALTER TABLE dbo.stb_publications" + + " ADD last_group_id BIGINT DEFAULT 0 NOT NULL"; + + executeStatement(sql); + + String maxTransactionIdSql = "SELECT MAX(group_id) AS max_id " + + "FROM stb_transaction_log"; + Long maxTransactionId = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn(advancedDataSource.getConnection(), maxTransactionIdSql); + maxTransactionId = maxTransactionId == null ? 0 : ++maxTransactionId; + + String retrievePublicationsSql = "SELECT * FROM stb_publications"; + final List stbPublications = UtilityDB.executeSimpleQueryDTO(advancedDataSource.getConnection(), retrievePublicationsSql, StbPublications.class); + + if (stbPublications == null || stbPublications.isEmpty()) + return; + + for (StbPublications stbPublication : stbPublications) { + stbPublication.setLastGroupId(maxTransactionId); + + stbPublication.setOperation(OperationType.UPDATE); + stbPublication.manageWithParentConnection(advancedDataSource.getConnection()); + } + } + + @Override + public void down() throws Exception { + + } + +} \ No newline at end of file diff --git a/ems-core/src/main/java/it/integry/ems/sync/AsyncManager.java b/ems-core/src/main/java/it/integry/ems/sync/AsyncManager.java index f282d8572d..96e9a76150 100644 --- a/ems-core/src/main/java/it/integry/ems/sync/AsyncManager.java +++ b/ems-core/src/main/java/it/integry/ems/sync/AsyncManager.java @@ -10,6 +10,7 @@ import it.integry.ems.settings.SettingsController; import it.integry.ems.sync.MultiDBTransaction.MultiDBTransactionManager; import it.integry.ems.utility.UtilityDebug; import it.integry.ems_model.base.EntityBase; +import it.integry.ems_model.entity.StbPublications; import it.integry.ems_model.entity.StbPublicationsDetail; import it.integry.ems_model.entity.StbTransactionLog; import it.integry.ems_model.types.OperationType; @@ -41,7 +42,6 @@ public class AsyncManager { @Autowired private SettingsController settingsController; - private final static HashMap> cachedSetup = new HashMap<>(); private final static ConcurrentLinkedQueue> toBeSavedQueue = new ConcurrentLinkedQueue<>(); @@ -82,15 +82,12 @@ public class AsyncManager { } private void cacheSetup(String dbName, String profileName) throws Exception { - MultiDBTransactionManager multiDBTransactionManager = new MultiDBTransactionManager(profileName, false); - try { + try (MultiDBTransactionManager multiDBTransactionManager = new MultiDBTransactionManager(profileName, false)) { String sql = "SELECT * FROM " + StbPublicationsDetail.ENTITY + " WHERE active = 1"; List publications = UtilityDB.executeSimpleQueryDTO(multiDBTransactionManager.getPrimaryConnection(), sql, StbPublicationsDetail.class); cachedSetup.putIfAbsent(dbName, publications); - } finally { - multiDBTransactionManager.closeAll(); } } @@ -108,7 +105,7 @@ public class AsyncManager { //logger.debug("SYNC OFFLINE ABILITATA SU " + tableName); - for (StbPublicationsDetail activePublication : activePublications){ + for (StbPublicationsDetail activePublication : activePublications) { List myObjs = new ArrayList<>(); myObjs.add(entityBase); @@ -129,13 +126,13 @@ public class AsyncManager { return activePublication.getStbPublicationId(); } - return 0; + return 0; } public static Long saveNewTransaction(Connection connection, String dbName, EntityBase entityBase, long publicationId, Long transactionGroupId) throws Exception { //TODO: Calc transaction group ID here - if (transactionGroupId == null) transactionGroupId = getNextTransactionGroupId(connection, dbName); + if (transactionGroupId == null) transactionGroupId = getNextTransactionGroupId(connection, publicationId); ResponseJSONObjectMapper jsonObjectMapper = ContextLoader.getCurrentWebApplicationContext().getBean(ResponseJSONObjectMapper.class); @@ -153,28 +150,17 @@ public class AsyncManager { } - public static long getNextTransactionGroupId(Connection connection, String dbName) throws Exception { + private static long getNextTransactionGroupId(Connection connection, long publicationId) throws Exception { + String retrievePublicationSql = "SELECT * FROM " + StbTransactionLog.ENTITY + + " WHERE id = " + publicationId; - final long maxToBeProcessed = toBeSavedQueue.stream().filter(x -> x.getKey().equalsIgnoreCase(dbName)) - .map(x -> x.getValue().getGroupId()) - .max(Long::compare) - .orElse(0L); + final StbPublications stbPublication = UtilityDB.executeSimpleQueryOnlyFirstRowDTO(connection, retrievePublicationSql, StbPublications.class); + stbPublication.setLastGroupId(stbPublication.getLastGroupId() + 1); - long transactionGroupId = 0; + stbPublication.setOperation(OperationType.UPDATE); + stbPublication.manageWithParentConnection(connection); - if (maxToBeProcessed <= 0) { - Long tmpTransactionGroupId = UtilityDB.executeSimpleQueryOnlyFirstRowFirstColumn( - connection, "SELECT MAX(group_id) AS max_id FROM " + StbTransactionLog.ENTITY); - - tmpTransactionGroupId = UtilityLong.isNull(tmpTransactionGroupId,0L); - - transactionGroupId = Math.max(maxToBeProcessed, tmpTransactionGroupId); - } else { - transactionGroupId = maxToBeProcessed; - } - - transactionGroupId++; //Incremento l'ID - return transactionGroupId; + return stbPublication.getLastGroupId(); } diff --git a/ems-core/src/main/java/it/integry/ems_model/entity/StbPublications.java b/ems-core/src/main/java/it/integry/ems_model/entity/StbPublications.java index 2a4298ab62..3579fbec57 100644 --- a/ems-core/src/main/java/it/integry/ems_model/entity/StbPublications.java +++ b/ems-core/src/main/java/it/integry/ems_model/entity/StbPublications.java @@ -4,11 +4,12 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import it.integry.ems_model.annotation.*; import it.integry.ems_model.base.EntityBase; import it.integry.ems_model.utility.Query; -import org.kie.api.definition.type.PropertyReactive; -import java.util.ArrayList; -import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.kie.api.definition.type.PropertyReactive; + +import java.util.ArrayList; +import java.util.List; @Master @PropertyReactive @@ -30,6 +31,9 @@ public class StbPublications extends EntityBase { @SqlField(value = "publication_description", maxLength = 1024, nullable = false) private String publicationDescription; + @SqlField(value = "last_group_id", defaultObjectValue = "0") + private Long lastGroupId; + @EntityChild(copyPk = false) private List stbPublicationsDetails = new ArrayList<>(); @@ -55,6 +59,15 @@ public class StbPublications extends EntityBase { return this; } + public Long getLastGroupId() { + return lastGroupId; + } + + public StbPublications setLastGroupId(Long lastGroupId) { + this.lastGroupId = lastGroupId; + return this; + } + public List getStbPublicationsDetails() { return stbPublicationsDetails; }