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 { public class SignalKafkaEvent {
private EventType eventType; private EventType eventType;
private Long packageId; private UserPackagePhoneData userPackagePhoneData;
// other data for signal
} }

View file

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

View file

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

View file

@ -4,9 +4,17 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import ru.nbch.credit_tracker.config.settings.CreditTrackerSettings; 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.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.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; import java.util.concurrent.BlockingQueue;
@Slf4j @Slf4j
@ -14,18 +22,23 @@ import java.util.concurrent.BlockingQueue;
public class SignalKafkaEventWriterService { public class SignalKafkaEventWriterService {
private final BlockingQueue<SignalKafkaEvent> signalEventsQueue; private final BlockingQueue<SignalKafkaEvent> signalEventsQueue;
private final UserPackageMapper userPackageMapper;
private final CreditTrackerSettings config; private final CreditTrackerSettings config;
public SignalKafkaEventWriterService(@Qualifier("signalKafkaEventQueue") BlockingQueue<SignalKafkaEvent> signalEventsQueue, public SignalKafkaEventWriterService(@Qualifier("signalKafkaEventQueue") BlockingQueue<SignalKafkaEvent> signalEventsQueue,
UserPackageMapper userPackageMapper,
CreditTrackerSettings config) { CreditTrackerSettings config) {
this.signalEventsQueue = signalEventsQueue; this.signalEventsQueue = signalEventsQueue;
this.userPackageMapper = userPackageMapper;
this.config = config; this.config = config;
} }
// TODO вызвать в main
public void startWriting() { public void startWriting() {
while (true) { while (true) {
SignalKafkaEvent event = take(); SignalKafkaEvent event = take();
if (event == null) {
continue;
}
if (event.getEventType() == EventType.STOP) { if (event.getEventType() == EventType.STOP) {
break; break;
} }
@ -44,15 +57,41 @@ public class SignalKafkaEventWriterService {
* Записывает сигнал в xml для конкретного пакета * Записывает сигнал в xml для конкретного пакета
*/ */
private void writeSignal(SignalKafkaEvent event) { private void writeSignal(SignalKafkaEvent event) {
// TODO записать сигнал в существующий xml/создать новый и записать UserPackagePhoneData packagePhoneData = event.getUserPackagePhoneData();
// TODO добавить пакет в сет 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 в архив * Упаковывает все результирующие xml в архив
*/ */
private void rotate() { 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() { private SignalKafkaEvent take() {
@ -61,7 +100,7 @@ public class SignalKafkaEventWriterService {
} catch (InterruptedException e) { } catch (InterruptedException e) {
log.error("Error while taking signal event", e); log.error("Error while taking signal event", e);
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
throw new RuntimeException(e); return null;
} }
} }
} }