`
8366
  • 浏览: 813029 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

ejb3.0 跨平台,跨JVM调用出现的问题及解决方案

    博客分类:
  • ejb
阅读更多

 

 

         首先在linux 中安装了 JBOSS-4.2.3,下载地址是:

 

http://downloads.sourceforge.net/jboss/jboss-4.2.3.GA-jdk6.zip?modtime=1216411914&big_mirror=1

 

然后给 安装文件的 ***.bin  加上执行权限,最好将文件安装在 /opt  目录下。

 

问题:安装好jboss后,启动jboss,发现只有使用 http://locahohost:8080 或者http://127.0.0.1:8080才能访问,使用IP地址却无法访问

 

解决:我本地的环境是 windows (ip:169.254.11.186) 中 安装虚拟机,在虚拟机中安装linux4(ip:169.254.11.175),在linux中安装 JBoss4.2.3 ,为了让 在 windows 系统中可以使用 http://169.254.11.175:8080  访问linux中的 jBoss 需要我们手动修改 配置文件, 讲 ${jboss.bind.address}

改成 0.0.0.0

 

/opt/jboss-4.2.3.GA/server/default/deploy/jboss-web.deployer/server.xml 片段

 

 <Connector port="8080" address="0.0.0.0"    
         maxThreads="250" maxHttpHeaderSize="8192"
         emptySessionPath="true" protocol="HTTP/1.1"
         enableLookups="false" redirectPort="8443" acceptCount="100"
         connectionTimeout="20000" disableUploadTimeout="true" />

 

 

问题:在jboss 中 发布了ejb3.0 的helloworld 的jar包,在windows eclipse开发环境中调用 ,总是报错

 

javax.naming.CommunicationException: Could not obtain connection to any of these urls: jnp://169.254.11.186,1099,然后我在windows环境中 telnet 169.254.11.175 1099 发现是打开端口失败

 

 

解决:

 

1.首先配置两个系统的host文件 ,让两个系统 互相认识对方系统

 

windows 系统中配置host文件的位置是:C:\WINDOWS\system32\drivers\etc,修改host文件内容为

 

169.254.11.175 bea
127.0.0.1       localhost

  

 

 Linux 系统中配置host文件的位置是:/etc  修改host文件内容为

 

169.254.11.186  Owner
127.0.0.1       localhost.localdomain   localhost       bea

 

验证 两边系统host 配置成功的方法是

 

在windows 的cmd 中 ping linux 的主机名

 

C:\Documents and Settings\Owner>ping bea

Pinging bea [169.254.11.175] with 32 bytes of data:

Reply from 169.254.11.175: bytes=32 time<1ms TTL=64
Reply from 169.254.11.175: bytes=32 time<1ms TTL=64
Reply from 169.254.11.175: bytes=32 time<1ms TTL=64
Reply from 169.254.11.175: bytes=32 time<1ms TTL=64

Ping statistics for 169.254.11.175:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

C:\Documents and Settings\Owner>

 

 

在linux 的  中 ping windows 的主机名

[root@bea etc]# ping Owner
PING Owner (169.254.11.186) 56(84) bytes of data.
64 bytes from Owner (169.254.11.186): icmp_seq=0 ttl=128 time=0.172 ms
64 bytes from Owner (169.254.11.186): icmp_seq=1 ttl=128 time=0.183 ms
64 bytes from Owner (169.254.11.186): icmp_seq=2 ttl=128 time=0.182 ms
64 bytes from Owner (169.254.11.186): icmp_seq=3 ttl=128 time=0.180 ms
64 bytes from Owner (169.254.11.186): icmp_seq=4 ttl=128 time=0.141 ms

 

两边都成功则host配置成功!

 

2. 给JBoos4.2.3 增加启动参数 -b ip

 

./run.sh -b 169.254.11.175

 

然后在windows中telnet  169.254.11.175  1099  发现连接成功

 

3.在window 的eclipse的开发环境中 使用下面的方式调用  部署在 linux中 jboss上的ejb 发现成功了

 

package cn.com.xinli.ejb3.test;
import java.util.Hashtable;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;

import cn.com.xinli.ejb3.HelloWorld;
public class EjbClient
{
	public static void main(String[] args)
	{
		Hashtable evn = new Hashtable();
		evn.put(Context.PROVIDER_URL, "jnp://169.254.11.175:1099");
		evn.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
	
		try
		{
			InitialContext context=new InitialContext(evn);
			/**
			 * ejb3比ejb2有可地方比较好,就是在jndi查找的时候不用我们在写ejb-jar.xml
			 * 只要我们按照jndi名字的查找规范就可以找到远程接口了
			 * 
			 */
			
			HelloWorld helloword=(HelloWorld)context.lookup("HelloWorldBean/remote");
			/*
			System.out.println(helloword.sayHello("huxl"));
			*/
			System.out.println(helloword.sayHello("huxl"));
			helloword.setNum(45);
			System.out.println(helloword.sayHello("huxl"));
			HelloWorld helloword2=(HelloWorld)context.lookup("HelloWorldBean/remote");
			System.out.println(helloword2.sayHello("huxl"));
			helloword2.setNum(30);
			System.out.println(helloword2.sayHello("huxl"));
			System.out.println(helloword.sayHello("huxl"));
			HelloWorld helloword3=(HelloWorld)context.lookup("HelloWorldBean/remote");
			System.out.println(helloword3.sayHello("huxl"));
			
		} catch (Exception e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

 

 

 

扩展:

 

 

 1.使用的jboss4.2或更高版本发生上述情况,4.2以下版本没有这个问题(已经验证jboss4.0 是ok的,不需要配置启动参),jboss启动时,默认只允许本机进行连接,如果需要其他的IP访问,需要 加上启动参数,最好这样写,则远程访问和本地访问都不会有问题

 

./run.sh -b 0.0.0.0 

 

JBoss 4.0.4GA 启动参数解释
    -h, --help                                                    显示帮助信息
    -V, --version                                               显示版本信息
      -D[=]                            设置系统属性
    -d, --bootdir=                                   设置启动补丁目录的位置;必须是绝对路径或者url
    -p, --patchdir=                                 设置补丁目录的位置;必须是绝对路径或者url
    -n, --netboot=                                  从指定的url网络位置启动
    -c, --configuration=                  指定服务器启动的配置(default、all、minimal)
    -B, --bootlib=                        将其它的jar包添加到bootclasspath的前面
    -L, --library=                         将其它的jar包添加到 loaders classpath
    -C, --classpath=                            将其它的url添加到loaders classpath
    -P, --properties=                           从指定的url加载系统属性
    -b, --host=                          所有JBoss Service绑定的地址
    -g, --partition=                          HA分区的名称(缺省为DefaultDomain)
    -u, --udp=                                         UDP的多播地址
    -l, --log=                                设置日志记录插件类型
JBoss 4.0.4GA环境变量
    JBOSS_HOME                                        JBoss的位置
    JAVA                                                         Java运行程序的位置
    JAVA_OPTS                                            JVM启动参数
    MAX_FD                                                  JBoss能够使用文件描述符的最大数量(仅用于Un*x)

 

2.  如果你在windos环境也开一个jboss 4.2.3 ,那么你就更能体验到ejb 分布式技术魅力了,在客户端 可以使用这样的方式 调用

 

Hashtable evn = new Hashtable();
		evn.put(Context.PROVIDER_URL, "jnp://169.254.11.186,1099,169.254.11.175:1099");
		evn.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");

 

在环境变量中配置两个 ejb 资源的地址,一个是windows 环境中的Jboss4.2.3 容器,一个是linux 环境中 jboss4.2.3 容器,两个容器中都有helloworld.jar ,则 我们调用的时候 两个容器都开 或者关闭一个都可以完成调用,成功返回结果,除非我们把两个容器都关闭了,客户端 会自动找到一个 可连接的ejb地址 进行处理,不过是不是负载均衡 我没有仔细研究,那位哥们研究了 ,麻烦告知一下

 

3.各种容器中 ejb客户端的初始化环境参数

 

 

 /* weblogic:
 * t3://localhost:7001
 * weblogic.jndi.WLInitialContextFactory
 * jboss:
 * jnp://127.0.0.1:1099
 * org.jnp.interfaces.NamingContextFactory
 * websphere:
 * iiop://127.0.0.1:2809
 * com.ibm.websphere.naming.WsnInitialContextFactory
 */

 

 

参考:

 

http://blog.csdn.net/yangdaliang/archive/2009/08/19/4462998.aspx

分享到:
评论

相关推荐

    EJB3.0无状态SessionBean例子

    本地接口只在同一个JVM内可用,而远程接口允许跨JVM通信。 3. **本地接口的SessionBean** 本地接口通常用于同一应用内部的组件间通信。在示例中,`EJB-HelloWorld`可能包含了名为`HelloWorldLocal`的本地接口,...

    EJB3.0__EJB3.0

    本地接口在同一JVM内的调用,远程接口允许跨JVM的调用。在EJB3.0中,这两种注解使接口的使用更加灵活,无需传统的接口实现方式。 总的来说,EJB3.0简化了传统EJB的复杂性,提升了开发效率,同时保持了企业级应用所...

    EJB.rar_EJB3_EJB3.0_ejb

    **EJB 3.0 开发详解:异常处理与常见问题解决方案** Enterprise JavaBeans (EJB) 是Java EE平台的核心组件之一,它提供了一种规范化的服务器端组件模型,用于构建可扩展、分布式的企业级应用。EJB 3.0是EJB规范的一...

    EJB3.0初步应用源码

    通过这个接口,客户端可以跨JVM与EJB进行通信。例如,`EJBHelloWorldRemote.java` 文件可能包含以下代码: ```java import javax.ejb.Remote; @Remote public interface EJBHelloWorldRemote { String sayHello();...

    各种EJB之间的调用示例.7z

    - **远程方法调用 (Remote Method Invocation, RMI)**:客户端通过接口调用EJB的方法,该接口由EJB容器生成并暴露,实现跨JVM通信。 - **本地方法调用 (Local Method Invocation)**:当EJB和客户端在同一JVM中运行...

    EJB应用开发详解

    EJB支持跨JVM的透明分布式计算,一个EJB应用可以在多台服务器上部署,实现负载均衡和高可用性。 **7. 容器服务** EJB容器提供的服务包括: - **安全性**:基于角色的访问控制(Role-Based Access Control,RBAC)。...

    用JSP开发的Web应用是跨平台的

    Java语言之所以能够实现跨平台,关键在于其编译后的字节码(Bytecode)可以在各种操作系统上的JVM中运行。无论是在Windows还是Linux环境下,只要安装了兼容版本的JVM,就可以执行相同的Java程序。因此,基于Java技术...

    EJB2.0

    Enterprise JavaBeans(EJB)是Java平台上用于构建可部署在企业级服务器上的分布式应用程序的一种核心技术。EJB2.0是EJB规范的一个版本,它在1.1版的基础上进行了许多改进,旨在提高开发者的生产力,同时保持了企业...

    ejb教程第4版

    远程接口允许跨网络调用,而本地接口适用于在同一JVM内的调用。开发者需要在客户端代码中创建EJB的引用,然后通过接口方法调用EJB服务。 6. **事务和安全性**:Websphere支持EJB的事务管理和安全性。事务管理可以...

    EJB基础.rar_ejb_enterprise java bean_分布式计算

    - EJB 3.0及后续版本引入了许多简化,比如无接口bean、注解驱动的配置,使其更易用。 - 微服务架构的兴起使得轻量级框架(如Spring)流行起来,但EJB在大型企业应用中仍有其价值。 7. **EJB与其他技术的整合**: ...

    EJB_TEST自己编写的EJB例子

    - **远程接口(Remote Interface)**:允许跨JVM的调用,使客户端能够与服务器端的EJB进行通信。 **EJB的事务管理**: EJB提供强大的事务管理能力,可以设置不同的事务属性,比如所需的事务级别、传播行为等,确保...

    EJB_ejb_plannedvhz_

    综上所述,"EJB_ejb_plannedvhz_"主题涵盖了EJB组件模型的核心概念,包括不同类型的EJB、它们之间的调用方式,特别是通过远程接口进行跨网络的调用。理解和掌握这些知识对于构建可扩展的企业级Java应用程序至关重要...

    EJB基础

    EJB可以通过JAX-WS(Java API for XML Web Services)或JAX-RS(Java API for RESTful Web Services)暴露为Web服务,实现跨平台通信。 ### 9. EJB与JSF、Spring等框架的集成 EJB可以与JavaServer Faces (JSF)、...

    EJB设计模式(中文版)

    EJB设计模式是开发者在实际项目中解决特定问题时,根据EJB规范和最佳实践形成的重复性解决方案。这些模式为复杂的企业级应用开发提供了结构化和可重用的方法。 1. **单例Session Bean** - 在EJB中,单例Session ...

    Myeclipse开发ejb详解教程.zip

    - EJB支持跨JVM的分布式计算,通过JNDI(Java Naming and Directory Interface)进行查找和绑定。 - Myeclipse允许开发者配置JNDI名称,以便于客户端查找并调用远程Bean。 7. **EJB 3.x与CDI(Contexts and ...

    myeclilpse开发EJB+Webapp

    1. Eclipse介绍:Eclipse是一款开源的、跨平台的集成开发环境,支持多种编程语言,包括Java,是开发Java EE应用的常用工具。 2. MyEclipse插件:MyEclipse是基于Eclipse的商业扩展,提供了更丰富的Java EE功能,包括...

    EJB简单例子

    - **分布式**:EJB支持跨JVM的远程调用,便于构建分布式系统。 - **标准接口**:遵循Java EE标准,易于与其他Java EE组件集成。 5. **EJB的挑战** - **学习曲线**:EJB规范复杂,需要花费时间学习和理解。 - **...

    EJB3应用实例

    EJB(Enterprise JavaBeans)3是Java EE(Enterprise Edition)平台中的核心组件之一,主要用于构建可扩展、可移植且高度模块化的企业级应用程序。EJB3引入了许多重大改进,简化了开发流程,降低了对开发者的要求,...

    开发 EJB 应用电子版

    在实际开发中,可能会遇到与JNDI相关的bug,这一部分将提供解决方案来处理这些问题。 #### 16.5 开发 SessionBean - **16.5.1 SessionBean 简介** SessionBean是EJB中最常用的一种类型,用于实现业务逻辑。...

    ejb,rmi.rar_AppBarDemo_ejb_j2ee ejb

    这个项目可能包含了一个或多个EJB组件,它们使用RMI来跨JVM通信,或者在客户端和服务器之间传递数据。"ejb"目录可能包含了EJB组件的源代码,而"RMI"目录则可能包含了与RMI相关的类或配置文件。 在实际开发中,EJB和...

Global site tag (gtag.js) - Google Analytics