远程访问jboss

来源:互联网 发布:安卓乐器软件 编辑:程序博客网 时间:2024/06/05 21:17

JBoss(序) 

 

2009-11-26 10:54:27|  分类: JBoss

 

Oracle Communications Presence,简称OCP,公司用的服务器之一。里面有许多MBean,而我的任务就是调用其中的一个MBean创建一个新用户,就在解决这个任务的过程中,由于"JMX"跟"EJB"都没有学过,遇到了很多麻烦,而在这麻烦之中,最麻烦的要数XML配置文件,让人眼花缭乱,诸如:application.xml,orion-application.xml,jboss-app.xml,jboss-service.xml等等,心底便开始讨厌Oracle的并购做法,其自身服务器有OC4J,并购了BEA之后,又有了WebLogic,再加上几个JBoss的配置文件,哎,一塌糊涂,这OCP服务器,到底是啥来的?看来SUN的产品还真是岌岌可危啊~~。

      看来要解决手头上的任务,还真是不简单,虽然老大一直催着任务,但是也没有办法,只好匆匆的学起"JMX"与"EJB",也就顺理成章的了解起了JBoss,而为什么不是Weblogic呢,因为它已经被并购了,没前途了,哈哈,而OC4J嘛,不开源。相反,JBoss则是受到开源社区的热捧。

1. 远程访问EJB

       针对EJB(1)中的HelloEJB例子中,如果在局域网内的另一台机器调用部署在JBoss里面的HelloEJB,则需将HelloEJBClient中的prop.put("java.naming.provider.url","localhost:1099");这段代码改为prop.put("java.naming.provider.url","192.168.2.182:1099");,也就是将localhost改为JBoss所在的IP地址,运行,如无意外,将会出错,错误信息大概为:Could not obtain connection to any of these urls: 192.168.2.182:1099。

2. 访问http://192.168.2.182:8080或者http://127.0.0.1:8080

      此时第一反应便是ping 192.168.2.182,结果并没有出现任何问题,接着便访问http://192.168.2.182:8080,发现不能访问,如果是服务器是Tomcat的话,该访问是没有任何问题的。于是便上网搜索,发现JBoss是默认将IP绑定为127.0.0.1的,所以便会出现访问不了http://192.168.2.182:8080,甚至在JBoss服务器本机也不能访问该地址。而只能访问http://127.0.0.1:8080或者http://localhost:8080,那该如何解决呢?

       打开%JBOSS_HOME%\server\default\deploy\jbossweb.sar目录,编辑server.xml,找到

<Connector protocol="HTTP/1.1"port="8080" address="${jboss.bind.address}"                                                              connectionTimeout="20000" redirectPort="8443" />

<Connector protocol="AJP/1.3"port="8009" ddress="${jboss.bind.address}"

                  redirectPort="8443"/>

将address="${jboss.bind.address}修改为address="192.168.2.182",重启JBoss,便可以在局域网中的任何一台机器上访问http://192.168.2.182:8080,可这次如果在JBoss服务器本机上却不能访问http://127.0.0.1:8080,如果要让两个同时都能访问,则需将address="192.168.2.182"修改为address="0.0.0.0"。

3.解决远程访问EJB

      现在再次调用HelloEJBClient,发现错误依然,可见上面的修改并没有影响到EJB的调用,仔细想想,刚才所修改的是web的URL,而EJB所需要的是JNDI的URL,所以错误依然,再通过网络搜索,发现可以通过以下方法解决,在%JBOSS_HOME%\bin目录下,创建run.bat的快捷方式,然后如图所示在其Target后面加上--host=192.168.2.182,重启JBoss,然后再次调用HelloEJBClient即可成功。

如果是在eclipse开发环境下的话,打开Servers视图,双击Jboss服务器,再点击Overview视图中的Open launch configuration,在弹出来的对话框里,如图所示输入--host=192.168.2.182,确定之后重启Jboss,即可。

至于如何设置JBoss的配置文件才能达到这一效果,目前还没有找到,找到了再添加。

 

1. JNDI命名

针对EJB(1)中的Hello类,代码如下:

Hello:

package org.lmxzz.example.ejb.sever;

 

import javax.ejb.Stateless;

 

/**

 *Session Bean implementation class Hello

 */

@Stateless(mappedName ="HelloEJB/Hello")

public class Hello implements HelloRemote {

 

   /**

    * Default constructor.

    */

   public Hello() {

       // TODO Auto-generated constructor stub

    }

}

日志里描述了mappedName="HelloEJB/Hello"指明了该Session EJB的JNDI URL(JNDI名称),其实,如果在没有注明mappedName属性的时候,EJB会默认使用以下JNDI命名规则:

(1)如果EJB应用打包成后缀为*.ear的发布文件,默认的JNDI名称是

本地接口:包名/类名/local,远程接口:包名/类名/remote

例如,HelloEJB打包为HelloEJB.ear文件,则其本地接口为HelloEJB/Hello/local,远程接口为 HelloEJB/Hello/Remote。

(2)如果EJB应用打包成后缀为*.jar的发布文件,默认的JNDI名称是

本地接口:类名/local,远程接口:类名/remote

例如,HelloEJB打包为HelloEJB.jar文件,则其本地接口为Hello/local,远程接口为:Hello/remote。

2. Annotations

指定本地接口跟远程接口两种方式:

(1)在实现类Hello里加上@Lacal和@Remote注释,并分别指定本地接口和远程接口的具体的类

@Stateless

@Local({HelloLocal.class})

@Remote({HelloRemote.class})

public class Hello implements HelloLocal,HelloRemote {

    . . .

}

public interface HelloLocal {

}

public interface HelloRemote {

}

(2)在本地接口和远程接口分别加上@Lacal和@Remote注释,感觉此种方式比较简洁明了。

@Stateless

public class Hello implements HelloLocal,HelloRemote {

    . . .

}

@Local

public interface HelloLocal {

}

@Remote

public interface HelloRemote {

}

在上述的情况下,再指定本地接口跟远程接口JNDI名称的两种方式:

(1)在实现类Hello里加上@LacalBinding和@RemoteBinding注释,并指定具体的JNDI名称

@LocalBinding(jndiBinding="HelloEJB/HelloLocal")

@RemoteBinding(jndiBinding="HelloEJB/HelloRemote")

public class Hello implements HelloLocal,HelloRemote {

    . . .

}

public interface HelloLocal {

}

public interface HelloRemote {

}

(2)在本地接口和远程接口分别加上@LocalBinding和@RemoteBinding注释,并指定具体的JNDI名称

public class Hello implements HelloLocal,HelloRemote {

    . . .

}

@LocalBinding(jndiBinding="HelloEJB/HelloLocal")

public interface HelloLocal {

}

@RemoteBinding(jndiBinding="HelloEJB/HelloRemote")

public interface HelloRemote {

}

 

此时部署到JBoss上面,则会在Console出现如下信息:

HelloEJB/HelloRemote - EJB3.x DefaultRemote Business Interface

Hello/remote-org.lmxzz.example.ejb.sever.HelloRemote- EJB3.x Remote Business Interface

HelloEJB/HelloLocal - EJB3.x Default LocalBusiness Interface

Hello/local-org.lmxzz.example.ejb.sever.HelloLocal- EJB3.x Local Business Interface

 

3. 本地接口与远程接口

本地接口是指在同个JVM调用,而远程接口指的是在不同的JVM调用,如果在同一JVM调用EJB,采用Local接口访问EJB会优于Remote接口,因为Remote接口访问EJB需要经过远程方法调用(RPCs)环节,而Local接口访问EJB是直接从JVM中返回EJB的引用。(发布到EJB容器之后,则该EJB与EJB容器同个JVM)

 

4. Stateless与Stateful

无状态Session Bean即不会单独保存Bean的数据,也就是说,共享该Bean的数据,就像public static字段一样,而有状态Session Bean则会单独保存Bean的数据,每次调用该Bean就犹如新建一新线程一样。

原创粉丝点击