Асинхронный вызов БД в веб-проекте с использованием jsf и hibernate - PullRequest
0 голосов
/ 28 декабря 2011

Я хочу создать веб-приложение, используя JSF 2.0 и Hibernate. Я хочу регистрировать исключения в базе данных [Асинхронно] .

Как я могу это сделать?

1 Ответ

3 голосов
/ 28 декабря 2011

Информация, которую вы даете в своем вопросе, на самом деле немного скудна, но я все равно попробую.

Ограничение регистрации исключений теми, которые происходят во время обработки запроса (согласно вашему комментарию), ваш первый шаг должен был бы установить Фильтр сервлета:

@WebFilter(filterName="exceptionHandler", urlPatterns="/*")
public class ExceptionHandler extends HttpFilter {

    @Override
    public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws ServletException, IOException {

        try {
            chain.doFilter(request, response);
        } catch (Exception e) {
            // ... handle exception here
        }
    }
}

Если у вас уже установлены другие фильтры, вам, вероятно, понадобится web.xml для настройки порядка их вызова.

Следующим шагом является асинхронное сохранение в БД. Здесь все зависит от того, какой стек вы используете, кроме JSF и Hibernate. Например, Java EE имеет удобную аннотацию @Asynchronous здесь, в то время как в Spring это @Async. В целом, JSF чаще всего объединяется с Java EE, но люди, утверждающие, что вместо JPA используют Hibernate, как правило, используют Tomcat.

Для Java EE вы должны внедрить EJB в Фильтр, при этом EJB использует JPA (возможно, Hibernate) и упомянутую аннотацию @Asynchronous:

Фильтр:

@WebFilter(filterName="exceptionHandler", urlPatterns="/*")
public class ExceptionHandler extends HttpFilter {

    @EJB
    private ExceptionPersister exceptionPersister;

    @Override
    public void doFilter(HttpServletRequest request, HttpServletResponse response, HttpSession session, FilterChain chain) throws ServletException, IOException {

        try {
            chain.doFilter(request, response);
        } catch (Exception e) {
            exceptionPersister.persist(e);
        }
    }
}

EJB:

@Stateless
public class ExceptionPersister {

    @PersistenceContext
    private EntityManager entityManager;

    @Asynchronous
    public void persist(Exception exception) {
        // use entityManager to persist exception in your
        // specific way.
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...