Статьи

Настроить тайм-аут для разговоров CDI

Разговор CDI — хорошая функция при разработке приложений JSF. Представьте, что у вас есть большие таблицы данных, которые долго загружаются. Обычно вы не хотите помещать загруженные данные в сессионные компоненты из-за высокого потребления памяти. И вы не можете поместить загруженные данные в область видимости bean-компонентов, потому что вы не хотели бы всегда повторно загружать данные, если пользователь покидает и входит в то же представление. Было бы хорошо только сохранить данные, если пользователь зашел на ту же страницу в течение определенного промежутка времени, и перезагрузить их снова, если к бину не было доступа в течение этого промежутка времени.

Это может быть достигнуто с помощью bean-объекта с ограничением времени ожидания. Мы разберемся с MyFaces CODI (расширения CDI) и посмотрим, как установить пользовательское время ожидания для bean-компонентов, аннотированных @ConversationScoped . Время ожидания по умолчанию составляет 30 минут. что слишком долго для нашего примера. Мы настроим его на 1 мин. Первым шагом является расширение ConversationConfig CODI и перезапись метода getConversationTimeoutInMinutes() . Давайте напишем класс AlternativeConversationConfig .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
package controller.cdi;
 
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Alternative;
import javax.enterprise.inject.Specializes;
import org.apache.myfaces.extensions.cdi.core.api.config.ConfigEntry;
import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.config.ConversationConfig;
 
@ApplicationScoped
@Alternative
@Specializes
public class AlternativeConversationConfig extends ConversationConfig {
 
    @ConfigEntry
    public int getConversationTimeoutInMinutes() {
        return 1;
    }
}

Важной вещью является аннотация @Specializes которая позволяет вводить AlternativeConversationConfig вместо ConversationConfig во всех существующих местах. Второй шаг — правильная запись в beans.xml для использования (активации) нашего класса во всех точках внедрения для ConversationConfig .

1
2
3
<alternatives>
    <class>controller.cdi.AlternativeConversationConfig</class>
</alternatives>

Вывод журнала сервера при запуске теперь содержит эти строки

1
2
3
4
5
config implementation:
controller.cdi.AlternativeConversationConfig$Proxy$_$$_WeldClientProxy
config implementation: controller.cdi.AlternativeConversationConfig
   method: getConversationTimeoutInMinutes
   value: 1

Чтобы проверить, все ли в порядке, мы можем написать боб в области видимости для разговора и использовать его в facelets

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
import java.io.Serializable;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.ConversationScoped;
 
@Named
@ConversationScoped
public class CdiBeanConversationScoped implements Serializable {
  
    private int counter;
  
    public int getCounter() {
        return counter;
    }
  
    public void increment(ActionEvent e) {
        counter++;
    }
}
1
2
3
4
<h:outputText id='counter' value='Conversation scoped counter: #{cdiBeanConversationScoped.counter}'/>
    
<p:commandButton value='Increment counter' process='@this' update='counter'
                                         actionListener='#{cdiBeanConversationScoped.increment}'/>

Счетчик истечет через 1 мин. если в течение этого промежутка времени не происходит доступа к компоненту. Просто нажмите кнопку, чтобы увеличить счетчик, подождите более 1 минуты. и увеличить его снова. Вы увидите, что счетчик был сброшен.

Ссылка: Настройте время ожидания для бесед CDI от нашего партнера по JCG Олега Вараксина в блоге « Мысли о разработке программного обеспечения» .