Этот поток кода безопасен с пружиной PostConstruct - PullRequest
0 голосов
/ 29 марта 2019

Я провел несколько тестов для этих двух классов.Может ли кто-нибудь помочь определить, являются ли эти два класса потокобезопасными?Может ли кто-нибудь помочь определить, не использует ли concurrentHashMap, но использовать HashMap, это вызовет любую параллельную проблему.Как я могу сделать его более потокобезопасным?Каков наилучший подход к тестированию с параллельным тестированием?

Я протестировал его только с Hashmap, и он отлично работает.Тем не менее, моя шкала теста составляет около 20 req / s в течение 2 минут.Может кто-нибудь посоветовать, следует ли мне увеличить частоту запросов и повторить попытку, или можно указать куда-то, что должно потребовать исправления.

@ Публичный класс компонентов TestLonggersImpl реализует TestSLongger {

@Autowired
YamlReader yamlReader;

@Autowired
TestSCatalog gSCatalog;

@Autowired
ApplicationContext applicationContext;

private static HashMap<String, TestLonggerImpl> gImplHashMap = new HashMap<>();

private static final Longger LONGER = LonggerFactory.getLongger(AbstractSLongger.class);

@PostConstruct
public void init() {
    final String[] sts = yamlReader.getTestStreamNames();
    for (String st : sts) {
        System.out.println(st);
        LONGER.info(st);
    }
    HashMap<String, BSCatalog> statsCatalogHashMap = gSCatalog.getCatalogHashMap();
    for (Map.Entry<String, BSCatalog> entry : statsCatalogHashMap.entrySet()) {

        BSCatalog bCatalog = statsCatalogHashMap.get(entry.getKey());
        //Issue on creating the basicCategory
        SProperties sProperties = yamlReader.getTestMap().get(entry.getKey());
        Category category = new BasicCategory(sProperties.getSDefinitions(),
            bCatalog.getVersion(),
            bCatalog.getDescription(), new HashSet<>());

        final int version = statsCatalogHashMap.get(entry.getKey()).getVersion();
        getTestImplHashMap().put(entry.getKey(),
            applicationContext.getBean(TestLonggerImpl.class, category,
                entry.getKey(),
                version));
    }
}

@Override
public void logMessage(String st, String message) {
    if (getTestImplHashMap() != null && getTestImplHashMap().get(st) != null) {
        getTestImplHashMap().get(st).log(message);
    }
}

@VisibleForTesting
static HashMap<String, TestLonggerImpl> getTestImplHashMap() {
    return gImplHashMap;
}

}

*** 2-й класс

@ Компонент публичного класса GStatsCatalog {

@Autowired
YamlReader yamlReader;

private static HashMap<String, BStatsCatalog> stCatalogHashMap = new HashMap<>();

@PostConstruct
public void init() {
    String[] streams = yamlReader.getGSNames();

    for (String stream : streams) {
        BStatsCatalog bCatalog = new BStatsCatalog();
        SProperties streamProperties = yamlReader.getGMap().get(stream);
        bCatalog.setSName(stream);
        int version = VERSION;
        try {
            version = Integer.parseInt(streamProperties.getVersion());
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        bCatalog.setVersion(version);
        bCatalog.setDescription(streamProperties.getDescription());
        stCatalogHashMap.put(stream, bCatalog);
    }
}

public static HashMap<String, BStatsCatalog> getCatalogHashMap() {
    return stCatalogHashMap;
}

public void setYamlReader(YamlReader yamlReader) {
    this.yamlReader = yamlReader;
}

}

1 Ответ

1 голос
/ 29 марта 2019

Я думаю, что методы в @postconstruct являются потокобезопасными. Он запускается только один раз после создания бобом во всем его жизненном цикле.

...