Added writing logic

This commit is contained in:
Mikhail Trofimov 2026-06-22 15:31:50 +03:00
parent 56ac04ede0
commit d2800aa2bf
4 changed files with 48 additions and 9 deletions

View file

@ -11,6 +11,5 @@ import ru.nbch.credit_tracker.enums.EventType;
public class SignalKafkaEvent {
private EventType eventType;
private Long packageId;
// other data for signal
private UserPackagePhoneData userPackagePhoneData;
}

View file

@ -12,4 +12,6 @@ public class UserPackagePhoneData {
private String signalTypes;
private Long phone;
private String subjectId;
private String userId;
private String packageName;
}

View file

@ -132,14 +132,13 @@ public class KafkaMonitoringService {
}
for (UserPackagePhoneData userPackagePhoneData : userPackagePhoneDataList) {
Long packageId = userPackagePhoneData.getPackageId();
String subjectId = userPackagePhoneData.getSubjectId();
String signalTypes = userPackagePhoneData.getSignalTypes();
if (signalTypes.contains(signalType.toString())) {
SignalKafkaEvent event = new SignalKafkaEvent();
event.setEventType(EventType.WRITE);
event.setPackageId(packageId);
event.setUserPackagePhoneData(userPackagePhoneData);
putToQueue(event);
}
}

View file

@ -4,9 +4,17 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings;
import ru.nbch.credit_tracker.entities.app.UserPackage;
import ru.nbch.credit_tracker.enums.EventType;
import ru.nbch.credit_tracker.enums.Status;
import ru.nbch.credit_tracker.mapper.signal.UserPackageMapper;
import ru.nbch.credit_tracker.model.SignalKafkaEvent;
import ru.nbch.credit_tracker.model.UserPackagePhoneData;
import ru.nbch.credit_tracker.utils.error.ExceptionUtils;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.concurrent.BlockingQueue;
@Slf4j
@ -14,18 +22,23 @@ import java.util.concurrent.BlockingQueue;
public class SignalKafkaEventWriterService {
private final BlockingQueue<SignalKafkaEvent> signalEventsQueue;
private final UserPackageMapper userPackageMapper;
private final CreditTrackerSettings config;
public SignalKafkaEventWriterService(@Qualifier("signalKafkaEventQueue") BlockingQueue<SignalKafkaEvent> signalEventsQueue,
UserPackageMapper userPackageMapper,
CreditTrackerSettings config) {
this.signalEventsQueue = signalEventsQueue;
this.userPackageMapper = userPackageMapper;
this.config = config;
}
// TODO вызвать в main
public void startWriting() {
while (true) {
SignalKafkaEvent event = take();
if (event == null) {
continue;
}
if (event.getEventType() == EventType.STOP) {
break;
}
@ -44,15 +57,41 @@ public class SignalKafkaEventWriterService {
* Записывает сигнал в xml для конкретного пакета
*/
private void writeSignal(SignalKafkaEvent event) {
// TODO записать сигнал в существующий xml/создать новый и записать
// TODO добавить пакет в сет
UserPackagePhoneData packagePhoneData = event.getUserPackagePhoneData();
try {
Path folder = Path.of(config.getLoadDir(),
"tmp", packagePhoneData.getUserId(), packagePhoneData.getPackageName());
Files.createDirectories(folder);
Path targetFilePathWithExt = folder.resolve(packagePhoneData.getUserId() + "_" + packagePhoneData.getPackageName() + ".xml");
boolean exists = targetFilePathWithExt.toFile().exists();
if (!exists) {
Files.createFile(targetFilePathWithExt);
// TODO начать запись
}
// TODO записать сигнал
} catch (Exception e) {
log.error("Report was not created for PackageId = {}, PackageName = {}. {}", packagePhoneData.getPackageId(), packagePhoneData.getPackageName(), ExceptionUtils.getStackTrace(e));
}
}
/**
* Упаковывает все результирующие xml в архив
*/
private void rotate() {
// TODO пройтись по сету пакетов и финализировать запись. Очистить сет
List<UserPackage> userPackages = userPackageMapper.findAllPackagesByStatus(Status.ON_MONITORING.name()); // TODO + PROCESSING_REPEATED?
for (UserPackage userPackage : userPackages) {
Path targetFilePath = Path.of(config.getLoadDir(),
"tmp", userPackage.getUserId(), userPackage.getPackageName())
.resolve(userPackage.getUserId() + "_" + userPackage.getPackageName() + ".xml");
if (targetFilePath.toFile().exists()) {
// TODO дописать, переименовать с timestamp, зазиповать и выложить в папку
}
}
// TODO update signals_user_packages
}
private SignalKafkaEvent take() {
@ -61,7 +100,7 @@ public class SignalKafkaEventWriterService {
} catch (InterruptedException e) {
log.error("Error while taking signal event", e);
Thread.currentThread().interrupt();
throw new RuntimeException(e);
return null;
}
}
}