这可以通过带超时的对话作用域bean来实现。 我们将处理MyFaces CODI (CDI扩展),并了解如何为使用@ConversationScoped
注释的bean设置自定义超时。 默认超时是30分钟。 对于我们的示例来说太长了。 我们将其配置1分钟。 第一步是扩展CODI的ConversationConfig
并覆盖方法getConversationTimeoutInMinutes()
。 让我们编写一个类AlternativeConversationConfig
。
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 {@ConfigEntrypublic int getConversationTimeoutInMinutes() {return 1;}
}
重要的是注释@Specializes
,该注释允许在每个现有位置注入AlternativeConversationConfig
而不是ConversationConfig
。 第二步是在beans.xml
正确输入,以便在ConversationConfig
所有注入点上使用(激活)我们的类。
<alternatives><class>controller.cdi.AlternativeConversationConfig</class>
</alternatives>
服务器在启动过程中的日志输出现在包含这些行
config implementation:
controller.cdi.AlternativeConversationConfig$Proxy$_$$_WeldClientProxy
config implementation: controller.cdi.AlternativeConversationConfigmethod: getConversationTimeoutInMinutesvalue: 1
为了检查一切正常,我们可以编写一个对话范围的bean并在facelets中使用它。
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++;}
}
<h:outputText id='counter' value='Conversation scoped counter: #{cdiBeanConversationScoped.counter}'/><p:commandButton value='Increment counter' process='@this' update='counter'actionListener='#{cdiBeanConversationScoped.increment}'/>
计数器将在1分钟后过期。 如果在此时间间隔内没有访问Bean。 只需按一下按钮即可增加计数器,等待时间超过1分钟。 并再次增加它。 您将看到该计数器已重置。
参考: 在“软件开发思想”博客上,从我们的JCG合作伙伴 Oleg Varaksin 配置CDI对话的超时 。
翻译自: https://www.javacodegeeks.com/2012/09/configure-timeout-for-cdi-conversations.html