Added code for test load time
This commit is contained in:
parent
249b351428
commit
5b6f3ce63c
9 changed files with 292 additions and 4 deletions
19
pom.xml
19
pom.xml
|
|
@ -300,6 +300,25 @@
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</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>
|
<execution>
|
||||||
<id>build-migration</id>
|
<id>build-migration</id>
|
||||||
<phase>package</phase>
|
<phase>package</phase>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ package ru.nbch.credit_tracker.mapper.signal;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
|
import ru.nbch.credit_tracker.entities.app.PackagesRecordsMap;
|
||||||
|
import ru.nbch.credit_tracker.model.UserPackagePhoneData;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -18,7 +19,13 @@ public interface PackagesRecordsMapper {
|
||||||
|
|
||||||
List<Long> uniquePackageIdByPhones(@Param("json") String json);
|
List<Long> uniquePackageIdByPhones(@Param("json") String json);
|
||||||
|
|
||||||
|
List<UserPackagePhoneData> selectUserPackagePhoneData(@Param("json") String json);
|
||||||
|
|
||||||
Long deleteByPackageId(@Param("packageId") Long id);
|
Long deleteByPackageId(@Param("packageId") Long id);
|
||||||
|
|
||||||
PackagesRecordsMap findById(Long id);
|
PackagesRecordsMap findById(Long id);
|
||||||
|
|
||||||
|
List<PackagesRecordsMap> findByPhone(@Param("phone") Long phone);
|
||||||
|
|
||||||
|
List<PackagesRecordsMap> findByPhones(@Param("phones") List<Long> phones);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -37,4 +37,8 @@ public interface PhonesMapMapper {
|
||||||
void registerJson(@Param("json") String json);
|
void registerJson(@Param("json") String json);
|
||||||
|
|
||||||
void deleteUnusedPhones();
|
void deleteUnusedPhones();
|
||||||
|
|
||||||
|
List<PhonesMap> findByFid(@Param("fid") Integer fid);
|
||||||
|
|
||||||
|
List<PhonesMap> findByFids(@Param("fids") List<Integer> fids);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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.FlagData;
|
||||||
import ru.nbch.credit_tracker.model.IdData;
|
import ru.nbch.credit_tracker.model.IdData;
|
||||||
import ru.nbch.credit_tracker.model.SubjectProfile;
|
import ru.nbch.credit_tracker.model.SubjectProfile;
|
||||||
|
import ru.nbch.credit_tracker.model.UserPackagePhoneData;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
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) {
|
public void updateIdCache(List<IdData> idData) {
|
||||||
try {
|
try {
|
||||||
String json = entityToJsonMapper.writeValueAsString(idData.stream()
|
String json = entityToJsonMapper.writeValueAsString(idData.stream()
|
||||||
|
|
@ -121,4 +132,20 @@ public class PackageRecordsService {
|
||||||
public PackagesRecordsMap findPackageRecordsById(Long id) {
|
public PackagesRecordsMap findPackageRecordsById(Long id) {
|
||||||
return packagesRecordsMapper.findById(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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,29 @@
|
||||||
WHERE id = #{id}
|
WHERE id = #{id}
|
||||||
</select>
|
</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">
|
<select id="uniquePackageIdByPhones" resultType="java.lang.Long">
|
||||||
WITH src AS (SELECT phone
|
WITH src AS (SELECT phone
|
||||||
FROM json_to_recordset(#{json}::json) AS t(
|
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'
|
where spr.phone_l in (select * from src) and sup.status = 'ON_MONITORING'
|
||||||
</select>
|
</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">
|
<select id="registerJson" parameterType="string" resultType="long">
|
||||||
WITH src AS (SELECT row_number() OVER () AS rn,
|
WITH src AS (SELECT row_number() OVER () AS rn,
|
||||||
subject_id,
|
subject_id,
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,45 @@
|
||||||
WHERE phone = #{phone}
|
WHERE phone = #{phone}
|
||||||
</select>
|
</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="searchedAtLessThan" resultMap="PhoneMap">
|
||||||
select id,
|
select id,
|
||||||
fid,
|
fid,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue