![](/img/trans.png)
[英]How to flush App Engine SearchServiceFactory async operation in JUnit?
[英]How to avoid LockObtainFailedException in JUnit App Engine LocalSearchService?
我正在使用App Engine標准環境,而我的服務使用Search API 。
因此,基本上在我的服務中,我會執行以下操作:
IndexSpec indexSpec = IndexSpec.newBuilder().setName(indexName).build();
Index index = SearchServiceFactory.getSearchService().getIndex(indexSpec);
index.putAsync(document);
但是,當我運行JUnit測試時,經常會遇到以下異常:
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 在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中。 java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)上的並發.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)在java.lang.Thread.run(Thread.java:748)
它沒有記錄在任何地方,而是添加了:
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"));
...
}
為我工作:
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();
}
如果您只是忘記將LocalSearchServiceTestConfig
添加到測試配置中,也會發生此錯誤。 例如:
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.