|
|
|
MDB中调用SessionBean的配制该怎么写
|
2005年01月27日 17:10
|
|
|
标签列表
|
|
我的平台windows2003+JBuilder2005+JBoss4.0+mysql 我现在想用一个MDB〔LogBean〕去驱动SessionBean(Count) 我不想直接在代码里初始化JNDI的参数直接调用,想通过配制文件去调用。 现在在部署LogBean时有异常: 6:56:09,859 ERROR [MessageDrivenContainer] Starting failed jboss.j2ee:jndiName=local/Log,service=EJB org.jboss.deployment.DeploymentException: Failed to resolve EJB-link: Count make by EJB-name: EJB/Count
我在LogBean的EJB-jar.xml文件里: 加了EJB-ref啊 元素值如下: ejb-ref-name:ejb/Count /*在LogBean的OnMessage()里调用的JNDI名称,我是这样调用的
Context ctx = new InitialContext(); Object o = ctx.lookup("java:comp/env/ejb/Count"); CountHome home = (CountHome) javax.rmi.PortableRemoteObject.narrow(o,CountHome.class); Count count = home.create(2); */ ejb-ref-type:Session home:mastercount.CountHome remote:mastercount.Count ejb-link:Count
在jboss.xml文件里我加了resource-manager 元素值如下: res-name:ejb/Count res-jndi-name:Count
请问各位,jboss.xml中的resource-manager是必须要加的吗?我觉的是的。 我的MDB LogBean本来没加入对Count的调用时是好的,部署和测试都作过了,没有问题,Count也是的。但结合在一起时就不行了, 请各位帮忙看看。
|
|
|
|
|
|
Re: MDB中调用SessionBean的配制该怎么写
|
2005年01月27日 17:22
|
|
|
你可以这样做,比较好一点: 先建一个class如下: /** * <p>Title: 通用查找HOME接口类</p> * <p>Description: 缓存其他bean的home接口,提供singleton型的InitialContext</p> */
import java.util.*; import javax.ejb.*; import javax.naming.*; import javax.rmi.*;
public class EJBHomeFactory {
private static EJBHomeFactory instance; private Map homeInterfaces; private Context context;
//构造函数 is private,不能被直接实例化,用该类的getInstance函数得到该类实例。 private EJBHomeFactory() throws NamingException { homeInterfaces = new HashMap(); context = new InitialContext(); }
public static EJBHomeFactory getInstance() throws NamingException { if (instance == null) { instance = new EJBHomeFactory(); } return instance; }
public EJBLocalHome lookup(String jndiName, Class homeInterfaceClass) throws NamingException { //查找已存在map中的home句柄,如果有的话,就不用再lookup了。 EJBLocalHome homeInterface = (EJBLocalHome) homeInterfaces.get(homeInterfaceClass); //如果没有现成的home句柄,就用jndi名查找它。 if (homeInterface == null) { Object obj = context.lookup(jndiName); homeInterface = (EJBLocalHome) PortableRemoteObject.narrow(obj, homeInterfaceClass); //把新找到的home句柄缓存起来,活不能白干。 homeInterfaces.put(homeInterfaceClass, homeInterface); } return homeInterface; } } 然后在你的mdb的onmessage方法中这样写: try { if (msg instanceof TextMessage) { String s = ( (TextMessage) msg).getText(); System.out.println("--收信息:[" + s + "]"); EJBHomeFactory fs = EJBHomeFactory.getInstance(); /** *假设session bean的bean名是CpBusiness *CpBusiness的商务逻辑通过process方法实现 */ CpBusinessLocalHome cpHome = (CpBusinessLocalHome) fs.lookup("CpBusinessLocal", CpBusinessLocalHome.class); CpBusinessLocal cp = cpHome.create(); cp.process(s); } } catch (Exception ex) { } :)祝好运
|
|
|
|
|
|
Re: MDB中调用SessionBean的配制该怎么写
|
2005年01月28日 09:22
|
|
|
|
|
|
|