Added code for test load time

This commit is contained in:
Mikhail Trofimov 2026-06-09 17:42:01 +03:00
parent 249b351428
commit 5b6f3ce63c
9 changed files with 292 additions and 4 deletions

19
pom.xml
View file

@ -300,6 +300,25 @@
</configuration>
</execution>
<execution>
<id>build-monitoring-test</id>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<mainClass>ru.nbch.credit_tracker.service.mode.test_monitoring.CTMonitoringTestApplication</mainClass>
<classifier>monitoring-test</classifier>
<attach>true</attach>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</execution>
<execution>
<id>build-migration</id>
<phase>package</phase>

View file

@ -3,6 +3,7 @@ package ru.nbch.credit_tracker.mapper.signal;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
import ru.nbch.credit_tracker.model.UserPackagePhoneData;
import java.util.List;
@ -18,7 +19,13 @@ public interface PackagesRecordsMapper {
List<Long> uniquePackageIdByPhones(@Param("json") String json);
List<UserPackagePhoneData> selectUserPackagePhoneData(@Param("json") String json);
Long deleteByPackageId(@Param("packageId") Long id);
PackagesRecordsMap findById(Long id);
List<PackagesRecordsMap> findByPhone(@Param("phone") Long phone);
List<PackagesRecordsMap> findByPhones(@Param("phones") List<Long> phones);
}

View file

@ -37,4 +37,8 @@ public interface PhonesMapMapper {
void registerJson(@Param("json") String json);
void deleteUnusedPhones();
List<PhonesMap> findByFid(@Param("fid") Integer fid);
List<PhonesMap> findByFids(@Param("fids") List<Integer> fids);
}

View file

@ -0,0 +1,15 @@
package ru.nbch.credit_tracker.model;
import lombok.*;
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserPackagePhoneData {
private Long packageId;
private String signalTypes;
private Long phone;
private String subjectId;
}

View file

@ -0,0 +1,33 @@
package ru.nbch.credit_tracker.service.mode.test_monitoring;
import com.fasterxml.jackson.core.JsonProcessingException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
@SpringBootApplication
@ComponentScan(
value = {"ru.nbch.credit_tracker"},
excludeFilters = {
@ComponentScan.Filter(
type = FilterType.REGEX,
pattern = {
"ru\\.nbch\\.credit_tracker\\.service\\.mode\\.common..*",
"ru\\.nbch\\.credit_tracker\\.service\\.mode\\.migration..*",
"ru\\.nbch\\.credit_tracker\\.service\\.mode\\.monitoring..*"
}
)
}
)
public class CTMonitoringTestApplication {
public static void main(String[] args) throws JsonProcessingException {
SpringApplication application = new SpringApplication(CTMonitoringTestApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
ConfigurableApplicationContext ctx = application.run(args);
MonitoringService monitoringService = ctx.getBean(MonitoringService.class);
monitoringService.run();
}
}

View file

@ -0,0 +1,110 @@
package ru.nbch.credit_tracker.service.mode.test_monitoring;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
import ru.nbch.credit_tracker.entities.app.PhonesMap;
import ru.nbch.credit_tracker.entities.app.UserPackage;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.model.UserPackagePhoneData;
import ru.nbch.credit_tracker.service.signal.PackageRecordsService;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* Сервис периодического опроса официального сервиса сигналов на наличие новых отчетов по пакетам находящимся в статусе ON_MONITORING
*/
@Slf4j
@Service
public class MonitoringService {
private final PackageRecordsService packageRecordsService;
private final UserPackageMapper userPackageMapper;
public MonitoringService(PackageRecordsService packageRecordsService,
UserPackageMapper userPackageMapper) {
this.packageRecordsService = packageRecordsService;
this.userPackageMapper = userPackageMapper;
}
public void run() {
List<Integer> fids = new ArrayList<>();
for (int i = 1000; i < 2000; i++) {
fids.add(i);
}
fids.add(114885613);
fids.add(16445000);
fids.add(114829813);
fids.add(109837221);
fids.add(108550768);
fids.add(108546145);
fids.add(111098278);
long start = System.currentTimeMillis();
log.info("Start selecting by one");
monitorByOne(fids);
log.info("Finish selecting by one. Time: {} ms", System.currentTimeMillis() - start);
start = System.currentTimeMillis();
log.info("Start selecting by batch");
monitorbyBatch(fids);
log.info("Finish selecting by bacth. Time: {} ms", System.currentTimeMillis() - start);
}
private void monitorByOne(List<Integer> fids) {
for (Integer fid : fids) {
List<PhonesMap> phonesMaps = packageRecordsService.findCachedByFid(fid);
for (PhonesMap phonesMap : phonesMaps) {
if (phonesMap != null) {
Long clientId = phonesMap.getPhone();
Integer flagDebt5000 = phonesMap.getFlagDebt5000();
Integer flag90days = phonesMap.getFlag90days();
List<PackagesRecordsMap> packageRecords = packageRecordsService.findByPhone(clientId);
for (PackagesRecordsMap packageRecord : packageRecords) {
Long packageId = packageRecord.getPackageId();
String subjectId = packageRecord.getSubjectId();
UserPackage userPackage = userPackageMapper.findPackage(packageId);
String status = userPackage.getStatus();
String signalTypes = userPackage.getSignalTypes();
// проверить статус ON_MPNITORING + разрешенные signalTypes
}
}
}
}
}
private void monitorbyBatch(List<Integer> fids) {
List<PhonesMap> phonesMaps = packageRecordsService.findCachedByFids(fids);
// key: phone; value: флаги просрочек
Map<Long, PhonesMap> phonesDataMap = phonesMaps.stream()
.collect(
Collectors.toMap(PhonesMap::getPhone, Function.identity())
);
// subjectId, packageId, signalTypes, phone только для статуса ON_MONITORING
List<UserPackagePhoneData> userPackagePhoneDataList = packageRecordsService
.selectUserPackagePhoneData(phonesDataMap.keySet());
// остались только нужные номера, те что не вошли в userPackagePhoneDataList игнорируются
for (UserPackagePhoneData userPackagePhoneData : userPackagePhoneDataList) {
Long clientId = userPackagePhoneData.getPhone();
String subjectId = userPackagePhoneData.getSubjectId();
String signalTypes = userPackagePhoneData.getSignalTypes();
PhonesMap phonesMap = phonesDataMap.get(clientId);
Integer flagDebt5000 = phonesMap.getFlagDebt5000();
Integer flag90days = phonesMap.getFlag90days();
// проверить разрешенные signalTypes
}
}
}

View file

@ -11,11 +11,9 @@ import ru.nbch.credit_tracker.mapper.signal.PhonesMapMapper;
import ru.nbch.credit_tracker.model.FlagData;
import ru.nbch.credit_tracker.model.IdData;
import ru.nbch.credit_tracker.model.SubjectProfile;
import ru.nbch.credit_tracker.model.UserPackagePhoneData;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -84,6 +82,19 @@ public class PackageRecordsService {
}
}
public List<UserPackagePhoneData> selectUserPackagePhoneData(Set<Long> phones) {
try {
String json = entityToJsonMapper.writeValueAsString(phones.stream()
.filter(Objects::nonNull)
.map(phone -> new HashMap<String, Object>() {{
put("phone", phone);
}}).toList());
return packagesRecordsMapper.selectUserPackagePhoneData(json);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
public void updateIdCache(List<IdData> idData) {
try {
String json = entityToJsonMapper.writeValueAsString(idData.stream()
@ -121,4 +132,20 @@ public class PackageRecordsService {
public PackagesRecordsMap findPackageRecordsById(Long id) {
return packagesRecordsMapper.findById(id);
}
public List<PhonesMap> findCachedByFid(Integer fid) {
return phonesMapMapper.findByFid(fid);
}
public List<PhonesMap> findCachedByFids(List<Integer> fids) {
return phonesMapMapper.findByFids(fids);
}
public List<PackagesRecordsMap> findByPhone(Long phone) {
return packagesRecordsMapper.findByPhone(phone);
}
public List<PackagesRecordsMap> findByPhones(List<Long> phones) {
return phones.isEmpty() ? Collections.emptyList() : packagesRecordsMapper.findByPhones(phones);
}
}

View file

@ -23,6 +23,29 @@
WHERE id = #{id}
</select>
<select id="findByPhone" parameterType="long" resultMap="PhoneFidMapResultMap">
SELECT id,
package_id,
subject_id,
phone_l,
error_text
FROM signals_phone_fid_map
WHERE phone_l = #{phone}
</select>
<select id="findByPhones" resultMap="PhoneFidMapResultMap">
SELECT id,
package_id,
subject_id,
phone_l,
error_text
FROM signals_phone_fid_map
WHERE phone_l IN
<foreach item='phone' collection='phones' open='(' separator=',' close=')'>
#{phone}
</foreach>
</select>
<select id="uniquePackageIdByPhones" resultType="java.lang.Long">
WITH src AS (SELECT phone
FROM json_to_recordset(#{json}::json) AS t(
@ -34,6 +57,17 @@
where spr.phone_l in (select * from src) and sup.status = 'ON_MONITORING'
</select>
<select id="selectUserPackagePhoneData" resultType="ru.nbch.credit_tracker.model.UserPackagePhoneData">
WITH src AS (SELECT phone
FROM json_to_recordset(#{json}::json) AS t(
phone bigint
))
select sup.id AS packageId, sup.signal_types AS signalTypes, spr.phone_l AS phone, spr.subject_id AS subjectId
FROM signals_phone_fid_map spr
join signals_user_packages sup on sup.id = spr.package_id
where spr.phone_l in (select * from src) and sup.status = 'ON_MONITORING'
</select>
<select id="registerJson" parameterType="string" resultType="long">
WITH src AS (SELECT row_number() OVER () AS rn,
subject_id,

View file

@ -39,6 +39,45 @@
WHERE phone = #{phone}
</select>
<select id="findByFid" resultMap="PhoneMap">
select id,
fid,
phone,
name_1,
first,
middle,
birth_dt,
ser_num,
id_type,
flag_debt5000,
flag_90_12,
searched_at,
calculated_at
FROM signals_phones_map
WHERE fid = #{fid}
</select>
<select id="findByFids" resultMap="PhoneMap">
select id,
fid,
phone,
name_1,
first,
middle,
birth_dt,
ser_num,
id_type,
flag_debt5000,
flag_90_12,
searched_at,
calculated_at
FROM signals_phones_map
WHERE fid in
<foreach item='fid' collection='fids' open='(' separator=',' close=')'>
#{fid}
</foreach>
</select>
<select id="searchedAtLessThan" resultMap="PhoneMap">
select id,
fid,