Wicket: Где обработать ошибку соединения JDBC - PullRequest
0 голосов
/ 15 июля 2010

У меня есть приложение Wicket на основе Spring.
Есть объединенный компонент источника данных.
Теперь, когда MySQL не работает, я получаю страницу ошибки Wicket по умолчанию со стековой трассировкой.

Я хотел бы справиться с этой ситуацией и разрешить только некоторые страницы для полного отображения (статические) и показать пользовательскую страницу ошибок для других.

Как мне эффективно реализовать это?

Я знаю, что могу ловить исключения в коде страницы, но это ненадежный экземпляр MySQL, и он довольно часто отключается :) Или подумайте о другом ненадежном ресурсе.Ввод if для каждой страницы кажется неэффективным.Я хотел бы получить список страниц, которым нужен ресурс, и перенаправить запросы на него на пользовательскую страницу ошибки.

Я думал о наличии некоторого глобального boolean isResourceReady и некоторого потока, который будет запускаться после этой ошибки.и периодически проверять доступность, и в конечном итоге разрешать динамические страницы, когда ресурс возвращается.

Спасибо за советы.

Root cause:

java.net.ConnectException: Connection refused
at ... java.net stuff
... JDBC stuff
... Spring stuff
... DBCP and Pool stuff
... Hibernate stuff
at org.hibernate.ejb.QueryImpl.getSingleResult(QueryImpl.java:88)
at cz.oz.wicket.stack.dao.TestEntityDaoImpl$1.doInJpa(TestEntityDaoImpl.java:36)
at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:184)
at cz.oz.wicket.stack.dao.TestEntityDaoImpl.createSyntheticTestEntity(TestEntityDaoImpl.java:32)
at cz.oz.wicket.stack.pages.home.HomePage.<init>(HomePage.java:31)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.apache.wicket.session.DefaultPageFactory.createPage(DefaultPageFactory.java:188)
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:65)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.newPage(BookmarkablePageRequestTarget.java:298)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.getPage(BookmarkablePageRequestTarget.java:320)
at org.apache.wicket.request.target.component.BookmarkablePageRequestTarget.processEvents(BookmarkablePageRequestTarget.java:234)
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92)
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250)
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329)
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428)
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545)
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479)
at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:926)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:549)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mo

Ответы [ 2 ]

2 голосов
/ 15 июля 2010

Лучше всего использовать обычную обработку страницы ошибок в Wicket .

Но если вы хотите предвидеть исключение, а не реагировать на него, это выглядит как естественное применение ServletFilter. В частности, если вы уже используете пружинный OpenSessionInViewFilter, вы можете создать его подкласс и переопределить

protected Session getSession(SessionFactory sessionFactory) 

чтобы определить, что у вас нет подключения к базе данных, и перейти на специальную страницу.

Если вы делаете это с помощью фильтра, решение о том, следует ли переходить на страницу с ошибкой или нет, все равно должно приниматься каким-то глобальным, но это может быть просто список статических страниц, которые поддерживать в своем объекте WebApplication, который уже является одноэлементным.

0 голосов
/ 16 мая 2012

Сделать как можно ниже в конструкторе. Делайте больше в onInitialize (), лучше контролируйте ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...