3

JBoss 6.1 Finalを使用していますが、Webアプリケーションをしばらく実行すると(アプリケーションがクラッシュしないことに注意してください)、非常に長いスタックトレースが続くというエラーメッセージが表示されます。この問題は、他のステートフルセッションBeanが注入されているステートフルセッションBeanでのみ発生することに気付きました。

16:10:59,769エラー[org.jboss.ejb3.cache.simple.SimpleStatefulCache.UutSerialNumberServiceBean]問題のパッシベーションスレッド:javax.ejb.EJBException:パッシベーションできませんでした。状態の保存に失敗しました

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

package com.ray.TEI.ejb;

import java.io.Serializable;

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

import com.ray.TEI.model.TestProcedure;
import com.ray.TEI.model.Uut;
import com.ray.TEI.model.UutSerialNumber;

@Stateful
public class UutSerialNumberServiceBean implements Serializable {
  private static final long serialVersionUID = 1L;
  @PersistenceContext(unitName="jasoni", type=PersistenceContextType.EXTENDED)
  protected EntityManager em;
  @Inject private ExecProcedureServiceBean execProcedureServiceBean;

  public boolean isDuplicateSerialNumber(Uut uut, String serialNumber) {
    return ((Number)em.createNamedQuery("UutSerialNumber.getCountByUutIdAndSerialNumber")
             .setParameter("uut", uut)
             .setParameter("serialNumber", serialNumber)
             .getSingleResult()).intValue() > 0;
  }

  public UutSerialNumber findUutSerialNumberByUutSerialNumberId(Integer uutSerialNumberId) {
    return em.find(UutSerialNumber.class, uutSerialNumberId);
  }

  public UutSerialNumber editSerialNumber(Integer uutSerialNumberId, String serialNumber) {
    UutSerialNumber uutSerialNumber = findUutSerialNumberByUutSerialNumberId(uutSerialNumberId);
    uutSerialNumber.setSerialNumber(serialNumber);
    return uutSerialNumber;
  }

  public UutSerialNumber createSerialNumber(Uut uut, String serialNumber) {
    UutSerialNumber uutSerialNumber = new UutSerialNumber();
    uutSerialNumber.setSerialNumber(serialNumber);
    uutSerialNumber.setUut(uut);
    uut.getSerialNumbers().add(uutSerialNumber);
    em.persist(uutSerialNumber);
    for (TestProcedure testProcedure : uut.getTestProcedures()) {
      execProcedureServiceBean.createExecProcedure(uutSerialNumber, testProcedure);
    }
    return uutSerialNumber;
  }
}

これが、注入されたステートフルセッションBeanです...

package com.ray.TEI.ejb;

import java.io.Serializable;

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

import com.ray.TEI.model.ExecProcedure;
import com.ray.TEI.model.TestProcedure;
import com.ray.TEI.model.UutSerialNumber;


@Stateful
public class ExecProcedureServiceBean implements Serializable {
  private static final long serialVersionUID = 1L;
  @PersistenceContext(unitName="jasoni", type=PersistenceContextType.EXTENDED)
  protected EntityManager em;

  public ExecProcedure createExecProcedure(UutSerialNumber uutSerialNumber, TestProcedure testProcedure) {
    ExecProcedure execProcedure = new ExecProcedure();
    execProcedure.setUutSerialNumber(uutSerialNumber);
    execProcedure.setTestProcedure(testProcedure);
    execProcedure.setIterationCount(0);
    em.persist(execProcedure);
    return execProcedure;
  }
}

誰かがこれの何が問題なのか知っていますか?

ありがとう、ジェイソン

4

1 に答える 1

2

EntityManager シリアル化できません、それが失敗する理由だと思います。

ここからのオプションのカップル:

  • パッシベーションを無効にします(そのメカニズムが必要ない場合の最も簡単なオプション)
  • SFSBからpersistence-contextを削除します(これにより、EXTENDEDモードが強制終了される可能性があります)
  • EntityManagerをシリアル化可能なHibernate-Sessionに置き換えます(実験的であると考えてください。自分で試したことはありません)。
于 2012-04-19T11:23:40.223 に答える