Это может быть достигнуто с помощью 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@Specializespublic 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$_$$_WeldClientProxyconfig 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@ConversationScopedpublic 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 Олега Вараксина в блоге « Мысли о разработке программного обеспечения» .