6

@Named Bean に注入されたすべての会話オブジェクトに対してグローバルに会話タイムアウトを設定することは可能ですか?

私はいくつかの @ConversationScoped Bean を持っています。

import javax.annotation.PostConstruct;
import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

@Named
@ConversationScoped
public class SomeBean1 {

    @Inject
    private Conversation conversation;

    @PostConstruct
    private void init() {
        if (conversation.isTransient()) {
            conversation.begin();
        }
    }
}

@Named
@ConversationScoped
public class SomeBean2 {

    @Inject
    private Conversation conversation;

    @PostConstruct
    private void init() {
        if (conversation.isTransient()) {
            conversation.begin();
        }
    }
}        

これらの会話のデフォルトのタイムアウトは 600000 ミリ秒です。会話のタイムアウトをグローバルに設定する方法があるかどうか、または各 Bean で設定する必要があるかどうかを知りたい

if (!conversation.isTrainsient()) {
    conversation.setTimeout(MY_CUSTOM_TIMEOUT);
}

(問題は、多数の CDI Bean があり、それぞれに手動でタイムアウトを設定することが最善の解決策ではないことです)

4

4 に答える 4

2

Seam/Weld を使用すると、次のようなことができるはずです。

@Inject
private HttpConversationContext conversationContext;

public void observePreload(@Observes PreloadCompleteEvent event) {
    //Set global conversation timout to 60000 ms
    conversationContext.setDefaultTimeout(60000);
}

それ以外の場合は、会話ごとに設定する必要があると思います。

編集:カスタムイベントを使用したことに注意してください。同じことが次の方法で実現できます。

public void observePreload(@Observes @Started WebApplication webapp) {
于 2013-10-01T15:05:31.987 に答える
2

そこで、私が使用したソリューションを次に示します (Oracle WebLogic 12c、WELD 1.1.Final):

import org.jboss.weld.context.http.HttpConversationContext;

import javax.inject.Inject;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class SessionListener implements HttpSessionListener {

    @Inject
    private HttpConversationContext conversationContext;

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        if (conversationContext != null) {
            final long DEFAULT_TIMEOUT = 2 * 60 * 60 * 1000;
            if (conversationContext.getDefaultTimeout() < DEFAULT_TIMEOUT){
                conversationContext.setDefaultTimeout(DEFAULT_TIMEOUT);
            }
        }
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {}
}

コンテキストがリスナーに挿入され、ユーザーがセッションを開始するとタイムアウトが設定されます。

于 2013-10-01T17:59:56.260 に答える
0

会話 Bean のタイムアウトを現在の http 要求のセッション タイムアウトと同期することもできます。

if (conversation.isTransient()) {
        conversation.setTimeout(((HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext()
                .getRequest()).getSession().getMaxInactiveInterval()*1000);
        conversation.begin();
    }
于 2016-09-22T09:02:42.443 に答える