﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-rocket</title><link>http://www.blogjava.net/rocket/</link><description>走在agile的小路上
</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 00:01:47 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 00:01:47 GMT</pubDate><ttl>60</ttl><item><title>正规军的军规</title><link>http://www.blogjava.net/rocket/archive/2008/12/19/247407.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Fri, 19 Dec 2008 15:14:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/12/19/247407.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/247407.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/12/19/247407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/247407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/247407.html</trackback:ping><description><![CDATA[我发在javaeye的一个文章 http://www.javaeye.com/topic/296128 正规军的军规，现在讨论正激烈中，欢迎大家参与进来。<br />
<img src ="http://www.blogjava.net/rocket/aggbug/247407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-12-19 23:14 <a href="http://www.blogjava.net/rocket/archive/2008/12/19/247407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>roller扩展开发经验小结之xmlrpc</title><link>http://www.blogjava.net/rocket/archive/2008/07/17/215356.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Wed, 16 Jul 2008 23:23:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/07/17/215356.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/215356.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/07/17/215356.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/215356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/215356.html</trackback:ping><description><![CDATA[<p>去年10月为了满足一个客户的需求，让我开发一个教学博客系统出来，当时考虑节约成本就使用了一个比较优秀的开源博客平台来做二次开发。这个开源平台就是roller，是apache的一个项目，能收录在apache下面说明还是有两把刷子的，matrix的部落隔就是直接使用的roller，而且看到确切消息说网易的博客平台也是基于roller进行开发的。<br />
roller地址：http://roller.apache.org/<br />
现在教学博客平台已近开发完成投入使用了，而在这个过程中发现了roller确实有很多地方值得一个jee开发人员借鉴的地方，所以今天开始打算把学到的这些经验进行一下总结了。好久没写blog了，前段时间确实太忙了，事情太多了。现在打算每天挤点时间把这些经验都记录下来，不然我怕日子久了我都忘记了。<br />
首先先讲的是xmlrpc，rpc的全称是Remote Procedure Call，实际上就是为了让客户端可以轻松的对服务端的一些方法啊，过程进行调用。xmlrpc其实是一个使用xml来实现rpc的规范，使用的传输协议还是我们最熟悉的http，不同的是传输的格式是使用xml的格式来封装数据的，而不是使用html了。基于这个规范呢其实是有多种实现的，由php的，有Python的。在这里我要介绍的是roller中所使用的一个实现，依然是apache下的一个项目Apache XML-RPC：http://ws.apache.org/xmlrpc/。<br />
在roller中使用的是xmlrpc的服务段，所以下面我先介绍服务端和客户端的设置以及调用方法<br />
1、当然是把Apache XML-RPC的包引入到服务端和客户段<br />
客户端引入：xmlrpc-common.jar&nbsp; xmlrpc-client.jar<br />
服务端引入：xmlrpc-common.jar&nbsp; xmlrpc-server.jar</font></p>
<p>2、使用java的实现当然要有一个servlet了，<br />
先介绍客户端：遵循http协议，客户端针对一个url发送请求<br />
下面是相关代码<br />
import org.apache.xmlrpc.XmlRpcException;<br />
import org.apache.xmlrpc.client.XmlRpcClient;<br />
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;</p>
<p>public class RpcClient {<br />
&nbsp;&nbsp; public static void main(String[] args) throws Exception {<br />
&nbsp;XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();<br />
&nbsp;XmlRpcClient client = new XmlRpcClient();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.setServerURL(new URL("http://127.0.0.1:8088/roller-services/xmlrpc"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (MalformedURLException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.setBasicUserName("user");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.setBasicPassword("pwd");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.setEnabledForExtensions(true);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.setConnectionTimeout(60 * 1000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.setReplyTimeout(60 * 1000);</font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set configuration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.setConfig(config);</font></p>
<p>&nbsp;&nbsp; }<br />
}</font></p>
<p>再介绍服务端：服务端自然要有一个servlet来接受这个请求了<br />
在web.xml中配置servlet<br />
&lt;!--XmlRpc servlet--&gt;<br />
&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;XmlRpcServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.xmlrpc.webserver.XmlRpcServlet&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;enabledForExtensions&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;Sets, whether the servlet supports vendor extensions for XML-RPC.&lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&lt;/servlet&gt;<br />
&lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;XmlRpcServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/roller-services/xmlrpc&lt;/url-pattern&gt;<br />
&lt;/servlet-mapping&gt;<br />
这里的配置我使用的是默认的servlet，当然你也可以使用自己定义的servlet了，我的需求比较简单，所以就没有再另外定义servlet</font></p>
<p><br />
3、下面就是客户端根据需求发送自己特定的rpc请求了，比如我需要获取服务端所有的blogList<br />
客户端的调用代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object[] result = (Object[]) client.execute("blogger.getAllblogList",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
那么服务段又是如何处理这个请求的呢？上面那个servlet会把请求根据不同rpc请求转发给不同的处理器，不过由于servlet我使用的是默认的，所以分发这个动作是使用配置properties文件来实现的，这里有个不好的地方要说明的是配置文件必须在项目的/org/apache/xmlrpc/webserver/XmlRpcServlet.properties路径下，这个是Apache XML-RPC做得不好的一个地方。配置文件内容如下<br />
blogger=org.apache.roller.webservices.xmlrpc.BloggerAPIHandler<br />
metaWeblog=org.apache.roller.webservices.xmlrpc.MetaWeblogAPIHandler<br />
当服务端接受到上面客户端的请求之后，就会根据blogger到BloggerAPIHandler去调用getAllblogList这个方法。</p>
<p>4 最后一步就是给客户端回传数据了<br />
这里需要注意的是服务端一般使用的是Hashtable来对多个数据进行封装，比如：<br />
&nbsp; 　　 Hashtable result = new Hashtable();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.put("nickname", user.getUserName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.put("userid", user.getUserName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.put("email", "");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.put("lastname", lastname);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result.put("firstname", firstname);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
但是客户端在解析的时候取出来的也是一个Hashtable，然后从中取出自己需要的数据了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HashMap table = (HashMap) obj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.nickname = table.get("nickname").toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;this.userid = table.get("userid").toString();<br />
当然，最好是做一个专门的解析类来对数据进行解析了。<br />
这里需要补充说明的是，Apache XML-RPC传输的数据类型是一些预先定义好的数据类型，但是同时它也支持用户自定义的数据类型，<br />
具体可以参见：http://ws.apache.org/xmlrpc/advanced.html</p>
</font>
<img src ="http://www.blogjava.net/rocket/aggbug/215356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-07-17 07:23 <a href="http://www.blogjava.net/rocket/archive/2008/07/17/215356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不仁义，不仗义</title><link>http://www.blogjava.net/rocket/archive/2008/07/15/215041.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Tue, 15 Jul 2008 10:48:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/07/15/215041.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/215041.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/07/15/215041.html#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/215041.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/215041.html</trackback:ping><description><![CDATA[<p>又一年了，也过了我26的生日了。毕业3年了，基本上一年一个公司，大大小小参与过十几个项目了，不知道这算一个值得夸耀的经历，还是一个值得羞愧的经历。<br />
自己也知道这样频繁变动工作是不对的，作技术的需要一个好的土壤来沉淀自己，只有沉淀的够深，才能让自己飞的更高。<br />
但是当你面对生活的压力，所有曾经的豪言都变成了一个个用来嘲笑自己的笑话，这就是生活的力量，你没得选择。<br />
今年对我来说发生了不少的事情，这些事情逼迫我要告别年轻，告别幼稚。更加逼迫我要离开我苦心经营一年的team。<br />
一年以来自认为对上家公司不敢说做的漂亮，但是至少自己兢兢业业，尽我所能来做好事情，也希望能够帮助公司一起强大起来。<br />
客观来说，我的上家公司整体实力一般，属于一个小作坊式的公司，一共也就20人左右，开发的占据一般，剩下的是销售和技术支持。当初之所以选择这家公司是面试时感觉到这家公司的技术实力还是不错的（一个项目有3个七年以上工作经验的工程师），而且所做的产品也有一定的市场潜力。进入公司的一年多时间里也确实跟，两个老大和一个架构师学习到了很多东西。而且两个老大也很信任我，这一年里让我尝试了很多agile相关的实践。所以直到离开我一直都对两个老大都很感恩的。<br />
感恩说完了，下面就说一下这个标题的事情了。<br />
这位不仁义，不仗义的主角是我们这个部门所谓的执行老总。之前发生的很多种种我也就不说了，就说说在我离职这个事情上发生的让人生气的事情。在离职前，老大和我说要我把一个项目收尾了再走，站好最后一班岗也一直是我的一个信条。但是在收尾的这段时间里，我因为要忙一些私人的事情，所以不得不经常请事假。问题就是由于这些假引起的。我是07年3月入的公司，到08年6月准备离职。我原本的意思是我想用年假来顶替我这段时间请的事假，结果得到的答复是必须要工作满08年才能休年假。但是我也没有争执这个事情，我想我在公司干了一年多了，平时加班很多，有些有记录的，有些没记录的，最终应该会念点情面把这些事假不计算了。可惜我太高看我们这个自己每天满口仗义的老总了，在没有和我任何商量的情况下，很果断的扣除了我1.5天的工资。走的那天因为这个事情不爽，我就把这个事情抖了出来在全公司说了一遍，结果第二天她还很牛的打电话问我为什么在公司说这个事情，而且还一副很有理的样子找我老大来和我对问有哪天的加班没有给我算。面对这样一个人，我彻底无奈，我之前只是觉得她这么做合理但不合情，给你卖命这么久了，做事不能这么绝情，想不到她还和我较上劲了。那我还真要钻一下这个牛角尖呢。我专门去查了劳动法，而且还问了其他两个深圳公司的hr朋友。劳动法中明确规定：<br />
<br />
2008年1月1日实施的《职工带薪年休假条例》(国务院令第514号)： <br />
第二条　机关、团体、企业、事业单位、民办非企业单位、有雇工的个体工商户等单位的职工连续工作1年以上的，享受带薪年休假（以下简称年休假）。单位应当保证职工享受年休假。职工在年休假期间享受与正常工作期间相同的工资收入。 <br />
<br />
第三条　职工累计工作已满1年不满10年的，年休假5天；已满10年不满20年的，年休假10天；已满20年的，年休假15天。国家法定休假日、休息日不计入年休假的假期。<br />
<br />
所以所谓的工作满08年才能休年假的说法是不符合法律的，所以在这里也算是经验总结下来给各位技术高手，我们不能总是埋头钻研技术，这些和自己利益密切相关的法律必须熟悉，不然就会被不仁义不仗义的人给糊弄了。<br />
<br />
附：这个事情我不会善罢甘休的，这1.5天我一定要要回来。</p>
<img src ="http://www.blogjava.net/rocket/aggbug/215041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-07-15 18:48 <a href="http://www.blogjava.net/rocket/archive/2008/07/15/215041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个以前没有注意的问题：java构造函数的执行顺序</title><link>http://www.blogjava.net/rocket/archive/2008/05/27/203165.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Tue, 27 May 2008 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/27/203165.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/203165.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/05/27/203165.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/203165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/203165.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) <br>特地做了一些尝试然后把java构造器的执行顺序整理出来.&nbsp;&nbsp;<a href='http://www.blogjava.net/rocket/archive/2008/05/27/203165.html'>阅读全文</a><img src ="http://www.blogjava.net/rocket/aggbug/203165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-27 11:43 <a href="http://www.blogjava.net/rocket/archive/2008/05/27/203165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个优良用户故事的6个特性 - INVEST 模式（翻译）</title><link>http://www.blogjava.net/rocket/archive/2008/05/26/202981.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Mon, 26 May 2008 09:09:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/26/202981.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/202981.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/05/26/202981.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/202981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/202981.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文来自http://agilesoftwaredevelopment.com/blog/vaibhav/good-user-story-invest,在google时偶然发现的这个网站,里面的东西都很不错,喜欢敏捷的朋友可以去看看了.<br>一直以来有很多人都在问我用例和用户故事究竟有什么区别,我想这片文章关于用户故事的6个特性就是最好的回答了.<br>原文不是很难,我就顺手的给翻译了,有翻译不对的地方还请大家及时指正.&nbsp;&nbsp;<a href='http://www.blogjava.net/rocket/archive/2008/05/26/202981.html'>阅读全文</a><img src ="http://www.blogjava.net/rocket/aggbug/202981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-26 17:09 <a href="http://www.blogjava.net/rocket/archive/2008/05/26/202981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>感慨于我们的技术土壤</title><link>http://www.blogjava.net/rocket/archive/2008/05/25/202709.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Sun, 25 May 2008 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/25/202709.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/202709.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/05/25/202709.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/202709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/202709.html</trackback:ping><description><![CDATA[最近工作不是很忙，就花时间在各个技术社区转了转。<br />
最大的感触就是我们的技术土壤真的很肥沃，各个社区都有踊跃的参与者，和耐心的解答者。这种踊跃和耐心将对我们的技术环境有很好的沉淀作用。只有这种良性的沉淀才能让中国的技术绽放美丽的创新之花。<br />
不过同时，我也发现了一些浮躁的用心不纯的踊跃参与者，他们来这些社区好像就是为了排名和点击率，所发的大部分文章都是抄袭而来，而且抄袭还不做转载说明，利用抄袭的效率来换取名气，然后利用名气开始笼络人气，笼络人气的最终目的是为了寻找可以给自己带来利益的项目和点子，此等用心叵测之人也真难为他来做技术了。<br />
我只希望来技术社区的朋友们都是保持自己的纯，我们来这里是为了学习，讨论，分享的。中国的技术需要的是脚踏实地踏踏实实，一步一个脚印。你可以发表不是很成熟的观点，若是不完整大家可以补充，若是错误的大家可以帮你纠正，但是你要是就是天天看别人的文章然后一字不改的copy过来赚眼球，那么恕我直言，你在浪费我们的互联网资源。哪怕你把对方的文章重新整理一下，加上自己的实际见解这都是会让我们竖起大拇指的，因为你在这个知识的传递过程中创造了价值。<br />
最后，我觉得我们所有做技术的人都应该再次真诚的感谢我们技术社区的原创作家，有了大家中国的技术才能踏踏实实越飞越高。
<img src ="http://www.blogjava.net/rocket/aggbug/202709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-25 13:13 <a href="http://www.blogjava.net/rocket/archive/2008/05/25/202709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>敏捷项目管理之探索阶段做法</title><link>http://www.blogjava.net/rocket/archive/2008/05/25/202706.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Sun, 25 May 2008 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/25/202706.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/202706.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/05/25/202706.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/202706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/202706.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 探索阶段实际上就是我们所谓的实现阶段了，敏捷对于这个阶段的定位与瀑布不同，瀑布认为探索阶段其实就是按照原定计划固定实现过程的阶段，但是实际上对于软件这种脑力工程，是没有办法和造房子一样按部就班的实现的。多少年来把建筑工程经验错误的应用到了软件工程之上，让我们一直忽略了一个本质问题：做软件是一个摸石头过河的过程。&nbsp;&nbsp;<a href='http://www.blogjava.net/rocket/archive/2008/05/25/202706.html'>阅读全文</a><img src ="http://www.blogjava.net/rocket/aggbug/202706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-25 12:28 <a href="http://www.blogjava.net/rocket/archive/2008/05/25/202706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>敏捷项目管理之推测阶段做法 </title><link>http://www.blogjava.net/rocket/archive/2008/05/24/202534.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Sat, 24 May 2008 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/24/202534.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/202534.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/05/24/202534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/202534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/202534.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要: 敏捷方法把项目分为3个主要阶段：构想阶段，推测阶段，探索阶段。每个阶段都有自己的目标和过程方法。分清各个阶段的行为，将会更好的掌控项目的进度。&nbsp;&nbsp;<a href='http://www.blogjava.net/rocket/archive/2008/05/24/202534.html'>阅读全文</a><img src ="http://www.blogjava.net/rocket/aggbug/202534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-24 09:08 <a href="http://www.blogjava.net/rocket/archive/2008/05/24/202534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>敏捷项目管理之构想阶段做法</title><link>http://www.blogjava.net/rocket/archive/2008/05/23/202353.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Fri, 23 May 2008 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/23/202353.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/202353.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/05/23/202353.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/202353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/202353.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 敏捷方法把项目分为3个主要阶段：构想阶段，推测阶段，探索阶段。每个阶段都有自己的目标和过程方法。分清各个阶段的行为，将会更好的掌控项目的进度。&nbsp;&nbsp;<a href='http://www.blogjava.net/rocket/archive/2008/05/23/202353.html'>阅读全文</a><img src ="http://www.blogjava.net/rocket/aggbug/202353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-23 11:32 <a href="http://www.blogjava.net/rocket/archive/2008/05/23/202353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DEV2DEV TECHDAYS SOA 体会二</title><link>http://www.blogjava.net/rocket/archive/2008/05/22/202279.html</link><dc:creator>rocket</dc:creator><author>rocket</author><pubDate>Thu, 22 May 2008 14:52:00 GMT</pubDate><guid>http://www.blogjava.net/rocket/archive/2008/05/22/202279.html</guid><wfw:comment>http://www.blogjava.net/rocket/comments/202279.html</wfw:comment><comments>http://www.blogjava.net/rocket/archive/2008/05/22/202279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rocket/comments/commentRss/202279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rocket/services/trackbacks/202279.html</trackback:ping><description><![CDATA[<p><font style="background-color: #cce8cf">面向服务的8个原则<br />
服务可复用 不管是否存在即时复用的机会，服务被设计为支持潜在可复用。<br />
服务共享一个正式契约 为了与服务交互，只需要共享描述每个服务信息交换术语定义的正式契约。<br />
服务是松散耦合的 服务被设计为无需紧密的、跨服务的依赖而交互。<br />
服务是底层逻辑的抽象 只有经由服务契约所暴露的部分服务对于外部世界是可见的。契约之外所表达的底层逻辑是不可见的，且与服务请求者无关。<br />
服务是可组合的 服务可能组合其他服务。这允许表示不同粒度的逻辑，并促进复用及抽象层的创建。<br />
服务是自治的 逻辑由服务所控制，并位于一个清晰的边界内。服务已经在这个边界内被控制，并且不依赖于执行其控制的其他服务。<br />
服务是无状态的 服务应当不需要管理状态信息，因此能够其维持松耦合性。服务应当尽可能设计成无状态的，即便这意味着要将状态管理移至别处。<br />
服务是可发现的 服务应当允许其描述被发现，并被人工和可能会利用其逻辑的服务请求者所理解。<br />
这个8个面向服务的原则乍看很像我们熟悉的OOP啊，不过如果你把一个服务抽象成一个对象来看的话也就不难理解了。<br />
下面介绍一下依据这8个原则构建的SOA的各个服务层： <br />
1、连通性服务层<br />
所谓的连通性是指对于原有系统的数据连通，由于原有系统不能提供一个具有通用性的数据服务，所以在连通性服务层的主要任务就是负责把原来已有的JDBC的，EJB的，webService的各种数据服务，封装成具有统一标准的java pojo控件，然后其它的就可以方便，简单的实现对数据服务的调用。<br />
连通性服务层：<br />
服务对象：需要获得数据的对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如业务层、表示层等<br />
提供服务：可以操作原有系统的数据层&nbsp;&nbsp; 如对一个sap服务器进行操作、对一个DB服务器进行操作邓<br />
调用资源：原有系统的数据服务接口&nbsp;&nbsp;&nbsp;&nbsp; 如EJB、Hibernate，JDBC等<br />
图1：<img height="326" alt="" src="http://www.blogjava.net/images/blogjava_net/rocket/ConnectService.png" width="425" border="0" /><br />
在这里值得一提的是bea在使用workshop对于连通性服务层创建，非常简单，完全图形化的方式，只需简单的鼠标拖曳，就可以实现服务控件的建立。<br />
2、业务流程服务层<br />
我们知道一般的业务系统都会有一些自由的业务流程的，那么如何让这些原有的业务流程来提供给SOA系统使用呢？<br />
在bea专家给我们演示的demo中，我看到bea的做法是把每一个流程节点封装成了服务，这样，这些流程节点每个都可以成为一个向外提供服务的服务者了。<br />
业务流程服务层：<br />
服务对象：需要流程控制的对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如其他业务层，表示层等<br />
提供服务：业务流程控制&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如从a入口进入后是应该去b节点还是应该去c节点<br />
调用资源：通常是连通性服务层的服务&nbsp;&nbsp; <br />
图2：<img alt="" src="http://www.blogjava.net/images/blogjava_net/rocket/BusinessBus.png" border="0" /><br />
在bea演示的时候对于业务流程服务层的构建依然采用的是图形化的方式，这里值得称道的是在使用图形化的过程中，bea的工具还可以支持对于服务的格式转换<br />
3、服务中介层&nbsp;&nbsp; <br />
上面已经介绍了两种服务层了，在soa中这两层的调用不是简单的上下层关系。在实际项目中，也许有的需求是需要流程控制的，但是也许有些需求是直接要求展示数据的，那么如何处理这两种的需求呢。这里就是在soa中最重要的一个层了，服务中介层。很多人应该听过soa中service bus这个概念。我之前一直理解为服务总线仅仅是为客户端提供服务的，其实是不对的，实际上服务总线是一个用了穿起来各个服务层的，就好比是一个糖葫芦，服务中介层就是中间的那根棍子。<br />
图3：<img height="338" alt="" src="http://www.blogjava.net/images/blogjava_net/rocket/serviceBus.png" width="725" border="0" /><br />
做为服务中介层来说，主要有两种服务，一种是应用服务；另外一个是代理服务，用来对应用服务进行代理封装的，是服务总线中向外暴露的服务。<br />
4、表示层服务层<br />
表示层服务主要和不同的客户端有关，bea在这里的讲述中由于时间紧张所以比较简单。重点还是在演示他们可视化得页面编辑。但是这里有点给我洗脑得就是，对于不同的客户端所提供的服务是直接可以使用的，比如判断一个用户名是否合法，表示层服务不是返回的true，false，而是直接返回，&#8220;该用户名可用&#8221;，&#8220;该用户名已被占用&#8221;这样的字符串。<br />
关于表示层我就不再画图了，最后是一个整体的soa层次结构图：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/rocket/SOA.jpg" border="0" /><br />
</font></p>
<p><font style="background-color: #cce8cf"><br />
</font>&nbsp;</p>
<img src ="http://www.blogjava.net/rocket/aggbug/202279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rocket/" target="_blank">rocket</a> 2008-05-22 22:52 <a href="http://www.blogjava.net/rocket/archive/2008/05/22/202279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>