Хобрук: Ваш путь к мастерству в программировании

Как избежать LockObtainFailedException в LocalSearchService JUnit App Engine?

Я использую стандартную среду App Engine, а мои службы используют API поиска.

Итак, в основном в моей службе я делаю что-то вроде:

IndexSpec indexSpec = IndexSpec.newBuilder().setName(indexName).build();
Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);
index.putAsync(document);

Но когда я запускаю свои тесты JUnit, я часто получаю следующее исключение:

17 апреля 2018 г., 11:25:33 com.google.appengine.api.search.dev.LocalSearchService indexDocumentForApp СЕРЬЕЗНО: невозможно получить доступ к индексу истекло время ожидания: NativeFSLock@/Users/freddyboucher/Private/Programming/LearnKeeper/learnkeeper-server/WEB-INF/appengine-generated/indexes/dGVzdA/Qk9PS1M..P/write.lock на com.google.appengine.repackaged.org .apache.lucene.store.Lock.obtain(Lock.java:85) на com.google.appengine.repackaged.org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1562) на com.google.appengine .repackaged.org.apache.lucene.index.IndexWriter.(IndexWriter.java:1090) в com.google.appengine.api.search.dev.LocalSearchService.getIndexWriter(LocalSearchService.java:800) в com.google.appengine. api.search.dev.LocalSearchService.indexDocumentForApp(LocalSearchService.java:290) в com.google.appengine.api.search.dev.LocalSearchService.indexDocument(LocalSearchSe rvice.java:268) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java .lang.reflect.Method.invoke(Method.java:498) на com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.invokeApiMethodJava(ApiProxyLocalImpl.java:657) на com.google.appengine.tools.development.ApiProxyLocalImpl $AsyncApiCall.callInternal(ApiProxyLocalImpl.java:612) в com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:569) в com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call (ApiProxyLocalImpl.java:541) в java.util.concurrent.Executors$PrivilegedCallable$1.run(Executors.java:533) в java.security.AccessController.doPrivileged(собственный метод) в java.util.concurrent.Executors$PrivilegedC allable.call(Executors.java:530) в java.util.concurrent.FutureTask.run(FutureTask.java:266) в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) в java.util.concurrent .ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) на java.lang.Thread.run(Thread.java:748)


Ответы:


1

Это нигде не задокументировано, но добавлено:

LocalSearchServiceTestConfig.getLocalSearchService().stop()

в моем методе @After устраняет проблему.

Я также нашел полезным добавить:

FileUtils.deleteDirectory(new File("WEB-INF"));

Итак, окончательное решение:

  @After
  public void tearDown() throws Exception {
    LocalSearchServiceTestConfig.getLocalSearchService().stop();
    FileUtils.deleteDirectory(new File("WEB-INF"));
    ...
  }
17.04.2018

2

Работал для меня:

private LocalServiceTestHelper memoryDatastore;

@Before
public void setup() {
   LocalDatastoreServiceTestConfig dsConfig = new LocalDatastoreServiceTestConfig();
   memoryDatastore = new LocalServiceTestHelper(dsConfig);
   memoryDatastore.setUp();
}

@After
public void tearDown() {
   memoryDatastore.getLocalService("search").stop();
   memoryDatastore.tearDown();
}

12.08.2019
  • Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос для будущих читателей, и эти люди могут не знать причин вашего предложения кода. 13.08.2019

  • 3

    Эта ошибка также может возникнуть, если вы просто забудете добавить LocalSearchServiceTestConfig в тестовую конфигурацию. Например:

        private final LocalServiceTestHelper helper =
                new LocalServiceTestHelper(
                        new LocalDatastoreServiceTestConfig(),
                        new LocalSearchServiceTestConfig());
    
        @Before
        public void setUp() {
            helper.setUp();
        }
    
        @After
        public void tearDown() {
            helper.tearDown();
        }
    
    27.08.2019
    Новые материалы

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...