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