最后一次尝试UP。对CSDN失望啊

解决方案 »

  1.   

     在实际的J2EE应用部署时也许会碰到穿越防火墙的情况。如果,客户不同意为我们打开需要的端口而只为我们留了HTTP端口,那么我们也并非走投无路了,我们可以使用rmi-http的解决这个问题,但也许我们要牺牲一些效率,至于牺牲多少,笔者也没有做过详细的测试。下面是笔者使用JBOSS rmi-http的一点经验总结:在JBOSS中通过rmi/http方式访问jndi以及ejb,无须更改程序代码。访问JNDI只需设置如下两个环境变量为:java.naming.factory.initial = org.jboss.naming.HttpNamingContextFactoryjava.naming.provider.url = http://hostip:8080/invoker/JNDIFactory(注:斜体的hostip指具体的jboss服务器的ip地址)通过RMI/HTTP方式访问EJB只要将下文中的红字部分添加到相应EJB的jboss.xml中就可以了。
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd">
     
    <jboss>
       <unauthenticated-principal>nobody</unauthenticated-principal>
       <enterprise-beans>
         <!--
           To add beans that you have deployment descriptor info for, add
           a file to your XDoclet merge directory called jboss-beans.xml that contains
           the <session></session>, <entity></entity> and <message-driven></message-driven>
           up for those beans.
         -->
          <session>
             <ejb-name>Hello</ejb-name>
             <jndi-name>Hello</jndi-name>
             <local-jndi-name>HelloLocal</local-jndi-name>
             <invoker-bindings>
                <invoker>
                    <invoker-proxy-binding-name>
                        stateless-http-invoker
                    </invoker-proxy-binding-name>
                </invoker>
             </invoker-bindings>
          </session>
       </enterprise-beans>
       
       <invoker-proxy-bindings>
        <!-- A custom invoker for RMI/HTTP -->
        <invoker-proxy-binding>
            <name>stateless-http-invoker</name>
            <invoker-mbean>jboss:service=invoker,type=http</invoker-mbean>
           <proxy-factory>org.jboss.proxy.ejb.ProxyFactory</proxy-factory>
            <proxy-factory-config>
                <client-interceptors>
                    <home>
                        <interceptor>org.jboss.proxy.ejb.HomeInterceptor</interceptor>
    <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
                     <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
                        <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
                    </home>
                    <bean>
                        <interceptor>
                            org.jboss.proxy.ejb.StatelessSessionInterceptor
                        </interceptor>
                        <interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
                        <interceptor>org.jboss.proxy.TransactionInterceptor</interceptor>
                        <interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
                    </bean>
                </client-interceptors>
            </proxy-factory-config>
        </invoker-proxy-binding>
       </invoker-proxy-bindings>
       
       <resource-managers>
       </resource-managers>
    </jboss>
     
    改动完以上部分,理论上就可以通过RMI/HTTP方式进行调用了。但实际测试中发现,如果按jboss的默认配置安装,可以正常访问JNDI但无法正常访问EJB,。在调用InitialContext的lookup时,总会抛出UnknownHostException。这个问题不知道是怎样导致的,但可以通过修改jboss的http-invoker.sar的默认配置来解决它。打开jboss\ server\default\deploy\http-invoker.sar\META-INF目录下的jboss-service.xml文件。将文件中所有的UseHostName属性的值都改为false。该属性的意思是,用主机名来构成URL串,默认是打开。但在打开放式下,无法通过测试,所以将该项关闭。
    (注:在实际测试时,本人只将服务“jboss:service=invoker,type=http”和“jboss:service=invoker,type=http,target=Naming”,既第一个和第三个服务,的属性改掉,即通过了测试。)
    这里说一句,楼主如果是想探讨或者是想深入的学习jboss,就应该多去尝试一下不同的操作,这里可以通过Google,或者是其他的书籍什么的方式,很多的途径,希望楼主学习愉快,呵呵
      

  2.   

    在实际的J2EE应用部署时也许会碰到穿越防火墙的情况。如果,客户不同意为我们打开需要的端口而只为我们留了HTTP端口,那么我们也并非走投无路了,我们可以使用rmi-http的解决这个问题,但也许我们要牺牲一些效率,至于牺牲多少,笔者也没有做过详细的测试。