轻松访问位于另一台服务器的远程ejb

dgi*_*ert 6 ejb jndi glassfish

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

我对EJB,JNDI和Java EE世界起了很大的作用,但在过去的几个月里,我已经能够在这种环境中做一些可接受的事情.现在我正在关注工作中的问题,现在解决方案并不像我想的那么好.

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

例如,这是我在名为server1的服务器中运行的Remote 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";
    }
}
Run Code Online (Sandbox Code Playgroud)

这是它的接口

package com.booreg;

import javax.ejb.Remote;

@Remote
public interface IMyRemoteBean
{
    public String helloWorld();
}
Run Code Online (Sandbox Code Playgroud)

然后我有第二个EAR应用程序必须在另一台服务器上运行,称为server2.第二个APP使用JSF和Managed Beans.我们有一个Managed 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(); }
}
Run Code Online (Sandbox Code Playgroud)

我已经到了这一点,这可以在我的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>
Run Code Online (Sandbox Code Playgroud)

据我所知,使用这个sun-web.xml文件,jndi-name使第二个应用程序知道在第一个应用程序中找到ejb实现的位置.但在这里我有一些问题:

  1. 有必要为我项目中的每个EJB接口声明一个ejb-ref条目吗?
  2. 如何在sun-web.xml中避免对服务器/端口(开发期间的server1:3700)进行静态引用?当这将投入生产时,我将不得不手动更改每个服务器的名称?这听起来很奇怪.我可以在服务器端使用某种变量来指定服务器/端口吗?

我希望我已经解释得很好.

非常感谢

更新:最后,由于这个链接,我看到可以引用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
Run Code Online (Sandbox Code Playgroud)

但我仍然面临着问题.部署应用程序时,在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)
    ...
Run Code Online (Sandbox Code Playgroud)

有人有什么想法吗?

use*_*716 0

@dgisbert

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


归档时间:

查看次数:

3029 次

最近记录:

13 年,1 月 前