JBoss_Wildfly_EJB

来源:互联网 发布:网络出版物的特点 编辑:程序博客网 时间:2024/06/03 04:00

JBoss/Wildfly/EJB

sf2gis@163.com

2016年2月23日

 

1  目标:EJB容器,实现EJB标准,开发分布式应用。

EJB是Java的分布式应用标准,目标是提供分布式IoC的JavaBean,提供安全、事务等服务。

参考:http://www.360doc.com/content/15/0503/20/22369024_467728346.shtml

2 原理:服务器提供分布式应用,客户端通过TCP远程调用访问。

参考:http://www.360doc.com/content/15/0503/20/22369024_467728346.shtml

https://www.zhihu.com/question/22764869

3 流程:安装EJB容器JBOSS,服务端发布EJB服务,客户端获取远程对象在本地使用。

参考:http://www.doc88.com/p-848872913718.html

https://docs.jboss.org/author/display/WFLY8/EJB+invocations+from+a+remote+client+using+JNDI

https://github.com/akquinet/jbosscc-wildfly-examples/blob/master/ejb-remote-example/ejb-remote-example-ejb-client/src/main/java/de/akquinet/jbosscc/Main.java

3.1 安装JBOSS/Wildfly8:Wildfly官网下载对应版本,解压后按照ReadMe.txt安装。

3.1.1安装Java:Wildfly8需要JavaEE7,需要先安装JavaEE7。

3.1.2设置JBOSS_HOME环境变量:设置为JBOSS的根目录。

3.1.3启动JBOSS:JBOSS_HOME/bin/standalone.bat启动JBOSS。

3.1.4测试:在浏览器输入http://127.0.0.1:8080 ,如果显示Wildfly界面则正常启动。

3.2 安装Eclipse插件JBOSS Tools:官网(tools.jboss.org)查看Wildfly对应版本的插件与Eclipse版本要求。

3.2.1查看版本:Wildfly8需要Eclipse Luna和Java7(版本不对应的话无法正常使用)。

3.2.2Eclipse安装JBOSStools:help-》install newsoftware,使用指定网址安装(安装需要的工具)。

3.3 服务端:创建EJB工程,创建服务Bean的接口,实现此接口,发布为服务。

能够提供EJB服务的称为EJB容器,如JBOSS。

3.4 创建EJBProject:勾选create ejb-jar.xml。

3.5 创建服务Bean:包括用于对外提供服务的接口和实际工作类。

 

//HelloWorldBeanRemote.java

package lee;

 

importjavax.ejb.Remote;

 

@Remote

public interfaceHelloWorldBeanRemote {

      public String sayHello();

}

//HelloWorldBean.java

package lee;

 

importjavax.ejb.LocalBean;

importjavax.ejb.Stateless;

 

/**

 * Session Bean implementation classHelloWorldBean

 */

@Stateless

@LocalBean

public classHelloWorldBean implements HelloWorldBeanRemote {

 

    /**

     * Default constructor.

     */

    public HelloWorldBean() {

        // TODO Auto-generated constructor stub

    }

 

      @Override

      public String sayHello() {

           // TODO Auto-generated method stub

           return"Hello,World,JBOSS!";

      }

 

}

3.6 发布EJB服务:Servers右键-》New创建服务器

3.6.1创建EJB服务器:使用Wildfly8.x服务器,默认选项创建一个服务器。

3.6.2发布服务:项目右键-》Debugas-》Debug on Server,选择Wildfly服务器。

服务启动后显示Tweek started,说明服务成功启动。

服务器的log还会显示管理页面地址:http://127.0.0.1:9990/management

3.6.3添加管理用户:使用cmd打开JBOSS_HOME/bin/add-user.bat,按照提示添加管理用户。

添加用户:myNewUser/123456a.b

参考:http://www.cnblogs.com/HD/p/4000225.html

3.7 客户端:创建客户端工程,指定服务器,从服务器获取创建远程对象。

3.7.1创建客户端工程:Java Application。

3.7.1.1  添加EJB支持库:jboss-client.jar。

BuildPath-》add ExternalJARs-》JBOSS_HOME/bin/client/jboss-client.jar。

3.7.1.2  添加JBOSS服务器上下文属性:jboss-ejb-client.properties

//jboss-ejb-client.properties

remote.connections=default

remote.connection.default.host=127.0.0.1

remote.connection.default.port=8080

remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false

 

remote.connection.default.username=myNewUser

remote.connection.default.password=123456a.b

3.7.1.3  把服务端的接口copy到客户端。

//HelloWorldBeanRemote.java

package lee;

 

importjavax.ejb.Remote;

 

@Remote

public interfaceHelloWorldBeanRemote {

      public String sayHello();

}

3.7.2创建客户端类:获取上下文,设置服务地址,查找服务Bean,使用远程服务。

3.7.2.1  获取上下文:

                 Properties properties = new Properties();

                 properties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");

                 initialContext = newInitialContext(properties);

3.7.2.2  设置服务地址:ejb:app/module/distinct/beanName!interfaceName

           String appName= "";

           StringmoduleName="EJBDemo";

           String distinctName="";

           StringbeanName="HelloWorldBean";

           StringinterfaceName="lee.HelloWorldBeanRemote";

           System.out.println("Remote="+interfaceName);

           String name = "ejb:" +appName + "/" + moduleName + "/" + distinctName    + "/" + beanName + "!"+ interfaceName;

3.7.2.3  查找服务Bean:从服务上下文中查找指定地址的Bean。

                 bean=(HelloWorldBeanRemote)getInitialContext().lookup(getLookupName()); 

3.7.2.4  使用远程服务:使用接口调用服务。

从服务器上下文查找到服务后,就可以使用接口像使用本地对象一样调用远程服务。

3.7.2.5  示例

//client.java

package lee;

 

importjava.util.Properties;

 

import javax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

 

public classClient {

 

      private static ContextinitialContext=null;

 

      public static Context getInitialContext()throws NamingException {

           if (initialContext == null) {

                 Properties properties = newProperties();

                 properties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");

                 initialContext= new InitialContext(properties);

           }

           return initialContext;

      }

     

      public static void main(String[] args) {

           // TODO Auto-generated method stub

           HelloWorldBeanRemote bean =doLookup();

           System.out.println(bean.sayHello());

      }

 

      private static HelloWorldBeanRemotedoLookup() {

           // TODO Auto-generated method stub

           HelloWorldBeanRemote bean =null;

           try {

                 bean=(HelloWorldBeanRemote)getInitialContext().lookup(getLookupName()); 

           } catch (NamingException e) {

                 // TODO Auto-generated catchblock

                 e.printStackTrace();

           }

 

           return bean;

      }

 

      private static String getLookupName() {

           // TODO Auto-generated method stub

           String appName= "";

           StringmoduleName="EJBDemo";

           StringdistinctName="";

           StringbeanName="HelloWorldBean";

           StringinterfaceName="lee.HelloWorldBeanRemote";

           System.out.println("Remote="+interfaceName);

           Stringname = "ejb:" + appName + "/" + moduleName + "/"+ distinctName    + "/" +beanName + "!" + interfaceName;

           System.out.println(name);        

           return name;

      }

 

}

3.7.3测试:Debug As-》javaapplication

4 方法

参考:http://www.cnblogs.com/yjmyzz/p/3518386.html

由于Web本身就具有分布式功能,所有在Web上不存在分布式的问题。而Spring除了具有EJB的IoC功能外,也提供事务处理能力,而分布式服务则有Web服务取代。所有在Web应用上,EJB一般不直接使用,而是由SSH等Web框架组合的简单方式取代。

EJB在应用于Web时,对于Servlet的支持需要使用Servlet容器,JBOSS集成Tomcat作为Web服务器提供Servlet支持。

4.1 JBOSS独立使用

JBOSS/Wildfly8安装:下载JBOSS(需要先安装Java1.7),解压后按照ReadMe.txt的步骤操作。

启动服务:命令行启动bin/standalone.bat。

关闭服务:Ctrl+C。

4.2 管理页面:127.0.0.1:9990

使用adduser.bat的用户登录后就可以管理服务了。

4.3 Eclipse默认部署位置:JBOSS_HOME/standalone/deployment

4.4 服务器配置文件:JBOSS_HOME/standalone/configuration/standalone.xml

4.4.1服务地址在interface标签中定义:默认地址是127.0.0.1

    <interfaces>

        <interfacename="management">

            <inet-addressvalue="${jboss.bind.address.management:127.0.0.1}"/>

        </interface>

        <interfacename="public">

            <inet-addressvalue="${jboss.bind.address:127.0.0.1}"/>

        </interface>

        <interfacename="unsecure">

            <inet-addressvalue="${jboss.bind.address.unsecure:127.0.0.1}"/>

        </interface>

    </interfaces>

4.4.2服务端中在socket-binding-group标签中定义:默认ejb http服务的端口是8080

    <socket-binding-groupname="standard-sockets" default-interface="public"port-offset="${jboss.socket.binding.port-offset:0}">

        <socket-bindingname="management-http" interface="management"port="${jboss.management.http.port:9990}"/>

        <socket-bindingname="management-https" interface="management"port="${jboss.management.https.port:9993}"/>

        <socket-binding name="ajp"port="${jboss.ajp.port:8009}"/>

        <socket-bindingname="http" port="${jboss.http.port:8080}"/>

        <socket-bindingname="https" port="${jboss.https.port:8443}"/>

        <socket-bindingname="txn-recovery-environment" port="4712"/>

        <socket-bindingname="txn-status-manager" port="4713"/>

        <outbound-socket-bindingname="mail-smtp">

            <remote-destinationhost="localhost" port="25"/>

        </outbound-socket-binding>

    </socket-binding-group>

5 方法:JBOSS发布Web应用/war

参考:http://developer.51cto.com/art/200906/128693.htm

http://www.2cto.com/os/201504/395201.html

5.1 目标:使用JBOSS发布Web应用,调用JSP、Servlet。

5.2 原理:JBOSS使用Undertow作为Servlet容器(类似Tomcat),能够发布Web应用和Servlet。

5.3 流程:创建JBOSS服务器,创建Web应用,发布到JBOSS服务器。

5.3.1创建JBOSS服务器:创建EJB服务器:使用Wildfly8.x服务器,默认选项创建一个服务器。

5.3.2创建Web应用:创建DynamicWeb Project,添加一个jsp页面。

//demo.jsp

<%@ pagelanguage="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

<!DOCTYPE html PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<metahttp-equiv="Content-Type" content="text/html;charset=ISO-8859-1">

<title>Insert titlehere</title>

</head>

<body>

      JSP=

      <%!

           //declear

           public int count;

           public String info(){

                 return "thisis info.";

           }

      %>

      <%

           //script

           System.out.println("thisis log");

      %>

      <!-- output -->

      <%=info()%>

</body>

</html>

5.3.3发布到JBOSS服务器:右键JBOSS服务器-》Add and Remove-》添加项目,启动服务器。

5.3.4测试:http://localhost:8080/AjaxDemo/demo.jsp

在服务器端和客户端页面均有相应输出。

 

6 方法:Tomcat调用EJB服务:Tomcat能够像普通的Java程序一样调用EJB服务。

注意:需要将jboss-client.jar添加到lib库中。

参考:

http://stackoverflow.com/questions/18520069/jndi-lookup-fails-when-connecting-from-tomcat-to-an-ejb-in-jboss-7-1-1

https://technology.amis.nl/2006/10/20/connecting-to-an-ejb-30-remote-sessionbean-from-tomcat/

6.1 目标:在Tomcat的Servlet中调用EJB服务。

6.2 原理:后台Servlet作为普通的Java类调用EJB服务,部署时需要在lib中添加jboss-client.jar库。

6.3 流程:创建EJB服务,创建Web应用,创建EJB客户端,创建Servlet调用EJB。

6.3.1创建EJB服务:参见:服务端:创建EJB工程,创建服务Bean的接口,实现此接口,发布为服务。

6.3.2创建EJB客户端:添加EJB客户端库支持,创建属性文件,引入接口文件,创建客户端类。

6.3.2.1  添加EJB支持库:jboss-client.jar,并copy到web-inf/lib目录

BuildPath-》add ExternalJARs-》JBOSS_HOME/bin/client/jboss-client.jar。

6.3.2.2  添加JBOSS服务器上下文属性:jboss-ejb-client.properties

//jboss-ejb-client.properties

remote.connections=default

remote.connection.default.host=127.0.0.1

remote.connection.default.port=8080

remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false

remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false

 

remote.connection.default.username=myNewUser

remote.connection.default.password=123456a.b

6.3.2.3  把服务端的接口copy到客户端。

//HelloWorldBeanRemote.java

package lee;

 

import javax.ejb.Remote;

 

@Remote

public interfaceHelloWorldBeanRemote {

      public String sayHello();

}

6.3.2.4  创建客户端类

//client.java

package lee;

 

import java.util.Properties;

 

import javax.naming.Context;

importjavax.naming.InitialContext;

importjavax.naming.NamingException;

 

public class Client {

 

      private static Context initialContext=null;

 

      public static Context getInitialContext() throws NamingException{

           if (initialContext == null) {

                 Propertiesproperties = new Properties();

                 properties.put(Context.URL_PKG_PREFIXES,"org.jboss.ejb.client.naming");

                 initialContext =new InitialContext(properties);

           }

           return initialContext;

      }

     

      private static HelloWorldBeanRemote doLookup() {

           // TODO Auto-generated method stub

           HelloWorldBeanRemote bean =null;

           try {

                 bean=(HelloWorldBeanRemote)getInitialContext().lookup(getLookupName()); 

           } catch (NamingException e) {

                 // TODO Auto-generated catch block

                 e.printStackTrace();

           }

 

           return bean;

      }

 

      private static String getLookupName() {

           // TODO Auto-generated method stub

           StringappName= "";

           StringmoduleName="EJBDemo";

           StringdistinctName="";

           StringbeanName="HelloWorldBean";

           StringinterfaceName="lee.HelloWorldBeanRemote";

           System.out.println("Remote="+interfaceName);

           String name ="ejb:" + appName + "/" + moduleName + "/" +distinctName    + "/" +beanName + "!" + interfaceName;

           System.out.println(name);        

           return name;

      }

 

}

6.3.3创建Servlet调用EJB

6.3.3.1  创建Servlet调用EJB:扩展HttpServet,实现Service,在Service中调用EJB服务。

//Hello.java

package lee;

 

import java.io.IOException;

import java.io.PrintWriter;

 

importjavax.servlet.ServletException;

importjavax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

 

/**

 * Servlet implementation class Hello

 */

@WebServlet("/Hello")

public class Hello extendsHttpServlet {

      private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public Hello() {

        super();

        // TODO Auto-generated constructor stub

    }

 

      /**

       * @seeHttpServlet#service(HttpServletRequest request, HttpServletResponse response)

       */

      protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

           // TODO Auto-generated method stub

        System.out.println("Hello,Servlet!");//writeto server

        //write to client

      response.setContentType("text/html");

           PrintWriter pw=response.getWriter();

           pw.println("<h1>Hello,I amServlet.</h1>");

           HelloWorldBeanRemotebean = Client.doLookup();

           System.out.println(bean.sayHello());

           pw.println("ejb="+bean.sayHello());

      }

 

}

6.3.3.2  配置web.xml生成servlet映射。

//web.xml

<?xmlversion="1.0" encoding="UTF-8"?>

<web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

      xmlns="http://xmlns.jcp.org/xml/ns/javaee"

      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

      id="WebApp_ID" version="3.1">

      <display-name>SpringWeb</display-name>

      <welcome-file-list>

           <welcome-file>index.html</welcome-file>

           <welcome-file>index.htm</welcome-file>

           <welcome-file>index.jsp</welcome-file>

           <welcome-file>default.html</welcome-file>

           <welcome-file>default.htm</welcome-file>

           <welcome-file>default.jsp</welcome-file>

      </welcome-file-list>

      <servlet>

           <servlet-name>HelloServlet</servlet-name>

           <servlet-class>lee.Hello</servlet-class>

      </servlet>

 

      <servlet-mapping>

           <servlet-name>HelloServlet</servlet-name>

           <url-pattern>/h</url-pattern>

      </servlet-mapping>

 

</web-app>

6.3.3.3  测试: http://localhost:8088/AjaxDemo/h

客户端和服务端都有相应输出。

 

7 扩展:Tomcat与JBOSS/Wildfly

参考:http://blog.csdn.net/u013573133/article/details/23379565

7.1 Tomcat与EJB

Tomcat目标是Servlet容器,不会全面支持JavaEE,能够调用EJB,但不能发布EJB服务。Tomcat的Java全面支持版本是TomEE项目(Tomcat+JavaEE)。当前一般使用OpenEJB+Tomcat来实现Tomcat发布EJB服务。

参考:http://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q21

http://qujianfeng.iteye.com/blog/793409

示例:方法:Tomcat调用EJB服务:Tomcat能够像普通的Java程序一样调用EJB服务。

7.2 JBOSS/Wildfly与Servlet

JBOSS目标是JavaEE的全面支持,对Servlet的支持使用内置的Undertow(与Jetty类似架构的Servlet容器)。

参考:http://www.2cto.com/os/201504/395201.html

示例:方法:JBOSS发布Web应用/war

0 0
原创粉丝点击