【问题标题】:Passing more than one object to an EJB remote interface将多个对象传递给 EJB 远程接口
【发布时间】:2011-08-11 11:51:57
【问题描述】:

我试图将多个对象传递给未部署 Glassfish 3.1.1 的 EJB 远程接口。无论第一个对象是什么,它都会很好地传递第二个对象始终为空。是因为 rmi-iiop 的规格还是属性设置?

这是我的属性设置:

final Properties props = new Properties();
    props.setProperty(InitialContext.STATE_FACTORIES,
            "com.sun.enterprise.naming.SerialInitContextFactory");
    props.setProperty("java.naming.factory.url.pkgs",
            "com.sun.enterprise.naming");
    props.setProperty("java.naming.factory.state",
            "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
        props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.192");
        props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
    // props.setProperty("com.sun.appserv.iiop.orbconnections","5");
    // Increase ORB Response Timeout to 5 min instead of 30 min:
    // props.setProperty("com.sun.corba.ee.transport.ORBTCPTimeouts",
    // "500:90000:20");
    props.setProperty(
            "com.sun.corba.ee.transport.ORBWaitForResponseTimeout",
            "300000");
    try {
        InitialContext ic=new InitialContext(props);
        TestRemote remote=(TestRemote) ic.lookup("java:global/com.capmtech_test.ear-ear_ear_1.0-SNAPSHOT/test.ear-ejb-1.0-SNAPSHOT/Test!com.capmtech.TestRemote");


                    Person p = new Person();
                    p.setName("Smith");
                    Phone m = new Phone();

            remote.test(p, m);

    } catch (NamingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

这是无状态的 EJB:

@Stateless
public class Test implements TestRemote {
    @EJB
    private PersonFacadeLocal personFacade;

    @Override
    public void test(Person person, Phone mobile) {
        Person p = person;
        p.setMobile(mobile);
        personFacade.create(p);
    }

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")

}

在这种情况下,移动设备将始终为空,如果我交换参数,人将是空的!如果 IP 设置为 localhost 一切都会正常工作。

请帮忙

【问题讨论】:

  • “传递多个对象”是什么意思?你的意思是你有一个远程接口上有两个参数的方法,你的第一个参数很好,但第二个参数为空?这看起来很奇怪。
  • 我看到你设置了很多属性来让它工作。根据documentation,您应该使用无参数 InitialContext()。设置ip地址时行为会发生变化,这很奇怪。也许您对 /etc/hosts 的设置方式或防火墙有问题? Glassfish 是关于 /etc/hosts 配置的picky
  • 这看起来很奇怪。我从未见过这种行为。我想我会建议创建一个独立的测试用例并使用 Glassfish 打开一个错误报告。

标签: rmi glassfish-3 ejb-3.1


【解决方案1】:

这一切都假设您在同一台机器上运行 glassfish 服务器和独立客户端。我能够重现这方面的问题。虽然这不完全是您的问题,但您可能会通过相同的更改获得结果。我在 Windows Vista 上运行 GF 3.1。我的 windows\system32\drivers\etc\hosts 文件有以下几行:

10.99.0.199 pc-2017.pgx.local
127.0.0.1       localhost  pc-2017.pgx.local

当我的客户端软件连接时:

props.put("org.omg.CORBA.ORBInitialHost", "localhost");

我得到错误:

Exception in thread "main" javax.ejb.EJBException: java.rmi.RemoteException: CORBA INTERNAL 1330446421 No; nested exception is:
    org.omg.CORBA.INTERNAL: ----------BEGIN server-side stack trace----------
org.omg.CORBA.INTERNAL: WARNING: IOP00710085: A reflective tie got an error while invoking method saveMonkey on class com.pts.monkey._MonkeySessionRemote_Remote
  vmcid: OMG  minor code: 85  completed: No

但是如果我改变客户端连接:

props.put("org.omg.CORBA.ORBInitialHost", "pc-2017.pgx.local");

它工作正常。

【讨论】:

    【解决方案2】:

    替换以下行:

        props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.1.192");
        props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
    

    与:

        props.setProperty(Context.PROVIDER_URL,"iiop://192.168.1.192:3700");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多