Skip to content

Instantly share code, notes, and snippets.

@SinTeZWh1te
Last active February 28, 2024 08:24
Show Gist options
  • Save SinTeZWh1te/1d2be3dbee42201c5dbc57b79cf60678 to your computer and use it in GitHub Desktop.
Save SinTeZWh1te/1d2be3dbee42201c5dbc57b79cf60678 to your computer and use it in GitHub Desktop.
Делал для того, чтобы из в разных биллингах проверять занятость IP одинаковых ресурсов. Но в конечном итоге сделал через CustomAPI - лучше работает :)
package ru.test.bgbilling.kernel.services;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import jakarta.jws.WebService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import ru.bitel.bgbilling.common.BGException;
import ru.bitel.common.Preferences;
import ru.bitel.common.Utils;
import ru.bitel.oss.systems.inventory.resource.common.bean.IpResource;
import ru.bitel.oss.systems.inventory.resource.common.bean.IpResourceRange;
import ru.bitel.oss.systems.inventory.resource.common.service.ResourceService;
import ru.bitel.oss.systems.inventory.resource.server.service.ResourceServiceImpl;
import java.util.*;
import java.util.concurrent.TimeUnit;
@WebService(endpointInterface = "ru.bitel.oss.systems.inventory.resource.common.service.ResourceService")
public class CustomResourceServiceImpl
extends ResourceServiceImpl
implements ResourceService {
private static final Logger logger = LogManager.getLogger();
@PostConstruct
protected void init() {
super.init();
}
@Override
public List<IpResourceRange> freeIpResourceRangeList(Collection<Integer> ipResourceCategoryIds, Collection<Integer> ipResourceIds, Date dateFrom, Date dateTo, int range, int max, String filter) throws BGException {
List<IpResourceRange> ipResourceRangeList = super.freeIpResourceRangeList(ipResourceCategoryIds, ipResourceIds, dateFrom, dateTo, range, max, filter);
for (Integer ipResourceId : ipResourceIds) {
IpResource ipResource = super.ipResourceGet(ipResourceId);
Preferences config = new Preferences(ipResource.getConfig(), "\n");
if (config.getInt("resourceId", 0) > 0) {
if (!IpResourceCache.getInstance().getResourceTimeoutMap().containsKey(config.getInt("resourceId", 0))) {
IpResourceCache.getInstance().getResourceTimeoutMap().put(config.getInt("resourceId", 0), getCustomResponse(Collections.singleton(41), Collections.singleton(config.getInt("resourceId", 0))), TimeUnit.SECONDS.toMillis(60L));
}
List<IpResourceRange> freeIpResourceRange = IpResourceCache.getInstance().getResourceTimeoutMap().get(config.getInt("resourceId", 0));
ipResourceRangeList.removeIf(v -> freeIpResourceRange.stream().noneMatch(ip -> Arrays.equals(v.getAddressFrom(), ip.getAddressFrom())));
}
}
return ipResourceRangeList;
}
private List<IpResourceRange> getCustomResponse(Collection<Integer> ipResourceCategoryIds, Collection<Integer> ipResourceIds) {
logger.info("Шлём запрос на получение " + Utils.toString(ipResourceIds));
List<IpResourceRange> result = new ArrayList<>();
/*
Вырезано
*/
return result;
}
}
package ru.test.bgbilling.kernel.services;
import ru.bitel.common.util.TimeoutMap;
import ru.bitel.common.worker.WorkerThreadFactory;
import ru.bitel.oss.systems.inventory.resource.common.bean.IpResourceRange;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @author sintezwh1te
*/
public class IpResourceCache {
private static final ScheduledExecutorService SCHEDULED_EXECUTOR_SERVICE = Executors.newScheduledThreadPool(1, new WorkerThreadFactory("ext-ip-resource-service", null, null));
private volatile TimeoutMap<Integer, List<IpResourceRange>> resourceTimeoutMap = new TimeoutMap<>(SCHEDULED_EXECUTOR_SERVICE, 60L, 30L, TimeUnit.SECONDS);
private static final IpResourceCache instance = new IpResourceCache();
public static final IpResourceCache getInstance() {
return instance;
}
private IpResourceCache() {
}
public TimeoutMap<Integer, List<IpResourceRange>> getResourceTimeoutMap() {
return resourceTimeoutMap;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment