gpt4 book ai didi

glassfish - 访问位于另一台服务器中的远程 ejb 的简便方法

转载 作者:行者123 更新时间:2023-12-04 16:11:21 25 4
gpt4 key购买 nike

这是我在 Stack Overflow 中的第一个问题,所以我希望它不会太简单。我一直在互联网上寻找一个好的解决方案,但现在我没有。

总的来说,我是 EJB、JNDI 和 Java EE 世界的初学者,但在过去的几个月里,我已经能够在这个环境中做一些可以接受的事情。现在我正在关注工作中的一个问题,但到目前为止,解决方案并没有我想要的那么好。

场景是这样的:我有一个在 Glassfih 3.1.2 中运行的 EAR 应用程序。我在这个 EAR 应用程序中声明了 EJB,无状态 bean 通过远程接口(interface)提供方法。

这是我在名为 server1 的服务器中运行的远程 Bean,例如

package com.booreg;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

import com.booreg.IMyRemoteBean;

@Stateless
@LocalBean
public class MyRemoteBean implements IMyRemoteBean
{
@Override
public String helloWorld()
{
return "Hi what's up boy";
}
}

这是它的界面
package com.booreg;

import javax.ejb.Remote;

@Remote
public interface IMyRemoteBean
{
public String helloWorld();
}

然后我有第二个 EAR 应用程序 必须在另一台服务器上强制运行 ,称为server2。第二个APP使用JSF和Managed Beans。我们有一个托管 Bean 充当 MyRemoteBeanRemote 的远程客户端,如下所示:
package com.nucleus;

import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import com.booreg.IMyRemoteBean;

@ManagedBean
@ViewScoped
public class MyManagedBean
{
@EJB( name="TheRef") IMyRemoteBean myRemoteBean;

public String getPhrase() { return myRemoteBean.helloWorld(); }
}

我已经到了这样的地步,即在我的 Web 项目中的 WEB-INF/sun-web.xml 文件中声明一个 ejb-ref 是可行的。
<ejb-ref>
<ejb-ref-name>TheRef</ejb-ref-name>
<jndi-name>corbaname:iiop:server1:3700#java:global/booreg/booreg.ejb/MyRemoteBean!com.booreg.IMyRemoteBean</jndi-name>
</ejb-ref>

我知道通过这个 sun-web.xml 文件,jndi-name 使第二个应用程序知道在哪里找到位于第一个应用程序的 ejb 实现。但在这里我有一些问题:
  • 有必要为我项目中的每个 EJB 接口(interface)声明一个 ejb-ref 条目吗?
  • 如何避免在 sun-web.xml 中对服务器/端口(开发期间的 server1:3700)进行静态引用?当这将投入生产时,我将不得不手动更改每个服务器的名称??这听起来很奇怪。我可以在服务器端使用某种变量来指定服务器/端口吗?

  • 我希望我已经很好地解释了自己。

    非常感谢

    更新:最后,感谢 link我看到可以引用 ejb 服务器 (server1) 在我的类路径中创建一个 jndi.properties 文件。这个文件应该包含这样的行。
    java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory
    java.naming.factory.url.pkgs=com.sun.enterprise.naming
    java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
    org.omg.CORBA.ORBInitialHost=server1
    org.omg.CORBA.ORBInitialPort=3700

    但我仍然面临问题。部署应用程序时,server1 出现下一个异常,我无法部署应用程序。
    ADVERTENCIA: IOP00100006: Class com.sun.jersey.server.impl.cdi.CDIExtension is not Serializable
    org.omg.CORBA.BAD_PARAM: ADVERTENCIA: IOP00100006: Class com.sun.jersey.server.impl.cdi.CDIExtension is not Serializable vmcid: SUN minor code: 6 completed: Maybe
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:248)
    at com.sun.corba.ee.spi.orbutil.logex.corba.CorbaExtension.makeException(CorbaExtension.java:95)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.handleFullLogging(WrapperGenerator.java:387)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator.access$400(WrapperGenerator.java:107)
    at com.sun.corba.ee.spi.orbutil.logex.WrapperGenerator$2.invoke(WrapperGenerator.java:511)
    at com.sun.corba.ee.spi.orbutil.proxy.CompositeInvocationHandlerImpl.invoke(CompositeInvocationHandlerImpl.java:99)
    at $Proxy117.notSerializable(Unknown Source)
    at com.sun.corba.ee.impl.orbutil.ORBUtility.throwNotSerializableForCorba(ORBUtility.java:783)
    at com.sun.corba.ee.impl.encoding.CDROutputStream_1_0.write_abstract_interface(CDROutputStream_1_0.java:697)
    at com.sun.corba.ee.impl.encoding.CDROutputObject.write_abstract_interface(CDROutputObject.java:545)
    at com.sun.corba.ee.impl.javax.rmi.CORBA.Util.writeAbstractObject(Util.java:493)
    ...

    有人知道吗?

    最佳答案

    @dgisbert

    在您提到的上一条评论中,一台服务器是公共(public)服务器,另一台是您企业的内部服务器。从公共(public)服务器调用应用程序层并不是最佳实践。这意味着您可以直接访问您的关键业务层。我建议在 EJB 调用之上有一个 Web 服务层,这样来自公共(public)站点的每个调用都必须通过 WebServer -> App Server。通过这种方式,您可以大大降低受到攻击的风险

    关于glassfish - 访问位于另一台服务器中的远程 ejb 的简便方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14634204/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com