简体   繁体   English

如何避免JUnit App Engine LocalSearchService中的LockObtainFailedException?

[英]How to avoid LockObtainFailedException in JUnit App Engine LocalSearchService?

I'm using App engine Standard env and my services use the Search API . 我正在使用App Engine标准环境,而我的服务使用Search API

So basically in my service I do something like: 因此,基本上在我的服务中,我会执行以下操作:

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

But when I run my JUnit tests I often get the following exception: 但是,当我运行JUnit测试时,经常会遇到以下异常:

Apr 17, 2018 11:25:33 AM com.google.appengine.api.search.dev.LocalSearchService indexDocumentForApp SEVERE: Unable to access index com.google.appengine.repackaged.org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@/Users/freddyboucher/Private/Programming/LearnKeeper/learnkeeper-server/WEB-INF/appengine-generated/indexes/dGVzdA/Qk9PS1M..P/write.lock at com.google.appengine.repackaged.org.apache.lucene.store.Lock.obtain(Lock.java:85) at com.google.appengine.repackaged.org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1562) at com.google.appengine.repackaged.org.apache.lucene.index.IndexWriter.(IndexWriter.java:1090) at com.google.appengine.api.search.dev.LocalSearchService.getIndexWriter(LocalSearchService.java:800) at com.google.appengine.api.search.dev.LocalSearchService.indexDocumentForApp(LocalSearchService.java:290) at com.google.appengine.api.search.dev.LocalSearchService.indexDocument(LocalSearchService.java:268) at sun.reflect.NativeMet 2018年4月17日上午11:25:33 com.google.appengine.api.search.dev.LocalSearchService indexDocumentForApp严重:无法访问索引com.google.appengine.repackaged.org.apache.lucene.store.LockObtainFailedException:锁定获取超时:NativeFSLock @ / Users / freddyboucher / Private / Programming / LearnKeeper / learnkeeper-server / WEB-INF / appengine-generation / indexes / dGVzdA / Qk9PS1M..P / write.lock在com.google.appengine.repackaged.org com.google.appengine.com上的.apache.lucene.store.Lock.obtain(Lock.java:85)(位于com.google.appengine.repackaged.org.apache.lucene.index.IndexWriter.init(IndexWriter.java:1562)) com.google.appengine.api.search.dev.LocalSearchService.getIndexWriter(LocalSearchService.java:800)上的.repackaged.org.apache.lucene.index.IndexWriter。(IndexWriter.java:1090)。 api.search.dev.LocalSearchService.indexDocumentForApp(LocalSearchService.java:290)位于com.google.appengine.api.search.dev.LocalSearchService.indexDocument(LocalSearchService.java:268)位于sun.reflect.NativeMet hodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.invokeApiMethodJava(ApiProxyLocalImpl.java:657) at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.callInternal(ApiProxyLocalImpl.java:612) at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:569) at com.google.appengine.tools.development.ApiProxyLocalImpl$AsyncApiCall.call(ApiProxyLocalImpl.java:541) at java.util.concurrent.Executors$PrivilegedCallable$1.run(Executors.java:533) at java.security.AccessController.doPrivileged(Native Method) at java.util.concurrent.Executors$PrivilegedCallable.call(Executors.java:530) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util. 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)处的hodAccessorImpl.invoke0(本机方法)在java.lang.reflect.Method.invoke(方法。 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:541)上com.google.appengine.tools.development.ApiProxyLocalImpl $ AsyncApiCall.call(ApiProxyLocalImpl.java:541)上com.google.appengine.tools.development.ApiProxyLocalImpl $ AsyncApiCall.call java的.concurrent.Executors $ PrivilegedCallable $ 1.run(Executors.java:533)(java.util.concurrent.Executors $ PrivilegedCallable.call(Executors.java:530)的java.security.AccessController.doPrivileged(本机方法) util.concurrent.FutureTask.run(FutureTask.java:266)在java.util中。 concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)上的并发.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)在java.lang.Thread.run(Thread.java:748)

It's not documented anywhere but adding: 它没有记录在任何地方,而是添加了:

LocalSearchServiceTestConfig.getLocalSearchService().stop()

in my @After method fixes the issue. 在我的@After方法中解决了这个问题。

I also found usefull to add: 我还发现可以添加以下内容:

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

So the final solution is: 因此,最终的解决方案是:

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

Worked for me: 为我工作:

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();
}

This error can also occur if you simply forget to add a LocalSearchServiceTestConfig to your test config. 如果您只是忘记将LocalSearchServiceTestConfig添加到测试配置中,也会发生此错误。 For example: 例如:

    private final LocalServiceTestHelper helper =
            new LocalServiceTestHelper(
                    new LocalDatastoreServiceTestConfig(),
                    new LocalSearchServiceTestConfig());

    @Before
    public void setUp() {
        helper.setUp();
    }

    @After
    public void tearDown() {
        helper.tearDown();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM