2012-04-19 6 views
2

とステートフルセッションBeanの不動態化を不活性化しようとした私はは@CacheConfig

@CacheConfigを使用してステートフルセッションBean(maxSizeの= 0、idleTimeoutSeconds = 0)の保護を無効にしようとした

http://docs.jboss.org/ejb3/docs/reference/1.0.7/html/SessionBean_and_MDB_configuration.html

私はステートフルセッションBeanと何が起こっているのかをよりよく理解するために注入されたマネージドBeanに2つのprintステートメントを追加しました。ステートフルBeanは、マネージドBeanに実際に注入されているように見えますが(nullでないため)、そのメソッドを呼び出すことは効果がありません(下記のマネージドBeanのloadData()メソッドを参照すると、testステートフルセッションBeanの「出力」は表示されません)。

15:06:07861 INFO [STDOUT] loaddataのprogramSlug =いくつかのプログラム名

15:06:07876 INFO [STDOUT] programServiceBean =いいえインタフェースエンドポイントのビュー[jboss.j2ee:ジャー= TEI.war、名前= ProgramServiceBean、サービス= EJB3]及びセッション43h1h2v-j35uon-h18czgvf -1- h18d0nzj-DF

15:06:07908 ERROR [org.apache.catalina.core.ContainerBase [JBossの。 web]。[localhost]。[/ TEI]。[Faces Servlet]]サーブレットFaces ServletのServlet.service()が例外をスローしました:java.lang.IllegalStateException: メンバーを見つけることができません[com.ray.TEI.model.Program #urlSlug] at org.hibernate.ejb.metamodel.AbstractAttribute.readObject(AbstractAttribute.java:122)[:3.6.6.Final] at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)[:1.6.0_30] at sun .reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)[:1.6.0_30]

ここでは

package com.ray.TEI.ejb; 

import com.ray.TEI.model.Program; 

import javax.ejb.Stateful; 
import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 

import org.jboss.ejb3.annotation.CacheConfig; 

@Stateful 
@CacheConfig(maxSize = 0, idleTimeoutSeconds = 0) 
public class ProgramServiceBean { 
    @PersistenceContext(unitName="TEI", type=PersistenceContextType.EXTENDED) 
    protected EntityManager em; 

    public void test() { 
    System.out.println("test"); 
    } 

    public Program findBySlug(String urlSlug) { 
    System.out.println("findBySlug " + urlSlug); 
    return em.createNamedQuery("Program.findBySlug", Program.class) 
     .setParameter("urlSlug", urlSlug) 
     .getSingleResult(); 
    } 
} 

そして、ここでは、管理対象Beanです...私のステートフルセッションBeanです...

package com.ray.TEI.controller; 

import javax.enterprise.context.RequestScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

import com.ocpsoft.pretty.faces.annotation.URLAction; 
import com.ocpsoft.pretty.faces.annotation.URLMapping; 
import com.ocpsoft.pretty.faces.annotation.URLQueryParameter; 
import com.ray.TEI.ejb.ProgramServiceBean; 
import com.ray.TEI.model.Program; 

@Named 
@RequestScoped 
@URLMapping(
    id="uuts", 
    pattern="/#{programSlug:uutsController.programSlug}/uuts", 
    viewId="/uuts.xhtml" 
) 
public class UutsController { 
    @Inject private ProgramServiceBean programServiceBean; 
    private String programSlug; 
    private Program program; 

    @URLQueryParameter("new") 
    private Boolean displayAddForm = false; 

    @URLAction 
    public String loadData() { 
    System.out.println("loadData programSlug = " + programSlug); 
    if (programSlug != null) { 
     System.out.println("programServiceBean = " + programServiceBean); 
     programServiceBean.test(); 
     program = programServiceBean.findBySlug(programSlug); 
     System.out.println("loadData program = " + program.getName()); 
    } 
    if (program == null) { 
     return "pretty:error"; 
    } 
    return null; 
    } 

    public String getProgramSlug() { 
    return programSlug; 
    } 
    public void setProgramSlug(String programSlug) { 
    this.programSlug = programSlug; 
    } 

    //other getters/setters 
} 

何が問題なの?ここで説明するように

おかげで、 ジェイソン

は(ちなみに、私は最終的にJBoss 6.1を使用しています)

答えて

2

は(https://community.jboss.org/wiki/Ejb3DisableSfsbPassivationアイドルタイムアウトよりも小さくなるように豆除去タイムアウトを設定することで、私の問題を修正しましたオプション2、方法2)

import org.jboss.ejb3.annotation.CacheConfig; 

@Stateful 
@CacheConfig (maxSize=100000, idleTimeoutSeconds=600, removalTimeoutSeconds=300) 
public class ProgramServiceBean { 
    //... 
}