- 浏览: 1844128 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (665)
- 闲话 (17)
- ruby (1)
- javascript (40)
- linux (7)
- android (22)
- 开发过程 (11)
- 哥也读读源代码 (13)
- JVM (1)
- ant (2)
- Hibernate (3)
- jboss (3)
- web service (17)
- https (4)
- java基础 (17)
- spring (7)
- servlet (3)
- 杂记 (39)
- struts2 (10)
- logback (4)
- 多线程 (2)
- 系统诊断 (9)
- UI (4)
- json (2)
- Java EE (7)
- eclipse相关 (4)
- JMS (1)
- maven (19)
- 版本管理 (7)
- sso (1)
- ci (1)
- 设计 (18)
- 戒烟 (4)
- http (9)
- 计划 (4)
- HTML5 (3)
- chrome extensions (5)
- tomcat源码阅读 (4)
- httpd (5)
- MongoDB (3)
- node (2)
最新评论
-
levin_china:
勾选了,还是找不到
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
我用的maven-3.5.0,还没有遇到这种情况,使用jar ...
用spring annotation声明的bean,当打包在jar中时,无法被扫描到 -
GGGGeek:
受益匪浅,从组织项目结构,到技术细节,讲的很到位,只是博主不再 ...
一个多maven项目聚合的实例 -
Aaron-Joe-William:
<?xml version="1.0" ...
hibernate逆向工程 -
li272355201:
http://archive.apache.org/dist/ ...
tomcat源码阅读(一)——环境搭建
我们的应用,包含若干个子系统,运行完部署脚本,会打出若干个war包,部署在同一个jboss里
子系统之间有接口,是通过web service来互相调用的。我昨天突然想到,既然这些应用都是跑在同一个jboss里的,那就是同处一个进程,为什么不能直接互相调用呢
下面就开始一步步做试验,首先我在tomcat里,部署了3个应用,分别是Spring、AnotherServlet、ThirdServlet,用jps命令,可以看到只有一个进程
1800是我的eclipse,5404就是tomcat进程,用jconsole连进去看线程
都是tomcat内部的一些线程,以及等待处理HTTP请求的work thread(http-bio-8080-exec-x)
以上证明了,无论多少个应用(我这里部署了3个),都是在同一个进程里的,也就是共享了内存区域,所以从理论上说,互相调用是有可能实现的
然后就做一下试验,我在AnotherServlet里创建一个类
然后在spring工程里,用反射的方法,试图在运行时创建这个类的实例
结果果然报了ClassNotFoundException:
java.lang.ClassNotFoundException: net.kyfxbl.jbosstest.TestRemoteInvoke
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
附带一提,这里用反射,是为了避免编译期编译不通过。
如果用new的方式来创建
就无法通过编译,当然可以通过把AnotherServlet设置为关联工程的方式,使编译通过
不过这样只是通过编译而已,运行时效果是一样的,同样是ClassNotFoundException,因为打出的war包里,是不包含这个类的
想了一下,应该是跟servlet容器启动时的ClassLoader机制有关,不同工程的.class,应该是互相隔离的,所以虽然同处一个进程,但是却是没有办法互相调用的
有一个办法,如果能得到源码的话,可以将源码拷贝到工程里,这样在打war包时,就会把需要的类也打进去了。这也是最低层次的共享,即“代码重用”
如果得不到源码,但是可以得到jar包的话,可以将jar包放到WEB-INF/lib目录下,这样的话也可以获取到所需的类,这种方式比直接的“代码重用”高级一点,即“二进制重用”。平时我们引入各种jar包,也都属于这种方式
如果源码和jar包都得不到,那就只能用更高层次的重用方法,即所谓的“服务重用”。用这种方式,服务提供方的类,是完全私有的,外部完全不可见。通过“某种方式”,暴露一个接口给服务使用方,服务使用方按照接口的规定,来调用隐藏的具体实现。
暴露接口的方式,可以有很多种。
最常见的就是web service。比如说,前几年挺火的SaaS概念,就是这种方式。比如我是一个金融公司,开发了一套股价走势预测系统,并开放API,让其他的应用来调用。那么我肯定是不能把源码给出来的,二进制文件也不能给(因为存在被反编译的风险),那这个时候我就在互联网上开放一个web service,需要的客户端就调用这个web service,我内部处理之后,用soap返回结果,中间可以校验、鉴权、计费什么的
另外一种是山寨版web service,比如开放一个servlet地址,http://ip:port/myService/method1.do,然后告知用户这个地址可以接受哪些参数,用户调这个地址,通过http response返回结果。这种思想实际上和web service是一样的,只是通用性比较差点,编程也比较麻烦
此外还有类似的RMI方法,在客户端开发Stub,在服务端提供具体实现。同样的,客户端也是需要得到具体实现的接口才可以
android开发里也有类似的情况,即IPC(跨进程调用),通过AIDL,将自己的服务发布出去
总的来说,本文说的是关于“重用”的话题:
最低层次的重用,是“代码重用”。这种方式局限性最大,共享的难度也最大
高级一点是“二进制重用”,但这种方式是无法跨平台的,并且存在安全性的隐患,而且服务提供方的修改,无法及时传递给服务使用者(需要重新编译发布)
最高级的是“服务重用”,这种方式具备了即时性,跨平台的优点。但是一定要保证接口的稳定,如果接口发生了变化,那需要通知到所有的客户端。不过这种方式依赖网络,可能是局域网,也可能是互联网,但服务提供方和使用方之间,必须保证网络的连通性
子系统之间有接口,是通过web service来互相调用的。我昨天突然想到,既然这些应用都是跑在同一个jboss里的,那就是同处一个进程,为什么不能直接互相调用呢
下面就开始一步步做试验,首先我在tomcat里,部署了3个应用,分别是Spring、AnotherServlet、ThirdServlet,用jps命令,可以看到只有一个进程
1800是我的eclipse,5404就是tomcat进程,用jconsole连进去看线程
都是tomcat内部的一些线程,以及等待处理HTTP请求的work thread(http-bio-8080-exec-x)
以上证明了,无论多少个应用(我这里部署了3个),都是在同一个进程里的,也就是共享了内存区域,所以从理论上说,互相调用是有可能实现的
然后就做一下试验,我在AnotherServlet里创建一个类
然后在spring工程里,用反射的方法,试图在运行时创建这个类的实例
try { Class.forName("net.kyfxbl.jbosstest.TestRemoteInvoke") .newInstance(); } catch (Exception e) { e.printStackTrace(); }
结果果然报了ClassNotFoundException:
java.lang.ClassNotFoundException: net.kyfxbl.jbosstest.TestRemoteInvoke
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
附带一提,这里用反射,是为了避免编译期编译不通过。
如果用new的方式来创建
TestRemoteInvoke test = new TestRemoteInvoke();
就无法通过编译,当然可以通过把AnotherServlet设置为关联工程的方式,使编译通过
不过这样只是通过编译而已,运行时效果是一样的,同样是ClassNotFoundException,因为打出的war包里,是不包含这个类的
想了一下,应该是跟servlet容器启动时的ClassLoader机制有关,不同工程的.class,应该是互相隔离的,所以虽然同处一个进程,但是却是没有办法互相调用的
有一个办法,如果能得到源码的话,可以将源码拷贝到工程里,这样在打war包时,就会把需要的类也打进去了。这也是最低层次的共享,即“代码重用”
如果得不到源码,但是可以得到jar包的话,可以将jar包放到WEB-INF/lib目录下,这样的话也可以获取到所需的类,这种方式比直接的“代码重用”高级一点,即“二进制重用”。平时我们引入各种jar包,也都属于这种方式
如果源码和jar包都得不到,那就只能用更高层次的重用方法,即所谓的“服务重用”。用这种方式,服务提供方的类,是完全私有的,外部完全不可见。通过“某种方式”,暴露一个接口给服务使用方,服务使用方按照接口的规定,来调用隐藏的具体实现。
暴露接口的方式,可以有很多种。
最常见的就是web service。比如说,前几年挺火的SaaS概念,就是这种方式。比如我是一个金融公司,开发了一套股价走势预测系统,并开放API,让其他的应用来调用。那么我肯定是不能把源码给出来的,二进制文件也不能给(因为存在被反编译的风险),那这个时候我就在互联网上开放一个web service,需要的客户端就调用这个web service,我内部处理之后,用soap返回结果,中间可以校验、鉴权、计费什么的
另外一种是山寨版web service,比如开放一个servlet地址,http://ip:port/myService/method1.do,然后告知用户这个地址可以接受哪些参数,用户调这个地址,通过http response返回结果。这种思想实际上和web service是一样的,只是通用性比较差点,编程也比较麻烦
此外还有类似的RMI方法,在客户端开发Stub,在服务端提供具体实现。同样的,客户端也是需要得到具体实现的接口才可以
android开发里也有类似的情况,即IPC(跨进程调用),通过AIDL,将自己的服务发布出去
总的来说,本文说的是关于“重用”的话题:
最低层次的重用,是“代码重用”。这种方式局限性最大,共享的难度也最大
高级一点是“二进制重用”,但这种方式是无法跨平台的,并且存在安全性的隐患,而且服务提供方的修改,无法及时传递给服务使用者(需要重新编译发布)
最高级的是“服务重用”,这种方式具备了即时性,跨平台的优点。但是一定要保证接口的稳定,如果接口发生了变化,那需要通知到所有的客户端。不过这种方式依赖网络,可能是局域网,也可能是互联网,但服务提供方和使用方之间,必须保证网络的连通性
发表评论
-
classloader举个例子
2013-09-23 22:13 1215今天下午被一个同事问起,什么情况下需要用到ContextCla ... -
存储配置
2013-09-05 03:31 1755以前主要都在搞应用开 ... -
关于网络分层,和网络安全的一些总结
2013-08-03 22:25 1371最近半个月,把《计算机网络》看完了 看完主要有一个疑问,就是 ... -
虚拟化的价值
2013-07-26 02:53 1133虚拟化技术的萌芽非常早。在大型机时代,一台硬件只能同时运行一个 ... -
Base64
2013-07-16 00:07 1645Base64是一种编码的算法 ... -
域名与主机名
2013-07-08 00:55 1313域名是domain name 主机名是hostname qq ... -
oracle实例、schema,以及多租户方案
2013-06-28 22:15 5266写这篇博客的起源,是 ... -
好帖转载
2013-06-27 14:37 1074公式引擎重写:http://damienkatz.net/20 ... -
关于分布式和集群,再补充2句
2013-06-18 00:31 1461一、分布式定义 今晚翻论坛,想看看别人是怎么说的,一路把20 ... -
为什么要用多线程
2013-06-17 22:01 6680以前我认为多线程的作 ... -
集群、分布式、性能
2013-06-15 14:41 1285性能是一个多方面综合的结果,遵循短板理论。系统中任何一个部分成 ... -
在浏览器里启动本地应用
2013-03-04 17:15 3240受限于javascript的安全问题,一般来说在浏览器里是不允 ... -
什么是SPI
2013-02-02 06:39 1630我理解SPI就是一种“服务发现机制” 很多规范里,都既包括A ... -
设置与查询事务隔离级别
2013-01-23 23:46 1559详情见:http://xm-king.iteye.com/bl ... -
事务小结
2013-01-23 22:01 1215最近在看jdbc specification,昨天刚看到cha ... -
api和spi,oracle的jdbc驱动为什么不开源
2013-01-22 06:03 2198今天下班后在看jdbc的规范,一不小心又走神,胡思乱想起来 ... -
系统集成的2种方式
2013-01-22 05:44 1469我以前是不是写过一篇类似的东西,说系统集成的 今天做一个别的 ... -
关于JCP
2013-01-22 05:04 1383今天上JCP去下载jdbc的规 ... -
JAVA平台几个主要的开源组织
2012-12-29 08:03 1371apache基金会,这个最有名,应该谁都知道了 eclips ... -
我对协议的理解
2012-12-05 07:12 1162今天工作进展不佳~~回来路上还在胡思乱想,突然想到一个对“协议 ...
相关推荐
在IT行业中,动态链接库(DLL)是一种非常重要的软件组件...总之,多个DLL互相调用虽然带来了功能复用和灵活性,但也引入了额外的挑战。通过合理的规划、设计和测试,可以确保这些DLL协同工作,实现"完美"的相互调用。
它不仅简化了代码结构,提高了代码的重用性,还使得程序的维护和扩展变得更加容易。通过合理利用对象、方法和事件监听器,开发者可以构建出高度动态且响应迅速的应用程序,无论是游戏、桌面应用还是网页服务。掌握这...
总结来说,Delphi的动态链接库封装窗体与调用是一项实用的技术,它允许开发者将复杂的用户界面和逻辑封装在DLL中,使得应用程序能够灵活地扩展功能,同时保持代码的模块化和重用性。通过正确理解和运用这一技术,...
类与类之间的调用是程序设计中的核心概念,用于实现不同对象间的交互和功能复用。桂林电子科技大学的老师通过一个实例来帮助学生理解这个概念,我们将详细探讨以下几个关键知识点: 1. **类的定义**:在C#中,类是...
在使用ThinkPHP框架开发Web应用时,合理地重用代码可以大大提升开发效率和维护的便捷性。其中一个需要掌握的技能就是控制器之间的相互调用。ThinkPHP提供了一个名为A()的函数,它允许开发者在控制器间调用其他控制器...
这样做的好处包括提高代码的可维护性、重用性和团队协作效率。 1. **Maven多模块项目**:Maven的多模块项目允许我们将大型应用拆分为多个子项目,每个子项目都是一个独立的Maven模块,有自己的`pom.xml`文件。这些...
COM是微软提出的一种二进制标准,它允许不同语言之间互相调用方法和属性,实现跨语言的组件重用。Outlook提供了名为`Outlook.Application`的COM对象,通过这个对象,我们可以访问Outlook的各种功能。 在Delphi中,...
在C++编程中,COM(Component Object Model)组件是一种用于创建可重用软件组件的技术,它允许不同应用程序之间共享代码和服务。本篇文章将详细讲解如何在C++的对话框工程中调用COM组件,以及如何处理OCX库的使用。 ...
它允许开发者创建可重用的软件组件,并在不同的应用程序之间共享这些组件。COM组件是二进制兼容的,可以跨进程甚至跨网络进行通信。通过接口和代理机制,COM使得不同语言编写的应用程序能够互相协作。COM的核心概念...
7. **错误处理**:在LabVIEW中,要处理DLL调用可能出现的错误,如找不到DLL、调用失败等,确保程序的健壮性。 8. **性能优化**:根据需求,可能需要考虑DLL的缓存策略、并发调用和多线程处理,以提高图像处理的效率...
COM的核心理念是提供一个标准的二进制接口,使得不同程序之间能够互相调用服务,实现跨语言、跨进程的通信。潘爱民编著的《COM原理与应用》一书深入浅出地讲解了这个关键的技术。 首先,书中详细阐述了COM的基本...
分布式多层架构通过引入应用程序服务器来提高开发效率、降低重复开发成本和增加应用的可重用性。应用程序服务器是包含企业逻辑的企业应用程序,通常使用COM/DCOM、CORBA等组件封装企业逻辑代码。这些封装后的对象被...
COM(Component Object Model)是一种微软开发的技术,用于创建可重用的软件组件,可以在不同的应用程序之间无缝通信。它提供了一种标准的接口,使得不同语言编写的组件可以互相交互。在本示例中,我们将讨论如何在...
1. **项目模板选择**:不同类型的项目模板适用于不同的应用场景,例如Windows控件库用于创建可复用的UI控件,Windows应用程序则用于开发桌面应用,ASP.NET Web应用程序适合动态网页开发,类库可以创建可重用的组件,...
- **Web Services 定义**:Web Services 是一组遵循特定标准(如 SOAP、XML、WSDL)的技术集合,用于实现不同系统间的互操作性。 - **关键技术**: - SOAP:简单对象访问协议,用于交换 XML 编码的信息。 - WSDL...
COM组件,全称为Component Object Model,是微软推出的一种软件组件模型,它定义了一种标准,使得不同编程语言编写的对象可以互相通信,实现组件的复用和互操作性。COM组件是Windows平台下广泛使用的软件构造块,...
而CORBA(Common Object Request Broker Architecture)则是一种跨平台的ORB标准,它允许不同语言和操作系统上的对象互相协作,实现了分布式对象的互操作性。 COM(Component Object Model)和DCOM(Distributed ...
Silverlight与WCF之间的通信是Web应用...分层结构的采用有助于将UI、业务逻辑和数据访问分离,提高代码的可维护性和重用性。在实际开发中,还需要考虑性能优化、安全策略以及跨域问题,确保应用的稳定性和用户体验。