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