Изменения HashMap не сохраняются между потоками, а только в JUnitJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Изменения HashMap не сохраняются между потоками, а только в JUnit

Сообщение Anonymous »

Я создал приложение на Java Spring 2.7.2 и хочу, чтобы для него проводились последовательные модульные тесты, охватывающие его распространенные сценарии. Но один из моих тестов зависает, потому что разные потоки расходятся во мнениях относительно того, что находится внутри конкретной карты, «fetchQueueMap».

Код: Выделить всё

@Service
class KafkaProfileService {
Map fetchQueueMap = new HashMap();
ReentrantLock fetchLock = new ReentrantLock();
/**

Etc

**/
class MappingFetchThread implements Runnable {
public void run() {
final int DELAY = 5000;
Thread.currentThread().setName("mapping-fetch-thread");
Long targetTime = System.currentTimeMillis() + DELAY;
while(true) {
if(System.currentTimeMillis() < targetTime) {
try {
Thread.sleep(5000);
}
catch(InterruptedException ie) {
Thread.currentThread().interrupt();
}
}
else {
fetchQueuedRoutingValues();
targetTime = System.currentTimeMillis() + DELAY;
}
}
}
}
private void fetchQueuedRoutingValues() {
HashMap toBeFetched = new HashMap();
fetchLock.lock();
try {
for(String profileName : fetchQueueMap.keySet()) {
/*etc, fetch logic is not in question here */
}
}
finally {
fetchLock.unlock();
}
}

private void addToFetchQueue(String profileName, List routingValues) {
fetchLock.lock();
try {
if(fetchQueueMap.get(profileName) == null) {
fetchQueueMap.put(profileName, new ArrayList());
}
fetchQueueMap.get(profileName).addAll(routingValues);
}
finally {
fetchLock.unlock();
}

}
}
Поэтому, когда addToFetchQueue вызывается в одном потоке, я вижу, что он добавляется правильно. Но когда MappingFetcher считывает fetchQueueMap, его нет, и карта пуста. Самое неприятное в этом то, что это происходит только во время моего модульного тестирования с JUnit. Когда я действительно запускаю приложение, проблем не возникает, а используемых мной механизмов блокировки достаточно, чтобы обеспечить согласованность. Что происходит и почему?

Подробнее здесь: https://stackoverflow.com/questions/798 ... y-in-junit
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»