??xml version="1.0" encoding="utf-8" standalone="yes"?>
top
2.使用以下命o
ps p 14766 -L -o pcpu,pid,tid,time,tname,stat,psr | sort -n -k1 -r
其中14766是刚?中cpu占用率高的进Epid
3.2.4 32525 32537 01:58:41 ? Sl 6
0.8 32525 1771 00:43:12 ? Sl 0
0.8 32525 1769 00:39:46 ? Sl 0
0.7 32525 12324 00:33:36 ? Sl 0
0.5 32525 1772 00:27:50 ? Sl 0
0.5 32525 1768 00:25:45 ? Sl 0
0.4 32525 30760 00:19:13 ? Sl 0
0.4 32525 1773 00:22:36 ? Sl 0
0.4 32525 1770 00:20:25 ? Sl 0
0.3 32525 32385 00:00:10 ? Sl 0
0.1 32525 31668 00:00:03 ? Sl 0
0.1 32525 31667 00:00:03 ? Sl 0
0.1 32525 1790 00:07:10 ? Sl 1
其中W?个结果就是此q程中有问题的线Enid
4.通过jstack命odump出堆?/span>
"AppController_ThreadPool_L2_Pool Thread" daemon prio=10 tid=0x0000000051c2b000 nid=0x7bb3 in Object.wait() [0x000000005e3c5000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at org.company.threadpool.ThreadPoolImpl$PoolThread.run(ThreadPoolImpl.java:142)
- locked <0x00002aaca30341a8> (a org.company.threadpool.ThreadPoolImpl$PoolThread)
其中的nid是U程的编码,只不q是l过?6q制的{换?/span>
卛_q制?1776对应的十六进?0x7bb3Q定位到U程后一切好办?/span>
@XmlRootElement(name = "ReturnInfo")
@XmlType()
public class ReturnInfo<T> {
private List<T> resultList;
public List<T> getResultList() {
return resultList;
}
public void setResultList(List<T> resultList) {
this.resultList = resultList;
}
}
2.在最初测试的时候jaxbMarshaller报异常,无法扑ֈ处理泛型的办法?/p>
3.在用jaxb旉要在java bean打上@XmlSeeAlso(MultiQueryInfo.class)注释Q作用就是是在jaxbl定一个class时候可以?/p>
其他的classQ在jaxb使用多态的时候都需要用到此标签Q其中括号中可以d多个class,如@XmlSeeAlso(A.class,B.class)
4.在客L的bean中也需要用到此注释Q否则同h转换错误Q?/p>
Exception in thread "main" java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to com.jd.fms.adsettlement.client.domain.MultiQueryInfo
2.D此错误是m2eclipse插g0.12及之前的版本在Eclipse 内执行了一pd的生命周期引起冲H导致的Q如果你的maven报此c错误,而又用到了maven-resources-pluginq个插gQ那么请按你的项目pom.xml中加?/p>
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<versionRange>[1.2,)</versionRange>
<goals>
<goal>resources</goal>
<goal>testResources</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
解决冲突Q具体原因参?a >http://wiki.eclipse.org/M2E_plugin_execution_not_covered
2.通过以下方式配置spring使用groovyQ和采用java~程没有太大区别Qgroovy提供较^的从javaq来的学习曲U,下面的例子中的groovycL生生是一个javac,只不q是写在xml文g中的javacȝŞ了;
3.spring通过org.springframework.scripting.groovy.GroovyScriptFactorycd生成groovyc,׃使用到jdk的动态代理,所以所有用groovy定义的类必须实现java定义的接口,q是可以q行的关键;
4.配置spring.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:lang="http://www.springframework.org/schema/lang"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/lang
http://www.springframework.org/schema/lang/spring-lang-2.5.xsd
"
default-autowire="byName">
此文件头必不可少Q否则无法识别lang标签Q?/p>
<lang:groovy id="groovyHello" >
<lang:inline-script>
<![CDATA[
package com.jd.fms;
import com.jd.fms.netty.GroovyHelloWorld;
public class TestGroovyHelloWorld implements GroovyHelloWorld{
public void doit(){
System.out.println("hello world");
}
}
]]>
</lang:inline-script>
</lang:groovy>
采用lang:groovy定义groovy片段Q当然也可以采用
<lang:groovy id=" script-source="....">的方式引入文件?/pre>不要忘记的是在工E中定义GroovyHelloWorld的接口,该接口需要实C个doitҎ?/pre>5.目中直接通过@Autowired GroovyHelloWorld groovyHelloWorld;调用卛_Q?/pre>6.groovy为java提供了很好的动态语a能力Q如果项目没有必要用太重量U的规则引擎Q?/pre>那么使用动态语a让业务h员直接配|也不失Z个好Ҏ?/pre>
]]>
ExecutorType.BATCH, false);
session.commit();
//没有提交的数据可以回?/font>
session.close();
RESTful Web 服务使用标准?HTTP Ҏ (GET/PUT/POST/DELETE) 来抽象所?Web pȝ的服务能力,而不同的是,SOAP 应用都通过定义自己个性化的接口方法来抽象 Web 服务Q这更像我们l常谈到?RPC。例如本例中?getUserList ?getUserByName Ҏ?/p>
RESTful Web 服务使用标准?HTTP Ҏ优势Q从大的斚w来讲Q标准化?HTTP 操作ҎQ结合其他的标准化技术,?URIQHTMLQXML {,会极大提高pȝ与系l之间整合的互操作能力。尤其在 Web 应用领域QRESTful Web 服务所表达的这U抽象能力更加脓q?Web 本n的工作方式,也更加自然?/p>
同时Q用标?HTTP Ҏ实现?RRESTful Web 服务也带来了 HTTP Ҏ本n的一些优势:
HTTP 协议从本质上说是一U无状态的协议Q客L发出?HTTP h之间可以怺隔离Q不存在怺的状态依赖。基?HTTP ?ROAQ以非常自然的方式来实现无状态服务请求处理逻辑。对于分布式的应用而言QQ意给定的两个服务h Request 1 ?Request 2, ׃它们之间q没有相互之间的状态依赖,׃需要对它们q行怺协作处理Q其l果是:Request 1 ?Request 2 可以在Q何的服务器上执行Q这L应用很容易在服务器端支持负蝲q (load-balance)?/p>
HTTP ?GET、HEAD h本质上应该是安全的调用,卻IGET、HEAD 调用不会有Q何的副作用,不会造成服务器端状态的改变。对于服务器来说Q客LҎ一 URI ?n ơ的 GET、HAED 调用Q其状态与没有做调用是一LQ不会发生Q何的改变?/p>
HTTP ?PUT、DELTE 调用Q具有幂指相{特?, 卻I客户端对某一 URI ?n ơ的 PUT、DELTE 调用Q其效果与做一ơ的调用是一L。HTTP ?GET、HEAD Ҏ也具有幂指相{特性?/p>
HTTP q些标准Ҏ在原则上保证你的分布式系l具有这些特性,以帮助构建更加健壮的分布式系l?/p>
Z说明问题Q基于上面的在线用户理pȝQ我们给定以下场景:
参考一开始我们给出的用例图,对于客户?Client2Q我们只希望它能以只ȝ方式讉K User ?User List 资源Q?Client1 h讉K所有资源的所有权限?/p>
如何做这L安全控制Q?/p>
通行的做法是Q所有从客户?Client2 发出?HTTP h都经q代理服务器 (Proxy Server)。代理服务器制定安全{略Q所有经q该代理的访?User ?User List 资源的请求只hd权限Q即Q允?GET/HEAD 操作Q而像h写权限的 PUT/DELTE 是不被允许的?/p>
如果对于 RESTQ我们看看这L安全{略是如何部|的。如下图所C:
一般代理服务器的实现根?(URI, HTTP Method) 两元l来军_ HTTP h的安全合法性?/p>
当发现类gQhttp://localhost:8182/v1/users/{username}QDELETEQ这LhӞ予以拒绝?/p>
对于 SOAPQ如果我们想借助于既有的代理服务器进行安全控Ӟ会比较尴,如下图:
所有的 SOAP 消息l过代理服务器,只能看到Q?code>http://localhost:8182/v1/soap/servlet/messagerouter, HTTP POSTQ这L信息Q如果代理服务器想知道当前的 HTTP h具体做的是什么,必须?SOAP 的消息体解码Q这L话,意味着要求W三方的代理服务器需要理解当前的 SOAP 消息语义Q而这U?SOAP 应用与代理服务器之间的紧耦合关系是不合理的?/p>
众所周知Q对于基于网l的分布式应用,|络传输是一个媄响应用性能的重要因素。如何用缓存来节省|络传输带来的开销Q这是每一个构建分布式|络应用的开发h员必考虑的问题?/p>
HTTP 协议带条件的 HTTP GET h (Conditional GET) 被设计用来节省客L与服务器之间|络传输带来的开销Q这也给客户端实?Cache 机制 ( 包括在客L与服务器之间的Q何代?) 提供了可能。HTTP 协议通过 HTTP HEADER 域:If-Modified-Since/Last- ModifiedQIf-None-Match/ETag 实现带条件的 GET h?/p>
REST 的应用可以充分地挖掘 HTTP 协议对缓存支持的能力。当客户端第一ơ发?HTTP GET hl服务器获得内容后,该内容可能被~存服务?(Cache Server) ~存。当下一ơ客Lh同样的资源时Q缓存可以直接给出响应,而不需要请求远E的服务器获得。而这一切对客户端来说都是透明的?/p>
?6. REST 与缓存服务器 (Cache Server)
而对?SOAPQ情况又是怎样的呢Q?/p>
使用 HTTP 协议?SOAPQ由于其设计原则上ƈ不像 REST 那样?Web 的工作方式相一_所以,Z SOAP 应用很难充分发挥 HTTP 本n的缓存能力?/p>
?7. SOAP 与缓存服务器 (Cache Server)
两个因素军_了基?SOAP 应用的缓存机制要q比 REST 复杂Q?/p>
其一、所有经q缓存服务器?SOAP 消息L HTTP POSTQ缓存服务器如果不解?SOAP 消息体,没法知道?HTTP h是否是想从服务器获得数据?/p>
其二、SOAP 消息所使用?URI L指向 SOAP 的服务器Q如本文例子中的 http://localhost:8182/v1/soap/servlet/messagerouter
Q这q没有表辄实的资源 URIQ其l果是缓存服务器Ҏ不知道那个资源正在被hQ更不用谈进行缓存处理?/p>
在一个纯?SOAP 应用中,URI 本质上除了用来指C?SOAP 服务器外Q本w没有Q何意义。与 REST 的不同的是,无法通过 URI 驱动 SOAP Ҏ调用。例如在我们的例子中Q当我们通过
getUserList SOAP 消息获得所有的用户列表后,仍然无法通过既有的信息得到某个具体的用户信息。唯一的方法只有通过 WSDL 的指C,通过调用 getUserByName 获得QgetUserList ?getUserByName 是彼此孤立的?/p>
而对?RESTQ情冉|完全不同的:通过 http://localhost:8182/v1/users
URI 获得用户列表Q然后再通过用户列表中所提供?LINK 属性,例如 <link>http://localhost:8182/v1/users/tester</link>
获得 tester 用户的用户信息。这L工作方式Q非常类g你在览器的某个面上点L?hyperlink, 览器帮你自动定向到你想讉K的页面,q不依赖MW三方的信息?/p>
典型的基?SOAP ?Web 服务以操作ؓ中心Q每个操作接?XML 文档作ؓ输入Q提?XML 文档作ؓ输出。在本质上讲Q它们是 RPC 风格的。而在遵@ REST 原则?ROA 应用中,服务是以资源Z心的Q对每个资源的操作都是标准化?HTTP Ҏ?/p>
本文主要集中在以上的几个斚wQ对 SOAP ?REST q行了对比,可以看到Q基?REST 构徏的系l其pȝ的扩展能力要Z SOAPQ这可以体现在它的统一接口抽象、代理服务器支持、缓存服务器支持{诸多方面。ƈ且,伴随着 Web Site as Web Services 演进的趋势,Z REST 设计和实现的单性和强扩展性,有理q信,REST 会成ؓ Web 服务的一个重要架构实践领域?/p>