Skip to content
Snippets Groups Projects
Commit 72fc080d authored by tranoris's avatar tranoris
Browse files

fixes for DB connection leaks for metrico transactions

parent 983bb4fd
Branches tmf628
No related tags found
2 merge requests!59MR for Release 2024Q4,!56Fixes for DB connection leaks for metrico transactions
Pipeline #11114 passed
package org.etsi.osl.tmf.pm628.repo;
import java.util.Optional;
import org.etsi.osl.tmf.pm628.model.ExecutionStateType;
import org.etsi.osl.tmf.pm628.model.MeasurementCollectionJob;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface MeasurementCollectionJobRepository extends CrudRepository<MeasurementCollectionJob, Long>, PagingAndSortingRepository<MeasurementCollectionJob, Long> {
public interface MeasurementCollectionJobRepository extends JpaRepository <MeasurementCollectionJob, Long> {
Optional<MeasurementCollectionJob> findByUuid(String uuid);
Iterable<MeasurementCollectionJob> findByExecutionState(ExecutionStateType executionState);
......
......@@ -6,6 +6,7 @@ import jakarta.validation.Valid;
import org.etsi.osl.tmf.pm628.api.MeasurementCollectionJobApiRouteBuilderEvents;
import org.etsi.osl.tmf.pm628.model.*;
import org.etsi.osl.tmf.pm628.repo.MeasurementCollectionJobRepository;
import org.etsi.osl.tmf.so641.model.ServiceOrder;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
......@@ -15,11 +16,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.time.OffsetDateTime;
import java.util.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
......@@ -288,58 +291,63 @@ public class MeasurementCollectionJobService {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Hibernate5JakartaModule());
String res = mapper.writeValueAsString(mcj);
log.debug("=====> MCJObjectMapper {}", res);
return res;
}
@Transactional
private MeasurementCollectionJob findMeasurementCollectionJobByUuidEager(String id) {
if ( id == null || id.equals("")) {
if (id == null || id.equals("")) {
return null;
}
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
MeasurementCollectionJob s = null;
try {
}
MeasurementCollectionJob s = null;
try (Session session = sessionFactory.openSession()) {
Transaction tx = session.beginTransaction();
s = (MeasurementCollectionJob) session.get(MeasurementCollectionJob.class, id);
if (s == null) {
return this.findMeasurementCollectionJobByUuid(id);// last resort
log.debug("=====> findMeasurementCollectionJobByUuidEager last resort");
return this.findMeasurementCollectionJobByUuid(id);// last resort
}
Hibernate.initialize(s.getDataAccessEndpoint() );
Hibernate.initialize(s.getFileTransferData() );
Hibernate.initialize(s.getPerformanceIndicatorGroupSpecification() );
Hibernate.initialize(s.getDataAccessEndpoint());
Hibernate.initialize(s.getFileTransferData());
Hibernate.initialize(s.getPerformanceIndicatorGroupSpecification());
Hibernate.initialize(s.getPerformanceIndicatorSpecification());
Hibernate.initialize(s.getScheduleDefinition() );
Hibernate.initialize(s.getTrackingRecord() );
Hibernate.initialize(s.getScheduleDefinition());
Hibernate.initialize(s.getTrackingRecord());
tx.commit();
} finally {
session.close();
}
return s;
} catch (Exception e) {
e.printStackTrace();
}
return s;
}
@Transactional
public MeasurementCollectionJob findMeasurementCollectionJobByUuid(String uuid){
log.debug("MeasurementCollectionJob FIND BY UUID");
Optional<MeasurementCollectionJob> measurementCollectionJob = measurementCollectionJobRepository.findByUuid(uuid);
return measurementCollectionJob.orElse(null);
}
@Transactional
public MeasurementCollectionJob createMeasurementCollectionJob(MeasurementCollectionJobFVO measurementCollectionJobFVO){
log.debug("MeasurementCollectionJob CREATE: {}", measurementCollectionJobFVO);
MeasurementCollectionJobMapper mapper = Mappers.getMapper(MeasurementCollectionJobMapper.class);
MeasurementCollectionJob mcj = mapper.createMeasurementCollectionJob(measurementCollectionJobFVO);
mcj = this.measurementCollectionJobRepository.save(mcj);
mcj.setCreationTime( OffsetDateTime.now() );
mcj.setLastModifiedTime( OffsetDateTime.now());
mcj = this.measurementCollectionJobRepository.saveAndFlush(mcj);
raiseMCJCreateNotification(mcj);
return mcj;
}
@Transactional
public MeasurementCollectionJob updateMeasurementCollectionJob(String uuid, @Valid MeasurementCollectionJobMVO measurementCollectionJobUpdate){
log.debug("MeasurementCollectionJob UPDATE with UUID: {}", uuid);
......@@ -352,8 +360,10 @@ public class MeasurementCollectionJobService {
MeasurementCollectionJobMapper mapper = Mappers.getMapper(MeasurementCollectionJobMapper.class);
measurementCollectionJob = mapper.updateMeasurementCollectionJob(measurementCollectionJobUpdate, measurementCollectionJob);
measurementCollectionJob.setLastModifiedTime( OffsetDateTime.now());
measurementCollectionJob = this.measurementCollectionJobRepository.save(measurementCollectionJob);
// This may be unnecessary since MeasurementCollectionJobMVO doesn't have the executionState attribute
if ( originalExecutionState!=null) {
executionStateChanged = !originalExecutionState.equals(measurementCollectionJob.getExecutionState());
......@@ -373,12 +383,12 @@ public class MeasurementCollectionJobService {
MeasurementCollectionJob measurementCollectionJob = measurementCollectionJobRepository.findByUuid(uuid)
.orElseThrow(() -> new IllegalArgumentException("No MeasurementCollectionJob with UUID: " + uuid));
measurementCollectionJobRepository.delete(measurementCollectionJob);
raiseMCJDeleteNotification(measurementCollectionJob);
return null;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
private void raiseMCJCreateNotification(MeasurementCollectionJob mcj){
// Create the event payload
MeasurementCollectionJobRef ref = new MeasurementCollectionJobRef();
......@@ -399,6 +409,7 @@ public class MeasurementCollectionJobService {
routeBuilderEvents.publishEvent(event, mcj.getUuid());
}
@Transactional
private void raiseMCJAttributeValueChangeNotification(MeasurementCollectionJob mcj){
// Create the event payload
......@@ -414,6 +425,7 @@ public class MeasurementCollectionJobService {
routeBuilderEvents.publishEvent(event, mcj.getUuid());
}
@Transactional
private void raiseMCJExecutionStateChangeNotification(MeasurementCollectionJob mcj){
// Create the event payload
......@@ -429,6 +441,7 @@ public class MeasurementCollectionJobService {
routeBuilderEvents.publishEvent(event, mcj.getUuid());
}
@Transactional
private void raiseMCJDeleteNotification(MeasurementCollectionJob mcj){
// Create the event payload
......
......@@ -49,10 +49,13 @@ spring:
username: root
hikari:
minimumIdle: 2
maximumPoolSize: 40
idleTimeout: 120000
connectionTimeout: 400000
leakDetectionThreshold: 100000
maximumPoolSize: 20
idleTimeout: 20000
idle-timeout: 20000
connectionTimeout: 40000
leakDetectionThreshold: 30000
jpa:
database-platform: org.etsi.osl.tmf.LocalMysqlDialect
hibernate:
......
package org.etsi.osl.services.api.pm628;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.IOUtils;
......@@ -114,6 +115,7 @@ public class MeasurementCollectionJobApiControllerTest {
assertThat(mcj2.getReportingPeriod()).isEqualTo(mcj.getReportingPeriod());
}
@WithMockUser(username="osadmin", roles = {"USER","ADMIN"})
@Test
public void testCreateMeasurementCollectionJob() throws Exception {
......@@ -126,6 +128,39 @@ public class MeasurementCollectionJobApiControllerTest {
assertThat(mcj.getExecutionState()).isEqualTo(ExecutionStateType.ACKNOWLEDGED);
assertThat(mcj.getGranularity()).isEqualTo(Granularity.fromValue("g_1mn"));
assertThat(mcj.getReportingPeriod()).isEqualTo(ReportingPeriod.fromValue("r_1mn"));
// Create the event
MeasurementCollectionJobRef ref = new MeasurementCollectionJobRef();
ref.setId(mcj.getUuid());
ref.setHref(mcj.getHref());
ref.setName("MeasurementCollectionJob");
MeasurementCollectionJobCreateEventPayload payload = new MeasurementCollectionJobCreateEventPayload();
payload.setMeasurementCollectionJob(ref);
MeasurementCollectionJobCreateEvent event = new MeasurementCollectionJobCreateEvent();
event.setTitle("MeasurementCollectionJob created");
event.setDescription("MeasurementCollectionJob with UUID: " + mcj.getUuid() + " has been created");
event.setEvent(payload);
String apayload = toJsonString(event);
MeasurementCollectionJobCreateEvent eventresponse = toJsonObj (apayload, MeasurementCollectionJobCreateEvent.class);
assertThat(eventresponse.getEvent().getMeasurementCollectionJob()).isNotNull();
}
static String toJsonString(Object object) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper.writeValueAsString(object);
}
static <T> T toJsonObj(String content, Class<T> valueType) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return mapper.readValue( content, valueType);
}
@WithMockUser(username="osadmin", roles = {"USER","ADMIN"})
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment