Добавлено сохранение tcp пакетов по таймауту

This commit is contained in:
serega6531
2019-05-14 01:44:23 +03:00
parent adba3aa18c
commit 6bbfa49b7a
4 changed files with 48 additions and 36 deletions

View File

@@ -24,7 +24,6 @@ import java.net.Inet4Address;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@Component
@@ -39,7 +38,6 @@ public class PcapWorker {
private final ExecutorService executorService;
private final String localIp;
private final int udpStreamTimeout;
private long packetIdCounter = 0; // оно однопоточное, так что пусть будет без atomic
@@ -53,13 +51,11 @@ public class PcapWorker {
public PcapWorker(ServicesService servicesService,
StreamService streamService,
@Value("${interface-name}") String interfaceName,
@Value("${local-ip}") String localIp,
@Value("${udp-stream-timeout}") int udpStreamTimeout) throws PcapNativeException {
@Value("${local-ip}") String localIp) throws PcapNativeException {
this.servicesService = servicesService;
this.streamService = streamService;
this.localIp = localIp;
this.udpStreamTimeout = udpStreamTimeout;
BasicThreadFactory factory = new BasicThreadFactory.Builder()
.namingPattern("pcap-worker").build();
@@ -205,7 +201,7 @@ public class PcapWorker {
}
}
public int closeUdpStreams() {
public int closeTimeoutStreams(Protocol protocol, long timeoutMillis) {
int streamsClosed = 0;
final Iterator<Map.Entry<UnfinishedStream, List<ru.serega6531.packmate.model.Packet>>> iterator = unfinishedStreams.entrySet().iterator();
@@ -213,9 +209,9 @@ public class PcapWorker {
final Map.Entry<UnfinishedStream, List<ru.serega6531.packmate.model.Packet>> entry = iterator.next();
final UnfinishedStream stream = entry.getKey();
if (stream.getProtocol() == Protocol.UDP) {
if (stream.getProtocol() == protocol) {
final List<ru.serega6531.packmate.model.Packet> packets = entry.getValue();
if (System.currentTimeMillis() - packets.get(packets.size() - 1).getTimestamp() > TimeUnit.SECONDS.toMillis(udpStreamTimeout)) {
if (System.currentTimeMillis() - packets.get(packets.size() - 1).getTimestamp() > timeoutMillis) {
iterator.remove();
streamService.saveNewStream(stream, packets);
streamsClosed++;

View File

@@ -0,0 +1,42 @@
package ru.serega6531.packmate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import ru.serega6531.packmate.model.Protocol;
import java.util.concurrent.TimeUnit;
@Component
@Slf4j
public class TimeoutStreamsSaver {
private final PcapWorker pcapWorker;
private final long udpStreamTimeoutMillis;
private final long tcpStreamTimeoutMillis;
@Autowired
public TimeoutStreamsSaver(PcapWorker pcapWorker,
@Value("${udp-stream-timeout}") int udpStreamTimeout,
@Value("${tcp-stream-timeout}") int tcpStreamTimeout) {
this.pcapWorker = pcapWorker;
this.udpStreamTimeoutMillis = TimeUnit.SECONDS.toMillis(udpStreamTimeout);
this.tcpStreamTimeoutMillis = TimeUnit.SECONDS.toMillis(tcpStreamTimeout);
}
@Scheduled(fixedRateString = "PT${timeout-stream-check-interval}S", initialDelayString = "PT${timeout-stream-check-interval}S")
public void saveStreams() {
int streamsClosed = pcapWorker.closeTimeoutStreams(Protocol.UDP, udpStreamTimeoutMillis);
if(streamsClosed > 0) {
log.info("Закрыто {} udp стримов", streamsClosed);
}
streamsClosed = pcapWorker.closeTimeoutStreams(Protocol.TCP, tcpStreamTimeoutMillis);
if(streamsClosed > 0) {
log.info("Закрыто {} tcp стримов", streamsClosed);
}
}
}

View File

@@ -1,27 +0,0 @@
package ru.serega6531.packmate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class UdpStreamsSaver {
private final PcapWorker pcapWorker;
@Autowired
public UdpStreamsSaver(PcapWorker pcapWorker) {
this.pcapWorker = pcapWorker;
}
@Scheduled(fixedRateString = "PT${udp-stream-check-interval}S", initialDelayString = "PT${udp-stream-check-interval}S")
public void saveStreams() {
final int streamsClosed = pcapWorker.closeUdpStreams();
if(streamsClosed > 0) {
log.info("Закрыто {} udp стримов", streamsClosed);
}
}
}