Имутант не может добавить кеш в контейнер веб-кеша
У меня есть приложение heimdallr, которое развертывается через wildfly. В этом приложении я использую функциональность кэша, предоставленную пространством имен immutant.caching.
При первом развертывании приложения все идет без ошибок. Если я пытаюсь повторно развернуть приложение, я получаю следующую ошибку:
2015-05-27 18:20:54,703 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 82) MSC000001: Failed to start service jboss.infinispan.web.dist: org.jboss.msc.service.StartException in service jboss.infinispan.web.dist: java.lang.IllegalStateException: Cache container has been stopped and cannot be reused. Recreate the cache container.
at org.jboss.as.clustering.msc.AsynchronousService$1.run(AsynchronousService.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_25]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_25]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_25]
at org.jboss.threads.JBossThread.run(JBossThread.java:122)
Caused by: java.lang.IllegalStateException: Cache container has been stopped and cannot be reused. Recreate the cache container.
at org.infinispan.manager.DefaultCacheManager.assertIsNotTerminated(DefaultCacheManager.java:797)
at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManager.java:389)
at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManager.java:412)
at org.jboss.as.clustering.infinispan.DefaultCacheContainer.getCache(DefaultCacheContainer.java:103)
at org.jboss.as.clustering.infinispan.DefaultCacheContainer.getCache(DefaultCacheContainer.java:94)
at org.jboss.as.clustering.infinispan.subsystem.CacheService.start(CacheService.java:78)
at org.jboss.as.clustering.msc.AsynchronousService$1.run(AsynchronousService.java:86)
... 4 more
2015-05-27 18:20:54,710 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-10) MSC000001: Failed to start service jboss.infinispan.web."my-application.war".config: org.jboss.msc.service.StartException in service jboss.infinispan.web."my-application.war".config: JBAS010291: Failed to add DIST_ASYNC my-application.war cache to non-clustered web cache container.
at org.jboss.as.clustering.infinispan.subsystem.AbstractCacheConfigurationService.start(AbstractCacheConfigurationService.java:73)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881) [jboss-msc-1.2.2.Final.jar:1.2.2.Final]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_25]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_25]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_25]
Я инициализирую кеш
(def site-cache (agent
(immutant.caching/cache "site-cache" :ttl [ttl :seconds])
:error-mode :continue
:error-handler (fn [the-agent exception]
(log/error "Exception in Site Agent " exception (string/join "\n" (.getStackTrace *e))))))
С использованием immutant 2.x я понимаю, что immutant.caching / cache должен создать контейнер, если он не существует. Есть ли способ проверить, существует ли контейнер кеша, и если не создать его, прежде чем я попытаюсь добавить к нему кеш?
РЕДАКТИРОВАТЬ: Это было вызвано ошибкой с нашими сценариями развертывания. Был сделан хак, чтобы дважды развернуть один и тот же.war, что привело к неправильному завершению работы приложения и возникновению ошибки.
2 ответа
Это было вызвано ошибкой в наших сценариях развертывания. Был сделан хак, чтобы дважды развернуть один и тот же.war для требования приложения. В результате взлома приложение перестало корректно завершать работу приложения и вызывало проблему с кешем.
Похоже, что вы, возможно, не используете плагин lein-immutant для создания файла войны. Плагин добавляет некоторые метаданные в файл war, чтобы обеспечить, среди прочего, правильный путь к классам. Вполне возможно, что файл войны, созданный другими способами, например, lein-ring
плагин, может успешно развернуться в первый раз и оставить сервер приложений в непредсказуемом состоянии, если его не развернуть.