2

を使用して、ステートフル セッション Bean のパッシベーションを非アクティブ化しようとしました

@CacheConfig(maxSize = 0、idleTimeoutSeconds = 0)

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

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

15:06:07,861 INFO [STDOUT] loadData programSlug = 一部のプログラム名

15:06:07,876 INFO [STDOUT] programServiceBean = エンドポイント [ jboss.j2ee:jar=TEI.war,name=ProgramServiceBean,service=EJB3 ] およびセッション 43h1h2v-j35uon-h18czgvf-1-h18d0nzj-df の No-Interface ビュー

15:06:07,908 エラー [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/TEI].[Faces Servlet]] サーブレット Faces サーブレットの Servlet.service() が例外をスローしました: Java .lang.IllegalStateException: org.hibernate.ejb.metamodel.AbstractAttribute.readObject(AbstractAttribute.java:122) [:3.6.6.Final] でメンバー [com.ray.TEI.model.Program#urlSlug] が見つかりませんsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) [:1.6.0_30] sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_30]

これが私のステートフル セッション Bean です...

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があります...

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 Finalを使っています)

4

1 に答える 1

2

https://community.jboss.org/wiki/Ejb3DisableSfsbPassivation (オプション 2、方法 2) で説明されているように、Bean 削除のタイムアウトをアイドル タイムアウトよりも短く設定することで問題を解決しました。

import org.jboss.ejb3.annotation.CacheConfig;

@Stateful
@CacheConfig (maxSize=100000, idleTimeoutSeconds=600, removalTimeoutSeconds=300)
public class ProgramServiceBean {
  //...
}
于 2012-04-21T15:02:24.737 に答える