這可以通過帶超時的對話作用域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