<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JavaEye博客</title>
    <description>Java博客,Ruby on Rails博客,AJAX博客,Agile博客 -- JavaEye做最棒的软件开发交流社区</description>
    <link>http://www.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>对一则数据库设计的经验谈</title>
        <author>cuisk0328@eyou.com</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mydesignmail-163-com.javaeye.com">cuisk0328@eyou.com</a>&nbsp;
          链接：<a href="http://mydesignmail-163-com.javaeye.com/blog/230998" style="color:red;">http://mydesignmail-163-com.javaeye.com/blog/230998</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我去年中旬负责了一个电子政务的项目，项目从2006年底进行开发，经历了1期和2期，对于1期的开发自己是主要的编码人员，2期自己负责项目，架构是 osworkflow（其他公司的产品）,struts+spring+hibernate,prototype,用到都是现在比较成熟的开源技术，不过其实开源给与我们带来了很大的隐患和烦恼，这个项目是jboss作为web服务器，数据库的用的sql server,用到了集群和负载均衡技术。<br />    <br />    从去年到今年年初运行很稳定，基本没有发生什么异常状况，但是到了年后，由于年前在原来的基础上，有上了20个流程，4大模块，使得web服务器和数据库服务器的压力增大，经常会发生内存溢出，首页面白板，宕机的状况。<br /><br />    当时我手底下的人都被分配到了其他的项目组，我们公司没有固定的项目组成员，一个项目中途都可以调走人，所以自己也习惯了，这个时候就是自己对项目进行优化和性能提高的时候。<br />    <br />    这里给大家说的是一个数据库设计的问题，其他如jboss内存溢出，数据库分区优化，数据库索引优化以后将陆续为大家展开，当然这只是自己的经验之谈，很多地方肯定有不对的地方，望大家指出。<br /><br />   这个项目有一个模块是 公告信息，并且涉及到 每个用户是否察看过 公告信息，没有察看会有new图标，察看过了new会消失，当时设计的时候遵循了数据库的范式，因为该项目用户大概300人，每天的发布的公告信息大概有30多个，公告信息的业务表 增长不大，而中间的查看信息表每天大概300*30地记录递增，因为运行了1年多，大概产生了4000000记录，级联查询语句查询每个人的消耗sql 的资源时间是 10多秒，表结构如上传的图片，为此把标示表干脆省下来，在业务表加上state字段，初始化的时候存储了所有用户得id信息，当用户看过该条公告，id就删除，虽然违背了数据库设计的范式要求，但是确实提升了性能。<br /><br />    其实有一个问题我现在也很奇怪，就是微软在sql server引擎的设计上，该项目的数据库服务器 4g得内存，sql server 在运行1个月的时候，会战用1.7--1.9g的内存容量，i/o成为了数据库的性能最大的瓶颈，当时自己还找了probe,和loadrunner进行了测试，没有发现连接池没有关闭的问题。查询资料。上面说，微软在设计上就是这样，令我很疑惑。也望大家给与意见。<br />[img][/img]
          <br/>
          <span style="color:red;">
            <a href="http://mydesignmail-163-com.javaeye.com/blog/230998#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 10:47:47 +0800</pubDate>
        <link>http://mydesignmail-163-com.javaeye.com/blog/230998</link>
        <guid>http://mydesignmail-163-com.javaeye.com/blog/230998</guid>
      </item>
      <item>
        <title>ORACLE如何实现ID自动增长</title>
        <author>loving863</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jinguo.javaeye.com">loving863</a>&nbsp;
          链接：<a href="http://jinguo.javaeye.com/blog/230994" style="color:red;">http://jinguo.javaeye.com/blog/230994</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          create  sequence TBL_PIC_PRODUCT_SEQ<br />minvalue 1<br />maxvalue 9999999999999999999999999999<br />start with 1<br />increment by 1<br />cache 20;<br /><br />create or replace trigger TBL_PIC_PRODUCT_TRIG before insert on TBL_PIC_PRODUCT<br />referencing old as old new as new<br />for each row<br />declare next_id number;<br />begin<br />    select<br />        TBL_PIC_PRODUCT_SEQ.nextval<br />    into<br />        next_id<br />    from<br />        dual;<br /><br />    :new.info_id:=next_id;<br />end;<br />/<br /><br /><br />---------------<br />--建立序列   <br />  create   sequence   seq_name   <br />  increment   by   1   <br />  start   with   1   <br />  maxvalue   99999999   <br />  nocycle   <br />  cache   10   <br />    <br />  --调用:   <br />  insert   into   table(id,name)   values(seq_name.nextval,yourname);<br /><br />-----------<br />第一步：创建SEQUENCE   <br />  create   sequence   s_country_id   increment   by   1   start   with   1   maxvalue   999999999;   <br />  第二步：创建一个基于该表的before   insert   触发器，在触发器中使用该SEQUENCE   <br />  create   or   replace   trigger   bef_ins_t_country_define   <br />  before   insert   on   t_country_define   <br />  referencing   old   as   old   new   as   new   for   each   row   <br />  begin   <br />  select   s_country_id.nextval   into   :new.country_id   from   dual;   <br />  end;   <br />  /
          <br/>
          <span style="color:red;">
            <a href="http://jinguo.javaeye.com/blog/230994#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 10:39:41 +0800</pubDate>
        <link>http://jinguo.javaeye.com/blog/230994</link>
        <guid>http://jinguo.javaeye.com/blog/230994</guid>
      </item>
      <item>
        <title>JAVA下的日期时间类和格式化输出</title>
        <author>jiankeafei</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jiankeafei.javaeye.com">jiankeafei</a>&nbsp;
          链接：<a href="http://jiankeafei.javaeye.com/blog/230928" style="color:red;">http://jiankeafei.javaeye.com/blog/230928</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp; 最近在项目中用到日期和时间，由于开始对JAVA下的日期和时间类掌握的不够熟练，所以在使用的过程成中遇到了一点问题，在此特总结一下。</p>
<p>&nbsp;&nbsp;&nbsp; Date类是比较经典的一个时间类，但是它里面的很多方法都已经过时，而Calendar相对Date较年轻且比较好用些。</p>
<p>&nbsp;&nbsp;&nbsp; 根据使用频率，我们一般有如下几种用法：</p>
<p>&nbsp;&nbsp;&nbsp; 1、获得当前时间并格式化输出</p>
<p>&nbsp;</p>
<pre name="code" class="java">//使用默认时区和语言环境获得一个日历
Calendar cale = Calendar.getInstance();
//将Calendar类型转换成Date类型
Date tasktime=cale.getTime();
//设置日期输出的格式
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//格式化输出
System.out.println(df.format(tasktime));</pre>
<p>&nbsp;&nbsp;&nbsp; 2、输出指定日期</p>
<p>&nbsp;</p>
<pre name="code" class="java">//使用默认时区和语言环境获得一个日历
Calendar cale = Calendar.getInstance();
//对日期和时间进行设置
cale.set(Calendar.YEAR, 2008);
//此处注意，MONTH是从0开始的，一下设置为12，如果为宽松模式，时间自动变为09年1月，如果为严格模式，应抛出异常
cale.set(Calendar.MONTH, 12);
//月份减1
cale.add(Calendar.MONTH, -1);
cale.set(Calendar.DAY_OF_MONTH, 20);
cale.set(Calendar.HOUR_OF_DAY, 18);
cale.set(Calendar.MINUTE, 32);
//分钟加1 对于没有设置项，如秒，则采用系统默认
cale.add(Calendar.MINUTE, 1);
//将Calendar类型转换成Date类型
Date tasktime=cale.getTime();
//设置日期输出的格式
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//格式化输出
System.out.println(df.format(tasktime));
</pre>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;附：SimpleDateFormat的格式：</p>
<p>&nbsp;&nbsp;&nbsp;在实例化SimpleDateFormat时，采用"yyyy-MM-dd HH:mm:ss"这样的构造参数，可以对输出的格式进行设置。而字符串中的字母代表的含义如下：</p>
<p>&nbsp;&nbsp;G 年代标志符<br />&nbsp; y 年<br />&nbsp; M 月<br />&nbsp; d 日<br />&nbsp; h 时 在上午或下午 (1~12)<br />&nbsp; H 时 在一天中 (0~23)<br />&nbsp; m 分<br />&nbsp; s 秒<br />&nbsp; S 毫秒<br />&nbsp; E 星期<br />&nbsp; D 一年中的第几天<br />&nbsp; F 一月中第几个星期几<br />&nbsp; w 一年中第几个星期<br />&nbsp; W 一月中第几个星期<br />&nbsp; a 上午 / 下午 标记符 <br />&nbsp; k 时 在一天中 (1~24)<br />&nbsp; K 时 在上午或下午 (0~11)<br />&nbsp; z 时区</p>
<p>&nbsp; 除了上述具有实际含义的字母之外，还可以配合诸如：空格、：、-等进行格式化设置。</p>
          <br/>
          <span style="color:red;">
            <a href="http://jiankeafei.javaeye.com/blog/230928#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 10:07:25 +0800</pubDate>
        <link>http://jiankeafei.javaeye.com/blog/230928</link>
        <guid>http://jiankeafei.javaeye.com/blog/230928</guid>
      </item>
      <item>
        <title>番茄花园作者被抓了</title>
        <author>Azi</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://azi.javaeye.com">Azi</a>&nbsp;
          链接：<a href="http://azi.javaeye.com/blog/230910" style="color:red;">http://azi.javaeye.com/blog/230910</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>　　新浪科技20日独家披露的洪磊被拘报道，在软件产业、PC行业及互联网等领域引发了轩然大波。</p>
<p>　　根据我国的法律，未经许可修改他人软件，如果没有因此获利，定罪较为困难。番茄花园在其网站上的版权声明中也表示，他们并不提供任何出售光盘，完全供用户免费下载。一些用户为洪磊喊冤，觉得番茄花园只是盗版商的&ldquo;替罪羊&rdquo;，他本身并没有因此获利。用过番茄花园的用户都发现，他的操作系统捆绑了易趣插件及雅虎助手，但他是否因此获利不能妄下结论。</p>
<p>　　在新浪科技独家获悉的这份录音资料中，洪磊自己披露，他每月因此获利10余万元，并且他自己心里清楚&ldquo;让微软知道了你在利用这个赚钱，他肯定会找你&rdquo;。</p>
<p>　　洪磊在录音资料中称，番茄花园在2006年时的盈利模式有三种：一，番茄花园网站的点击广告；二，洪磊通过自己的网站提供包括XP美化包在内的软件下载，这些软件中捆绑了流氓软件，洪磊因此每月获利两三万元；三，通过预装在番茄花园版的流氓软件，为广告主带去流量或注册用户，每月由此获利10余万元。</p>
<p>&nbsp; 。。。。。。。。。。。。。。。。。。。。。。。。。。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>大家怎么看这个问题</p>
          <br/>
          <span style="color:red;">
            <a href="http://azi.javaeye.com/blog/230910#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 09:22:45 +0800</pubDate>
        <link>http://azi.javaeye.com/blog/230910</link>
        <guid>http://azi.javaeye.com/blog/230910</guid>
      </item>
      <item>
        <title>使用 RJS 模版来更新页面</title>
        <author>sunfengcheng</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sunfengcheng.javaeye.com">sunfengcheng</a>&nbsp;
          链接：<a href="http://sunfengcheng.javaeye.com/blog/230904" style="color:red;">http://sunfengcheng.javaeye.com/blog/230904</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: large"><span style="color: indigo">使用 RJS 模版来更新页面<br />如果你想使用 ajax 来调用更新页面中的多个 ＯＤＭ元素，　具体的说你想在一个应用程序中允许更新你的恶添加项等操作。<br />　<br />还是在你的布局中将　Ｐｒｏｔｏｔｙｐｅ　和样式包含进去<br /><br /><br /><pre name="code" class="java">app/views/layouts/tasks.rhtml:

&lt;html>
&lt;head>
  &lt;title>Tasks: &lt;%= controller.action_name %>&lt;/title>
  &lt;%= javascript_include_tag :defaults %>
  &lt;%= stylesheet_link_tag 'scaffold' %>
&lt;/head>
&lt;body>

&lt;p style="color: green">&lt;%= flash[:notice] %>&lt;/p>

&lt;%= yield %>

&lt;/body>
&lt;/html></pre>通过载入　一个局部模版，ｉｎｄｅｘ视图中显示了任务列表，　<br /><pre name="code" class="java">app/views/tasks/index.rhtml:

&lt;h1>My Tasks&lt;/h1>

&lt;div id="notice">&lt;/div>

&lt;div id="task_list">
  &lt;%= render :partial => 'list' %>
&lt;/div>

&lt;br />

&lt;% form_remote_tag :url => {:action => 'add_task'} do %>
  &lt;p>&lt;label for="task_name">Add Task&lt;/label>;
  &lt;%= text_field 'task', 'name'  %>&lt;/p>  
  &lt;%= submit_tag "Create" %>
&lt;% end %></pre><br />＿ｌｉｓｔ．ｒｈｔｍｌ　局部模版将迭代所用的任务，并显示成列表。<br /><pre name="code" class="java">app/views/tasks/_list.rhtml:

&lt;ul>
&lt;% for task in @tasks %>
  &lt;% for column in Task.content_columns %>
    &lt;li>&lt;%=h task.send(column.name) %>&lt;/li>
  &lt;% end %>
&lt;% end %>
&lt;/ul></pre>接着，　　　为了显示和添加的恶任务，定义两个方法　ｉｎｄｅｘ和ａｄｄ＿ｔａｓｋ。<br /><pre name="code" class="java">app/controllers/tasks_controller.rb:

class TasksController &lt; ApplicationController

  def index
    @tasks = Task.find :all
  end

  def add_task
    @task = Task.new(params[:task])
    @task.save
    @tasks = Task.find :all
  end
end</pre><br /><br />最后创建一个ＲＪＳ模版，用来定义那些元素使用　ｊａｖａｓｃｒｉｐｔ　来更新<br /><pre name="code" class="java">app/views/tasks/add_task.rjs:

page.replace_html 'notice', 
    "&lt;span style=\"color: green;\">#{@tasks.length} tasks,  
         updated on #{Time.now}&lt;/span>" 

page.replace_html 'task_list', :partial => 'list'

page.visual_effect :highlight, 'task_list', :duration => 4 </pre></span></span>
          <br/>
          <span style="color:red;">
            <a href="http://sunfengcheng.javaeye.com/blog/230904#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 07:31:12 +0800</pubDate>
        <link>http://sunfengcheng.javaeye.com/blog/230904</link>
        <guid>http://sunfengcheng.javaeye.com/blog/230904</guid>
      </item>
      <item>
        <title>迎奥运，20个帮助你塑造体形的网站</title>
        <author>liuming</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liuming.javaeye.com">liuming</a>&nbsp;
          链接：<a href="http://liuming.javaeye.com/blog/230898" style="color:red;">http://liuming.javaeye.com/blog/230898</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原文地址：<a href="http://www.sitepoint.com/blogs/2008/08/20/20-sites-to-get-you-in-shape/" title="20 Sites to Get You in Shape" target="_blank">http://www.sitepoint.com/blogs/2008/08/20/20-sites-to-get-you-in-shape/</a>
</p>
<p>&nbsp;</p>
<p>有些看了奥运后的朋友，会有种想塑身的冲动吧？笔者就有这样的念头，可惜转瞬即逝了。看着游泳运动员一个接一个的打破世界纪录，看着体操运动员在高难度的弹跳中仍然保持着完美的平衡，突然觉得，健美的身体和健康的饮食似乎很遥远。但是，希望以下的站点，能够以Web 2.0的方式给你一些帮助（译者注：这句够雷），排名不分前后。</p>
<ul>
<li><a href="http://www.traineo.com/" target="_blank">Traineo</a>
 - 以图表的方式显示你的健身和减肥目标，以及让关注你计划的家人和朋友上去鼓励你。</li>
<li><a href="http://www.gimme20.com/" target="_blank">Gimme20</a>
 - 寻找并制定适合你的健身计划，并跟据实施情况。</li>
<li><a href="http://www.peertrainer.com/" target="_blank">PEERtrainer</a>
 - 一个塑身减肥社区，使成员之间可以互相帮助，向目标迈进。</li>
<li><a href="http://www.myfooddiary.com/" target="_blank">My Food Diary</a>
 - 通过你的饮食和运动日记，跟踪你卡路里和脂肪的摄入和卡路里的消耗。</li>
<li><a href="http://www.gyminee.com/" target="_blank">Gyminee</a>
 - 以社区的形式来跟踪你的饮食和健身情况。 用户即可以分享他们的健身计划，也可以和他们比拼一下健身情况。</li>
<li><a href="http://www.fitlink.com/" target="_blank">FitLink</a>
 - 一个可以让用户找到和自己有相似健身计划，并且可以一起跟踪实施情况的社区。</li>
<li><a href="http://www.diettv.com/" target="_blank">DietTV.com</a>
 - 跟据专家的建议制定个性化的饮食和健身计划。</li>
<li><a href="http://www.skinnyr.com/" target="_blank">Skinnyr</a>
 - 一个简单的图表工具，用于跟踪并以图表的方式显示你的体重情况。</li>
<li><a href="http://sparkpeople.com/" target="_blank">SparkPeople</a>
 - 一个以健康生活为主题的社交网络，可以分享食谱、健身计划和健康资讯，制定饮食计划，跟踪卡路里和健身情况。</li>
<li><a href="http://fatsecret.com/" target="_blank">FatSecret</a>
 - 分享食谱，对比饮食习惯，提问并跟踪你的进度，并把日记保存到这个网站上。</li>
<li><a href="http://fitday.com/" target="_blank">FitDay</a>
 - 提供一些分析工具长期对你的饮食和瘦身日记进行分析，并且显示取得的效果。</li>
<li><a href="http://www.weightlosswars.com/" target="_blank">WeightLossWars</a>
 - 让大家比拼一下减肥效果。让你仿佛向置身一块减肥游戏，使得在瘦身的过程中得到更多的乐趣和激励。</li>
<li><a href="http://www.thedailyplate.com/" target="_blank">TheDailyPlate</a>
 - 记录着超过100,000种食物的营养信息。跟据你的饮食并且了解你饮食中的优劣。</li>
<li><a href="http://inpowr.com/" target="_blank">Inpower</a>
 - 评价你总体的健康情况，设定目标，制定实施计划，跟据进度,以及和社区共享你的成果。不仅限于减肥瘦身，还包括了大部份的健康问题，比如说戒烟等。</li>
<li><a href="http://www.runfatboy.net/" target="_blank">RunFatBoy</a>
 - 一个可以让你简便地定制健身计划并打印带到健身房的网站。当然也有饮食跟据和日记。</li>
<li><a href="http://www.itrainharder.com/" target="_blank">iTrainHarder</a>
 - 跟踪你的健身和营养目标。不单止面向要健身的人，同时也适合健身教练和运动员使用。</li>
<li><a href="http://www.wellsphere.com/" target="_blank">Wellsphere</a>
 - 一个鼓励人们多做运动和提倡健康饮食的在线&ldquo;健康生活社区&rdquo;。</li>
<li><a href="http://www.dailystrength.com/" target="_blank">DailyStrength</a>
 - 包含大部份话题的在线讨论组，包括减肥和饮食等信息。不仅限于这类主题，该网站还包括了从忧郁症到育儿乃至癌症的信息。</li>
<li><a href="http://www.projectweightloss.com/" target="_blank">Project Weight Loss</a>
 - 制定饮食和减肥计划，并跟踪实施情况。包括规划食谱、计算卡路里和以身体局部情况图表等一条龙服务。</li>
<li><a href="http://tweetwhatyoueat.com/" target="_blank">TweetWhatYouEat.com</a>
 - 一个简便的饮食日记，通过twitter、IM软件或者网页提交你的饮食记录，当然，TweetWhatYouEat.com还可以跟据你的体重变化和卡路里的摄入。但是，它并不像<a href="http://www.acaloriecounter.com/" target="_blank">Calorie Counter</a>
这种卡路里计算器那样，可以自动的查找食物中的热量信息。</li>
</ul>
<p>









你有上过这些网站吗？欢迎大家在<a href="http://www.sitepoint.com/blogs/2008/08/20/20-sites-to-get-you-in-shape/" target="_blank">点评</a>
中发表你的看法，以及告诉我们一些未曾提及的站点。</p>
          <br/>
          <span style="color:red;">
            <a href="http://liuming.javaeye.com/blog/230898#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 03:25:56 +0800</pubDate>
        <link>http://liuming.javaeye.com/blog/230898</link>
        <guid>http://liuming.javaeye.com/blog/230898</guid>
      </item>
      <item>
        <title>我的学习JAVA的体会</title>
        <author>hay</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hay.javaeye.com">hay</a>&nbsp;
          链接：<a href="http://hay.javaeye.com/blog/230892" style="color:red;">http://hay.javaeye.com/blog/230892</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          接触JAVA不久，对于太多的未知领域想去探索。我知道，没有付出是没有回报的！~从JAVA的基础那些语法走来，现在只能说对于JAVA是刚入门而已！~<br />      这个大一暑假，留校参加JAVA的培训，对于我还很新的新人来说，就用JSP和Javabean和一个团队，写了一个管理系统出来，虽然只是很简单的功能的实现。但是其中学习的过程让我学到很多，也深深的体会到程序员的艰辛和劳累，我们三个人，都是刚学JAVA，都不太懂的。其中真的遇到不少想令我们发疯或是放弃的问题，但我们还是坚持了下来，可以说我们刚学JAVA 就让我们做项目了，而且对那些都还不懂，完全是遇到所有的问题都自己解决的。但这个项目是我们组的第一个项目，也是我的第一个！~经过这次4天的时间的奋战。至少我对JAVA的认识有更进一步了，不会什么都不知道！~但是我还是不会怎么去写，因为我们做的那个系统也是有个用例，给我们照着，千改万改弄出来的。说真的，还没完全领悟JAVA。现在只是会看的懂，知道怎么弄，怎么调用。但是具体到自己怎么写的，我还真没底，不是很会！但是其中也让我感觉到老师牵着我们这些牛在跑，那么多知识摆上台。然后就做项目。那几天做的天昏地暗，但是蛮有激情和劲力~我当然还会努力继续学习JAVA的，因为喜欢编程！~看了不少人的学习经历和经验，但是有些我也不知道怎么处理好。除了看基本的语法，和网上下载一些用例来自己研究那些源代码。但还有没有其他方法？过来人能给些建议么？<br />       JDK啃下来？<br />       浏览多一些像javaeye的网站？
          <br/>
          <span style="color:red;">
            <a href="http://hay.javaeye.com/blog/230892#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 00:57:00 +0800</pubDate>
        <link>http://hay.javaeye.com/blog/230892</link>
        <guid>http://hay.javaeye.com/blog/230892</guid>
      </item>
      <item>
        <title>和robbin的一次交流，关于JavaEye社区运营和社区网站的看法</title>
        <author>zwchen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zwchen.javaeye.com">zwchen</a>&nbsp;
          链接：<a href="http://zwchen.javaeye.com/blog/230890" style="color:red;">http://zwchen.javaeye.com/blog/230890</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          出于创业前的学习和对社区网站经营的兴趣，给robbin提了一点JavaEye的建议。他竟然回复这么认真，呵呵。<br /><br />本文也征询robbin的同意才发表的，算是我对对互联网思考的一个记录吧。<br /><br /><strong>我的原message：</strong><br /><div class="quote_title">引用</div><div class="quote_div">先说点题外话。 <br />本人泡JavaEye大概是04年开始的，已经四年了，匿名了两年多，活跃过一年。最近一年也没怎么逛，就是偶尔去海阔天空版看看别人的新鲜事。因为我现在逐渐从技术过渡到业务和商业、以及管理，社区也也逐渐转向了经管类。不再太关注一些技术实现细节，譬如Hibernate二级缓存等等。 <br />JavaEye是自己进入IT行业对我影响最大的导师，发自内心对Robbin的感激！我感觉Robbin也逐渐将注意力转到运营、互联网业务这类主题上了，呵呵。 <br /><br />回到正题。 <br />我看了一下最近四个月的JavaEye站务group，里面大概有40%左右是关于“隐藏贴”、“新手贴”、“灌水”、“扣分”这些关键字。 <br />为什么会有这么多投诉？我想这应该占据了你们大量的运营管理时间，还很有怨愤和挫折感：为什么这么多人不看“版规”，还不服气？ <br />我想还有更多的人，受气后也就忍了。 <br /><br />版规在哪里？？？ <br />对于我这样一个老手，我刚才花了10分钟，又是登录，又是注销，又是发帖，才找到那个传说中的版规，原来它隐藏在“用户注册”的“同意条款并注册”按钮左边一个很不显眼的位置！ <br />JavaEye右上角有一个“帮助”，但那更像一个“宣传手册”，而不是“宪法”(版规)，其中有“版规”的大部分内容，但缺乏“JavaEye论坛使用规则”和“JavaEye论坛提问的智慧”，这两大核心发帖指导。 <br /><br />我的建议 <br /><br />1、优化右上角“帮助”的导航。在该页面左边或上面有outline链接。另外，将http://www.javaeye.com/topic/29434里面的，而在“帮助”里没有的补充进去。 <br />大家的个习惯性思考： <br />论坛就是供我随便灌的，我可以哗众取宠 <br />论坛的版规也就一个底限，别发表黄色或反动什么的，这个官文我知道 <br />这么长的“帮助”，没十分钟看不完。那个积分规则，我可是花了几个月才看懂的。 <br /><br />我建议将“JavaEye论坛使用规则”和“JavaEye论坛提问的智慧”，放在outline的第一、二条，因为用户最不喜欢看这个，其它的几条，我觉得想在JavaEye安家或混人气的，自然会主动去看。 <br /><br />2、在“发表新帖”的页面，也就是提交按钮前，加个“请遵守JavaEye发帖限制”链接(做成简略的弹出式Tips)，占据一行。 <br /><br />3、在注册页面，做个TextArea，将“转载”、“灌水”、“新手提问”这三条版规用40字以内标注出来，以便10秒内用户可以扫过，留下印象，其它可以通过链接标注。另外，注册按钮的提交，做成10秒等待后激活的模式。 <br /><br />或者将版规中最需要注意的放在预注册页面，点击下一步才正式注册。 <br /><br />4、在激活邮箱里，将上面说的三条版规再次在正文里重复。 <br /><br />为什么我这么强调这个版规的用户了解度？ <br />因为它就是JavaEye的灵魂，JavaEye的文化、JavaEye的核心竞争力体现。用户不知道你们的版规而收到惩罚，是你们的责任！ <br /><br />真正的高效的运营，不是处理用户投诉，而且在前期有效的引导用户。用户不是严重受挫或感觉不公，不会来打扰你们的。 <br /><br />上面说的细节问题，对于JavaEye用户来说，可能太没有技术含量了，但对于一个网站运营者来说，问题的严重性不亚于做MIS系统时的内存泄露。 </div><br /><br /><strong>robbin的回答：</strong><br />首先谢谢你的这么好的建议，我很认真从头到尾看了一遍。对于这个问题，我是这样看的： <br /><br />1、从趋势上来讲，自从问答频道推广之后，论坛技术版的低质量提问贴已经大幅度降低了，投诉贴的频率也降低了。以前基本上每天都会有3-5个投诉贴，现在平均3天左右才会有一个投诉贴。因此，引导低端用户去使用问答我觉得是一个更好的办法。 <br /><br />2、现在论坛的发贴规则是全论坛置顶的，随便点开论坛的哪个版面，都会在第一置顶贴看到论坛规则，实际上是非常醒目的。更多的原因在于用户不把版规当回事，不相信这个论坛会来真的，非要到被惩罚了，才会遵守规矩。当然这也和现在中国社会现状是相对应的。 <br /><br />3、在新用户注册的激活邮件和注册成功的提示邮件里面都有规则的提示，但是基于我前一条提到的原因，绝大多数人并不会重视这一点。 <br /><br />4、我们将采取的解决办法是强制做题！新注册会员以及论坛积分为0的会员，在发贴之前，都会要求他做10道根据版规出的选择题，只有他全做对，才可以激活发贴功能。这样才能强制他学习版规。 <br /><br />5、强制做题这个功能其实我们早就设计好了，但是从目前情况来看，这个功能优先级不太高。因为一方面论坛投诉确实越来越少，已经降低到了一个合理的水平，另一方面论坛在整个网站的流量比重已经降低到了25%左右，我们需要把更多开发精力放在更重要的功能上面，因此这个功能要在有时间的情况才去做。 <br /><br />最后，我好奇的问一下，你经常访问的经管类的论坛是什么？ <br /><br /><br /><strong><br />第二次沟通，robbin的回复</strong><br /><br /><div class="quote_title">引用</div><div class="quote_div"><br />现在你们投诉大大降低，可能不太需要太关注这个，但有个理念我想你也认同：你或用户不满意的地方，肯定有改进的方式，只是我们没有想到罢了。 </div><br /><br /><br />实际上我们还是很重视细节的，比方说我们内部现在使用JIRA来管理开发流程，目前JIRA上面有32个issue等待解决，这些还仅仅只是针对目前网站功能的改进方面，没有包括正在或者即将开发的新功能。 <br /><br />根据这些issue的优先级，以及计划新开发的功能、配合厂商广告的功能、网站内部广告发布、流量监测、系统管理等功能，这些所有的开发任务加起来是很多的，因此有些看起来不是特别重要的issue就会往后排。 <br /><br /><div class="quote_title">引用</div><div class="quote_div">我辞职在家快三个月了，思考和学习了三个月，也准备创业大半年了，发现方向还是不明朗，没有发现好的商机，不过，我应该不太会考虑互联网创业了，风险太高。计划月底去成都，我哥开的旅游公司干半年(偏向电子商务)，然后再考虑打工或创业。</div> <br /><br /><br />我个人认为，技术人员出身创业，还是要尽量发挥自己的优势，不要完全放弃自己多年积累的优势，否则你相当于从0开始，一点优势都没有，会很被动的。 <br /><br /><br /><br /><div class="quote_title">引用</div><div class="quote_div">可能你现在花的时间，更多在日常的运营上，也就是最琐碎重复的一些事情，不像创业当初，考虑怎么打江山，而现在是守江山。 </div><br /><br /><br />公司战略会一直盘旋在脑海当中去想。不过对我来说，战略方向已经考虑的很充分了，最重要的还是执行力，因此我现在精力更多的放在业务的执行层面上：谈客户、跟踪业务、提供服务、网站内容建设、用户反馈等等。 <br /><br /><br /><br /><div class="quote_title">引用</div><div class="quote_div">我上面说的一段话，你一定嗅出了什么？这就是，一个用户肯定有一个成长期，成长就意味着过渡，过渡就意味着离开。怎么去解决像我这种用户的问题？论坛上很多钻石用户估计和我体会差不多：工作几年后，就发现技术这东西有局限性，面临天花板，朝业务和商业发展是个很自然的选择。以前，我从海阔天空总能学到很多很多让我一亮的观点，譬如lucas-lee的，但现在极少了，可能是我看IT和财经类大腕们的博客太多了，再上JavaEye看，就觉得那些人很“幼稚 ”，不过，我并没有什么贬低的意思，因为这是人成长的一个阶段。留在JavaEye的人，大多数都是骨子里有“认真”品质的人，他们的成熟、离开只是个时间问题。但我想，在论坛得到极大提升的人，譬如我，日后会以某种方式去回馈它。JavaEye的博客算是给我这类人留下来一个理由。人的成长，意味着圈子的改变，而JavaEye博客对我的意义，更多是个技术上的概念，工具性为主。我想，我可能不太会加入到JavaEye的各圈子，因为我需要成长，需要接触其他职业的人，扩大我的行业人脉。 </div><br /><br /><br />如果像你这样准备跨行业，那确实没有什么办法挽留流失的用户的。其实很多技术人员走向管理岗位、或者自己创业，只要不脱离软件行业，也会经常泡JavaEye，目前JavaEye里面活跃ID当中我见过面，自己创业当老板的就有七八位了，做公司高管的就更多了。 <br /><br />但是他们关注点会转移，所以我感兴趣的问题就在于JavaEye如何满足这种需求，如何对这些用户产生足够的黏性，我相信我已经找到了答案，只是需要时间去实践。 <br /><br /><br /><br /><div class="quote_title">引用</div><div class="quote_div">放弃并不遗憾，你把用户锁定在大四到工作五到八年以内的人就够了，只是深度挖掘找到吸引、保留、激励这类人的Business。JavaEye到现在，已经是很成功，不过这句话对于你，除了鼓励，就是废话，呵呵。我还是倾向社区的商业化运作，当然你们也是在这个方向努力。我想你肯定很熟悉白鸦，它们的 UCDChina野心可不小。它们的线下活动很多，线下活动有很多赞助商，我想你们也可以借鉴。当然模仿要找到模仿为什么可行的本质，他们搞设计的，和你们的Business确实还有区别，呵呵，譬如设计是个“大众化”的主题，而深度的Java和ajax技术太小众化，壁垒很高。 </div><br /><br /><br />社区电子商务化的确是一条路，但是是有一些前提条件的。确定网站的商业模式有很多考虑因素，比方说规模效应、回报率等等，对于JavaEye来说，目前有比做社区电子商务更好的商业模式，所以没必要现在就去挖掘它。 <br /><br /><br /><br /><div class="quote_title">引用</div><div class="quote_div">最后说你好奇的一个问题：我上什么经管类论坛。呵呵。 <br />很惭愧，现在还没有一个让我愿意安家的社区，但我会花两三个月的时间继续考察，暂时的目标定位在栖息谷，其次是畅享网，后者的首页设计很有创意，完全以人为主线，很亲切，但论坛水分太多太多。栖息谷是我首选进入的目标。这两个社区、圈子面向的是JavaEye的过渡人群，28岁--35岁，基层、中层管理人员、CTO等角色。但这类人有个特别的地方，现实中并不“孤独”，而且在职场上地位不低，人脉也比较广，不需要为了建立一个虚拟的社区身份而花那么高的时间成本，所以讨论深度似乎没有JavaEye里像TrustNo1等人那么投入。 <br /><br />另外两个不得不提的社区，就是人大的经济论坛和阿里巴巴的商人社区club.china.alibaba.com，前者学术性太强，学生为主，也就一个文件共享社区，但想想，你要这些人说些什么心得，都没毕业呢。但在经管界，它的影响力很大。后者定位在创业者，很多人把博客搬到上面，社区非常活跃，不过人群主要是传统行业的创业着。其实，我关注阿里巴巴商人社区已经大半年了。栖息谷如果试用满意，应该就会粘在上面，呵呵。</div> <br /><br /><br />我对一个问题比较感兴趣：究竟有没有一个成功的高端商务人士的社区？目前为止，似乎所有尝试做商务人士的社区都没有特别成功的，我认识的一些大公司高管貌似也不怎么泡商务社区。这里面有一个很有意思的现象：作为成功商务人士，是有架子的，不会轻易到一个商务社区里面去在露怯，显得自己水平其实很差的样子，这和技术高手喜欢在技术社区拍砖有大的不同。 <br /><br />技术是需要分享和交流的，但是商务经验需要的是自己体验和总结，至于交流和分享没多大意义，因为成功的经验都是最基本的原则，能成功不是因为你有什么秘诀，而是你的执行力、才能加上点运气。<br /><br /><br /><strong>我的回复</strong><br />你的看法和点评我很认同，在社区经营这块，我想你肯定考虑比我多，因为我是一个旁观者，你是一个实践者。 <br />就对你的点评一一作答吧。 <br />1、关于细节。真没想到你们内部的细节问题有这么多，我确实有些意外。任何事情都有轻重缓急，相信你也是一位非常注重条理的人。 <br /><br />2、关于创业和跨行业。我想我的行业肯定还是IT，因为我硕士是以化学学位毕业的，知道改行的艰辛。不过，我可能不会去阅读艰深的技术书籍，除非工作需要。我要是打工，估计以后会偏向系统分析师和架构师、CTO这样的职位。但说实话，我宁愿少挣点，也不想打工。我去我哥那儿，就是搞旅游电子商务和企业内部系统，预计明年春节前完成。我考虑过旅游行业的ERP，但这个服务行业的业务太松散和混乱，没法像制造业那样可以标准化。 <br /><br />前一年是在xxx做底层RIA框架，也了解些同行的金蝶和东方通产品，对国内的技术和项目管理确实比较失望，很打击我对技术的热情。不过技术上长进不少，呵呵。 <br /><br />我想，我以后应该会偏向需求分析，对某一个行业的业务比较精通。当然了，不是改行。但肯定会主要侧重商业角度。在家这三个月，对工商管理基础知识狠狠补充了一把。 <br />我之所以想进入财经、创业等圈子，就是想找到其它行业的合作伙伴，同时扩大自己的事业。只在技术圈子，知识太受限。 <br /><br />3、关于高端商务人士社区。我对高端商务人士线上运作，和你一样，不太认可。像贵人网，感觉太俗气了，05年我关注过，那时它大力推广其博客频道，可能早就撤掉了。你说那些人会去上面摆富吗，人身安全都保障不了。不过我哥曾经想搞高尔夫俱乐部，当然是线下运作，听他说国外这类俱乐部，会员赞助费就非常高了。就像一些人上EMBA，一个重要的隐性目的，就是结交同班的成功人士。 <br /><br />成功人士的交流，我想，不会像技术社区这样直接，它应该是围绕一个第三方去展开，譬如峰会、课堂、俱乐部、运动场所。 <br /><br /><br />有什么感想，我再通过MSN找你，不过和你聊天，前期肯定还是向你学习为主，呵呵。 <br /><br />----------------------<br />To the end
          <br/>
          <span style="color:red;">
            <a href="http://zwchen.javaeye.com/blog/230890#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 21 Aug 2008 00:12:13 +0800</pubDate>
        <link>http://zwchen.javaeye.com/blog/230890</link>
        <guid>http://zwchen.javaeye.com/blog/230890</guid>
      </item>
      <item>
        <title>eclipse中JS中文乱码解决</title>
        <author>loforgood</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://loforgood.javaeye.com">loforgood</a>&nbsp;
          链接：<a href="http://loforgood.javaeye.com/blog/230881" style="color:red;">http://loforgood.javaeye.com/blog/230881</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近重装了系统，然后开发环境也重新装了下，结果发现js文件中中文都是乱码。最后网上找了下，好像遇到这个问题的还挺多，解决方法：<br /><br />可依次选择"window">>"preferences">>"general">>"content types" <br /><br />在右边的窗口中打开列表,选中"JavaScript",在下面的"default encoding"右边的输入框中输入"GBK"或"GB2312"再点"update"按钮,再打开JS文件就可以<br /><br />如果没有提供选择向，在下面的“文件关联”中添加一个“*.js”,然后指定编码为"GBK"或"GB2312"就可以了
          <br/>
          <span style="color:red;">
            <a href="http://loforgood.javaeye.com/blog/230881#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 23:16:25 +0800</pubDate>
        <link>http://loforgood.javaeye.com/blog/230881</link>
        <guid>http://loforgood.javaeye.com/blog/230881</guid>
      </item>
      <item>
        <title>游戏设计-Chapter1</title>
        <author>iamzealotwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://iamzealotwang.javaeye.com">iamzealotwang</a>&nbsp;
          链接：<a href="http://iamzealotwang.javaeye.com/blog/230831" style="color:red;">http://iamzealotwang.javaeye.com/blog/230831</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small; color: #0000ff;">涉及方面：<span style="color: #ff0000;">面向对象思想在实际编程之中的运用</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; color: #0000ff;">摘要：设计时候</span></p>
<p><span style="font-size: small; color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><span style="font-size: small; color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&middot;<span style="color: #ff0000;">找出应用中可能需要变化的地方，把他们独立出来。不要和不需要变化的代</span></span><span style="font-size: small; color: #ff0000;">码放在一起&nbsp;</span></p>
<p><span style="font-size: small; color: #0000ff;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&middot;<span style="color: #ff0000;">针对接口编程，不是针对实现编程</span></span></p>
<p>&nbsp;</p>
<p><span style="font-size: small; color: #0000ff;">&nbsp;&nbsp;&nbsp;&nbsp; 首先游戏一定会有主角，以及怪兽。所以一定要建立Role类和Monster类 那角色和怪物必然固有的属性是Hp，以及MP了。介于此首先想到的是定义一个生物（Creature），让Role类和Monster类都继承与它 <br /></span></p>
<pre name="code" class="java">public Class Creature{
	private int hp;
	private int mp;
}

public Class Role extends Creature{
		private int exp;
}

public Class Monster{}
</pre>
<p><br /><br /><span style="font-size: small; color: #0000ff;">这个时候，突然想到，所有Role类和Monstar类必然要有名字，并且一定有攻击（Attack）以及被攻击的（BeAttack）方法。 <br /><br />既然这样可以采用更改Creature类达到目的 </span></p>
<p><span style="font-size: small; color: #0000ff;"><br />&nbsp;</span></p>
<pre name="code" class="java">public Class Creature{
		private int hp;
		private int mp;
		private String name;

		public void Attack(){
		// Do some things
		}
		public void BeAttack(){
		// Do some things
		}
}
</pre>
<p><br /><span style="font-size: small; color: #0000ff;">貌似解决了问题。 <br />不过里面还隐藏着另外的2个问题： <br />1：</span></p>
<p><span style="font-size: small; color: #0000ff;">当有更多的类继承自Creature时候就会发生问题，比如NPC。NPC是不应该有攻击以及被攻击的方法的。 </span></p>
<p><span style="font-size: small; color: #0000ff;"><br />错误的解决方法：&nbsp;&nbsp; 当然可以让NPC复写Attack方法以及BeAttack方法。 <br />仍然存在的问题：&nbsp;&nbsp; 当Creature的特性变多，或者继承Creature的类增多的时候 需要复</span><span style="font-size: small; color: #0000ff;">写以及更改的代码增多。维护起来有问题。 <br />正确的解决方法：&nbsp;&nbsp;&nbsp;将不变的属性以及方法封装，将易变的方法提取出来。即建立Attack类以及BeAttack类。 <br /><br /><span style="color: #ff0000;">设计原则：找出应用中可能需要变化的地方，把他们独立出来。不要和不需要变化的代码放在一起 <br /></span><br />2： <br />对于每个角色必然有不同的攻击方式，比如魔法师必然使用魔法攻击，刺客可能存在二刀流（即一次进行两次攻击），弓手可能实行远程攻击，战士使用普通攻击。 </span></p>
<p><span style="font-size: small; color: #0000ff;"><br />错误的解决方法： 对攻击里面加入switch case语句，对于每种不同的攻击方式给出不同</span><span style="font-size: small; color: #0000ff;">的效果 <br />仍然存在的问题： 假如新加入一个职业呢？德鲁伊...&amp;(*&amp;&amp;^^%* <br />正确的解决方法： 让Attack以及BeAttack变为接口，以不同的攻击方式去实现接口。 <br /></span></p>
<pre name="code" class="java">public interface Attack {
// Do some things
}

public interface BeAttack(){
// Do some things
}

public class SwordAttack implements Attack {}

public class MagicAttack implements Attack {}
</pre>
<p><br /><br /><br /><span style="font-size: small; color: #0000ff;">现在就可以很好的解决问题了。组装一下代码： <br /></span></p>
<pre name="code" class="java">public interface Attack {
// Do some things
}

public interface BeAttack(){
// Do some things
}

public class SwordAttack implements Attack {}
public class MagicAttack implements Attack {}


public Class Creature{
		private int hp;
		private int mp;
		private String name;
}

public Class Role extends Creature{
		private Attack attack;
		private BeAttack beAttack;
		private int exp;
}

public Class Monster extends Creature{
		private Attack attack;
		private BeAttack beAttack;
}
</pre>
<p><br /><span style="font-size: small; color: #0000ff;"><span style="color: #ff0000;">设计原则：针对接口编程，不是针对实现编程</span> <br /></span></p>
<p><span style="font-size: small; color: #0000ff;">这里指的是：Role 和Monstar 只包含Attack接口，而不是指定使用某种Attack，这样的好处是在运行中Attack的种类是可以改变的。</span></p>
<p><span style="font-size: small; color: #0000ff;">比如：当现在是剑士的时候可以使用SwordAttack，而当转职为魔法师时候就要使用MagicAttack。 <br />这也就是实现了初步的动态绑定。 <br /><br />按上面组装完成后执行测试代码： <br /></span></p>
<pre name="code" class="java">public class RoleTest {
	
	private static Role role;
	
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
		role = new Role("崔斯特",100,100,0,new SwordAttack());
	}

	@Before
	public void setUp() throws Exception {
		System.out.println("===============测试开始============\n");
	}
	
	@After
	public void tearDown() throws Exception {
		System.out.println("\n===============测试结束============\n");
	}
	
	/**
	 * 目的：测试角色初始化，以及攻击方法
	 * 结果：成功
	 */
	@Test
	public void testRoleAttack(){
		System.out.println();
		System.out.println(role.toString());
		role.getAttack().attack();
	}
	
	/**
	 * 目的：测试角色运行时更换攻击方式
	 * 结果：成功
	 */
	@Test
	public void testRoleChangeAttackWays(){
		System.out.println("更换攻击方式前：");
		System.out.println(role.getAttack().toString());
		role.getAttack().attack();
		
		role.setAttack(new MagicAttack()); //更换攻击方式
		
		System.out.println("更换攻击方式后：");
		System.out.println(role.getAttack().toString());
		role.getAttack().attack();
	}
}
</pre>
<p><br /><br /><span style="color: #ff00ff;">执行结果： <br /><br />===============测试开始============ <br /><br /><br />崔斯特 现在的状态为： <br />血量：100 <br />魔法：100 <br />经验：0 <br /><br />使用大剑对单位造成攻击！ <br /><br />===============测试结束============ <br /><br />===============测试开始============ <br /><br />更换攻击方式前： <br />攻击方式：大剑攻击 <br />使用大剑对单位造成攻击！ <br />更换攻击方式后： <br />攻击方式：魔法攻击 <br />使用魔法对单位造成攻击！ <br /><br />===============测试结束============</span></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://iamzealotwang.javaeye.com/blog/230831#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 20:49:52 +0800</pubDate>
        <link>http://iamzealotwang.javaeye.com/blog/230831</link>
        <guid>http://iamzealotwang.javaeye.com/blog/230831</guid>
      </item>
      <item>
        <title>今天终于忍不住 把项目从 Rails2.0 升级到 Rails2.1 </title>
        <author>open2ye</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://agi-alvin.javaeye.com">open2ye</a>&nbsp;
          链接：<a href="http://agi-alvin.javaeye.com/blog/230784" style="color:red;">http://agi-alvin.javaeye.com/blog/230784</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          更新完 vendor/rails <br />更新完 一大堆的插件(这里最麻烦)<br /><br />本地测试过后,上传到服务器.时却遇到又有麻烦<br /><br />1. gem 要升级到 1.2 <br />2. 运行 mongrel 时提示 mongrel 找不到?? 奇怪我只是升级 gem 怎么 mongrel 没了<br />3. 重装吧 gem install mongrel<br />4. rake 也和 mongrel 一样 重装 gem install rake<br />5. 再次运行 mongrel_rails cluster::restart 出现<br /><pre name="code" class="java">
ERROR RUNNING 'cluster::restart': Plugin /cluster::restart does not exist in category /commands
Use help command to get help
</pre><br />6. 少插件 ?? google 来 google 去 终于找到了 <br />gem install mongrel_cluster  晕哦.<br /><br /><br />mongrel_rails cluster::restart<br />一切正常<br /><br />总结: gem 升级到 1.2 后可能造成已经装的 gem 系统找不到要重装(或者要重新识别一下)
          <br/>
          <span style="color:red;">
            <a href="http://agi-alvin.javaeye.com/blog/230784#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 17:43:49 +0800</pubDate>
        <link>http://agi-alvin.javaeye.com/blog/230784</link>
        <guid>http://agi-alvin.javaeye.com/blog/230784</guid>
      </item>
      <item>
        <title>JavaScript的灵活性</title>
        <author>贝特虫子</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liangshihong409-126-com.javaeye.com">贝特虫子</a>&nbsp;
          链接：<a href="http://liangshihong409-126-com.javaeye.com/blog/230761" style="color:red;">http://liangshihong409-126-com.javaeye.com/blog/230761</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近刚刚接触JS，发现太灵活了：<br />例如：<br />		var prms = {<br />			lstPractsId : g_CmnGrid.p_lstPractsId,<br />			practType : this.p_typeValue,<br />			displayId:this.fmPnl.getComponent('Displayid').getValue(),<br />			name : this.fmPnl.getComponent('Name').getValue(),<br />			nameEn : this.fmPnl.getComponent('NameEn').getValue(),<br />			unit : this.fmPnl.getComponent('Unit').getValue(),<br />			unitEn : this.fmPnl.getComponent('UnitEn').getValue(),<br />			spec : this.fmPnl.getComponent('Spec').getValue(),<br />			specEn : this.fmPnl.getComponent('SpecEn').getValue(),<br />			price : this.fmPnl.getComponent('Price').getValue()<br />		};<br />完全可以改写为：<br />		var prmsTmp;<br />		var prmsCmn = ['Displayid', 'Name', 'NameEn', 'Unit', 'UnitEn', 'Spec','SpecEn', 'Price'];<br />		var prms = {<br />			lstPractsId : g_CmnGrid.p_lstPractsId,<br />			practType : this.p_typeValue,<br />		};<br />		for (i = 0; i &lt; prmsCmn.length; i++) {<br />			prms[prmsCmn[i]] = this.fmPnl.getComponent(prmsCmn[i]).getValue();<br />}<br />省了我好几行代码...<br />动态语言真是个好东西...<br />应该好好学习...
          <br/>
          <span style="color:red;">
            <a href="http://liangshihong409-126-com.javaeye.com/blog/230761#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 16:54:20 +0800</pubDate>
        <link>http://liangshihong409-126-com.javaeye.com/blog/230761</link>
        <guid>http://liangshihong409-126-com.javaeye.com/blog/230761</guid>
      </item>
      <item>
        <title>约化儒略日(MJD)的javascript计算</title>
        <author>Cranberry</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cranberry.javaeye.com">Cranberry</a>&nbsp;
          链接：<a href="http://cranberry.javaeye.com/blog/230724" style="color:red;">http://cranberry.javaeye.com/blog/230724</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          儒略日(JD)是一种不用年、月的长期纪日法。它以倒推到公元前4713年1月1日格林尼治平时正午为起算日期，每天顺数而下。在<br />天文计算中还常采用约化儒略日(MJD)，其定义为 MJD = JD - 2400000.5 <br /><br /><br />引用自 javascript计算MJD<br /><br />var today=new Date();<br />var year=today.getYear();<br />var month=today.getMonth();<br />var day=today.getDate();<br />month+=1;<br />if ((month==1 ) || (month==2)){<br />   year-=1;<br />   month+=12<br />}<br />var A=Math.floor(year/100);     <br />var B=2-A+Math.floor(A/4);  <br />var C=Math.floor(365.25*year)  ;   <br />var D=Math.floor(30.6001*(month+1));<br />var JD=B+C+D+day+1720994.5;<br />var MJD=JD-2400000.5;<br /><br />alert(MJD);
          <br/>
          <span style="color:red;">
            <a href="http://cranberry.javaeye.com/blog/230724#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 15:33:58 +0800</pubDate>
        <link>http://cranberry.javaeye.com/blog/230724</link>
        <guid>http://cranberry.javaeye.com/blog/230724</guid>
      </item>
      <item>
        <title>Servlet 重导定向问题</title>
        <author>looxiaohu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://looxiaohu.javaeye.com">looxiaohu</a>&nbsp;
          链接：<a href="http://looxiaohu.javaeye.com/blog/230722" style="color:red;">http://looxiaohu.javaeye.com/blog/230722</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          response.sendRedirect 与 request.getRequestDispatcher(url).forward(request,response)区别 <br /><br />  服务器端进行转向的4种方法：   <br /><pre name="code" class="java">  1.   ServletContext的getRequestDispatcher()   
  2.   ServletContext的getNamedDispatcher()   
  3.   ServletRequest的getRequestDispatcher()   
  4.   ServletResponse的sendRedirect()进行转向。 </pre>  <br />  1.2.3   功能大于等于   forward() 重导功能<br /> 4.   sendRedirect()           <br />  使用forward方法，因为这些这样比较高效。只有在forward方法不能使用时（比如要转向到一个非本web应用），再使用ServletResponse的sendRedirect()方法。   <br />    <br />  &lt;jsp:fordward>与   sendRedirect   方法的比较   <br />  虽然   &lt;jsp:fordward>与   sendRedirect   方法，都可以将浏览器浏览的网页，重导至另一个网页，但是两者在原理上是不太相同。   <br />  a. &lt;jsp:fordward>   :   动作是利用伺服端，将资料输出至缓冲区的机制，在前一个网页尚未输出到客户端前，取消资料的输出，然后输出另一个网页的资料，达到重导浏览器的效果。   <br />  优点:   两网页间可以分享   request   对象内的变量。   <br />  b. sendRedirect   :   动作是透过   HTTP   协议的   Header   ，   对浏览器下达重导指令，因此，不牵涉到服务器端缓冲区的问题。   <br />  不过由于   sendRedirect   方法作用于客户端，所以重导前后网页无法分享存在于   request   对象内的变量。   <br />  Solution:   response.sendRedirect(“test.jsp?key=view”)   <br />  今天才搞清楚这个原理，ServletResponse就是在客户端响应返回数据，在这里ServletResponse不保留，request.setAttribute()的属性，如果用response.sendRedirect重导话，一些数据最好绑定到session里，数据一多，服务器吃不消，建议用ServletRequest来重导。
          <br/>
          <span style="color:red;">
            <a href="http://looxiaohu.javaeye.com/blog/230722#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 15:32:17 +0800</pubDate>
        <link>http://looxiaohu.javaeye.com/blog/230722</link>
        <guid>http://looxiaohu.javaeye.com/blog/230722</guid>
      </item>
      <item>
        <title>渴望一次旅行</title>
        <author>anglefly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://anglefly.javaeye.com">anglefly</a>&nbsp;
          链接：<a href="http://anglefly.javaeye.com/blog/230717" style="color:red;">http://anglefly.javaeye.com/blog/230717</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">&nbsp;&nbsp;&nbsp; 压抑，似乎已经很久了。从年初开始直到现在，仿佛经历了一场噩梦，却永远无法醒来。母亲走后，心情一直不好，总是不知不觉想起母亲的一颦一笑。可是无论如何，失去的已经失去。虽然自小农村长大，可是因为父母都比较开明，又因为长期接受无神论的教育，所以我心里明白母亲从此不复存在了。常常因为这样想着，感觉到痛得无法呼吸。有时我真希望真的有一个轮回的世界，生生世世，永不停息。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp; 或许安排一次旅行散散心是个不错的主意，昨天闲聊起来，我发现自己突然有一种渴望，渴望融入大自然之中。</span><span lang="EN-US"><span style="font-family: Times New Roman;">07</span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';">年元旦的云南之行，玉龙雪山上明净的天空让我至今记忆犹新。那种纯洁安静之美令人惊叹，也是我一直所渴望的。我不喜欢人多嘈杂的地方。虽然北京风景名胜不少，可是到处人山人海，让喜欢安静的我不胜烦躁。天南海北，我走过很多地方，城市的市区无论大小，在我眼里，区别不大，都是人来人往，熙熙攘攘。因此我宁愿躲在家里或者宾馆里，也不愿意出去逛街。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman';"><span style="font-size: small;">&nbsp;&nbsp;&nbsp; 今年的十一不打算回家了。或许，去海边玩玩。似乎，可以迎着海风，一个人安安静静地沿着海边走，没有尽头。</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://anglefly.javaeye.com/blog/230717#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 15:24:39 +0800</pubDate>
        <link>http://anglefly.javaeye.com/blog/230717</link>
        <guid>http://anglefly.javaeye.com/blog/230717</guid>
      </item>
      <item>
        <title>Maven仓库管理器的重要性</title>
        <author>juvenshun</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://juvenshun.javaeye.com">juvenshun</a>&nbsp;
          链接：<a href="http://juvenshun.javaeye.com/blog/230713" style="color:red;">http://juvenshun.javaeye.com/blog/230713</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天在maven主题的irc中得知，又一个中国的ip被<a href="http://repo1.maven.org/maven2/" target="_blank">中央Maven仓库</a>
封了。原因我猜到了大半，但还是忍不住问一下，回答是：</p>
<div class="quote_title"> </div>
<div class="quote_div">他们消耗了很大的中央仓库带宽，会使之变慢。因此这些人不是良好的Maven公民。</div>
<p>&nbsp;</p>
<p>我也曾经在个人笔记本上直接使用中央Maven仓库，第一次build项目下载了很多东西，可这样并没有被封，说明中央仓库不是很苛刻的，那么是什么样的下载量导致中央仓库的管理员受不了呢？我猜测是某个公司吧，很多人用Maven构建项目，但是自己没有建立一个仓库管理服务器，有太多的重复下载，直接导致占用了很大的带宽。</p>
<p>&nbsp;</p>
<p>那么，请用Maven仓库管理器吧，为了别人，更为了自己。仓库管理器是干什么的？《Maven权威指南》中这样说明：</p>
<div class="quote_title"> </div>
<div class="quote_div">仓库管理器有两个服务目的：首先它的角色是一个高度可配置的介于你的组织与公开Maven仓库之间的代理，其次它为你的组织提供了一个可部署你组织内部生成的构件的地方。</div>
<p>&nbsp;</p>
<p>我略微解释下，首先它是代理，举个有点极端的例子，一百人的公司，每个人从公共Maven仓库下载100M的构件，那么消耗的带宽就是10G，开发者就难免会对着console的下载进程发愣，或者抱怨。还有，如果需要从5个公共仓库构件，那么每个开发者就需要自己配置POM或者settings，那么一共需要配置500次。最后，如果公司的IP对Maven中央仓库造成8G的下载量，那边的管理员为了能给更多人提供服务，只能无奈的封掉你的这个IP。因此这个公司需要维护一个Maven仓库管理器，它代理所有内部Maven的构件请求，并在服务器上维护一份缓存，该公司为所有的构件只向公共仓库请求一次，消耗公网带宽100M，内部请求完全通过LAN搞定，开发者看到进度条刷刷的闪，心情会比较好。此外，所有开发者只需要配置一个指向这个代理的仓库。公共服务器的配置，在仓库管理器维护，这也大大减少的时间。</p>
<p>&nbsp;</p>
<p>Maven仓库管理器的第二个功能是，为组织提供一个部署构件的公共地址，以便共享。一个项目可能分割成5个模块，模块之间相互有依赖，有了仓库管理器，模块A的SNAPSHOT版本可以随时发布到内部仓库上，模块B就能很方便的得到最新的模块A构件。此外，release版本的构件也能很方便的发布，供QA测试等等。</p>
<p>&nbsp;</p>
<p>如果不是一个人玩玩Maven而已，那么仓库管理器是必须的，<a href="nexus.sonatype.org" target="_self">Nexus</a>
是一个比较强大的仓库管理器，<a href="http://www.sonatype.com/book/reference_zh/public-book.html" target="_blank">Maven权威指南</a>
中第十六章详细介绍了仓库管理器和Nexus，翻译内容将于近几日发布。</p>
          <br/>
          <span style="color:red;">
            <a href="http://juvenshun.javaeye.com/blog/230713#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 15:18:23 +0800</pubDate>
        <link>http://juvenshun.javaeye.com/blog/230713</link>
        <guid>http://juvenshun.javaeye.com/blog/230713</guid>
      </item>
      <item>
        <title>Mule的经典实例LoanBroker的学习笔记</title>
        <author>islandoo</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://islandoo.javaeye.com">islandoo</a>&nbsp;
          链接：<a href="http://islandoo.javaeye.com/blog/230700" style="color:red;">http://islandoo.javaeye.com/blog/230700</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="center" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center"><strong style="mso-bidi-font-weight: normal"><span style="font-size: 15pt; font-family: '微软雅黑','sans-serif';">Mule</span></strong><strong style="mso-bidi-font-weight: normal"><span style="font-size: 15pt; font-family: '微软雅黑','sans-serif';">的经典实例<span lang="EN-US">LoanBroker</span>的学习笔记</span></strong></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-align: left;"><strong style="mso-bidi-font-weight: normal"><span style="font-size: 15pt; font-family: '微软雅黑','sans-serif';">&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">最近为了跟上公司发展，要学一下<span lang="EN-US">mule</span>。在了解了<span lang="EN-US">mule</span>的大概情况之后，便看了看<span lang="EN-US">mule</span>的发型包里的一个经典实例<span lang="EN-US">LoanBroker</span>，整理一下笔记，若有写得不准确的地方，还望各位大侠不吝赐教。</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt; TEXT-ALIGN: center"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;</span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1;"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><span lang="EN-US">一&nbsp;&nbsp;&nbsp; 一，安装及部署</span></span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1;"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">1.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">Jdk</span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">。最好<span lang="EN-US">1.5</span>版本以上吧，我比较超前，用的<span lang="EN-US">1.6.</span>安装完成之后配上环境变量。</span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1;"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">Mule</span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">。我下载的是<span lang="EN-US">1.4.4</span>，<span lang="EN-US">1.x</span>的差别不是很大，<span lang="EN-US">2.x</span>的不太了解。然后配上<span lang="EN-US">%MULE_HOME%</span>，把<span lang="EN-US">%MULE_HOME%\bin</span>加进<span lang="EN-US">path</span>变量中。</span></p>
<p class="MsoListParagraph" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo1;"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">Maven</span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">。<span lang="EN-US">Mule</span>的部署支持<span lang="EN-US">ant</span>和<span lang="EN-US">maven</span>，不过还是推荐<span lang="EN-US">maven</span>，<span lang="EN-US">ant</span>还是学生时代记忆了。我的<span lang="EN-US">maven</span>版本是<span lang="EN-US">2.0.7</span>。同样的配置<span lang="EN-US">%MAVEN_HOME%</span>，把<span lang="EN-US">%MAVEN_HOME%\bin</span>加入环境变量。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l1 level1 lfo1"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">二、<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="mso-list: Ignore"><span style="font-family: 微软雅黑;">二、</span></span> </span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">一些说明</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><span style="mso-spacerun: yes">&nbsp; </span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">简单的介绍一下这个应用。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><span lang="EN-US"><img src="../../upload/picture/pic/20325/f7230b92-0ba0-385f-a194-cc3ffeb07ee5.jpg" height="282" alt="" width="554" /></span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<table class="MsoNormalTable" cellspacing="0" border="1" cellpadding="0" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 21pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid black; mso-border-insidev: .5pt solid black">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<td valign="top" width="130" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: small;"><strong><span style="font-family: 'Arial','sans-serif';">Component</span></strong></span></p>
</td>
<td valign="top" width="410" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 307.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: small;"><strong><span style="font-family: 'Arial','sans-serif';">Description</span></strong></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 1">
<td valign="top" width="130" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 9pt; font-family: 'Arial','sans-serif';">Loan Broker Service</span></p>
</td>
<td valign="top" width="410" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 307.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">接受用户的</span><span style="font-size: 9pt; font-family: 'Arial','sans-serif';">LoanRequest </span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">请求（它代表一个用户借款请求），</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">并且负责聚合返回的</span><span style="font-size: 9pt; font-family: 'Arial','sans-serif';">LoanQuote</span><span style="font-size: 9pt; font-family: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;">（</span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">表示单个银行的返回结果</span><span style="font-size: 9pt; font-family: 宋体; mso-bidi-font-family: Arial; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial;">）。</span><span style="font-size: 9pt; font-family: 'Arial','sans-serif';"> </span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 2">
<td valign="top" width="130" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 9pt; font-family: 'Arial','sans-serif';">Credit Agency Service</span></p>
</td>
<td valign="top" width="410" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 307.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">检查用户的借款的数额是否符合要求</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 3">
<td valign="top" width="130" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 9pt; font-family: 'Arial','sans-serif';">Credit Agency Gateway</span></p>
</td>
<td valign="top" width="410" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 307.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">连接总线和<span lang="EN-US">CreditAaencyService</span>的纽带</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 4">
<td valign="top" width="130" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 9pt; font-family: 'Arial','sans-serif';">Lender Service</span></p>
</td>
<td valign="top" width="410" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 307.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">根据用户的信用和申请借款的数额来选择哪些银行接受此次请求。</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 5">
<td valign="top" width="130" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 9pt; font-family: 'Arial','sans-serif';">Lender Gateway</span></p>
</td>
<td valign="top" width="410" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 307.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">（同上上）</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 6; mso-yfti-lastrow: yes">
<td valign="top" width="130" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 97.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 9pt; font-family: 'Arial','sans-serif';">Banking Gateway</span></p>
</td>
<td valign="top" width="410" style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 307.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt">
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">将<span lang="EN-US">loanRequest</span>请求发送到各个指定的银行。</span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><span style="mso-spacerun: yes">&nbsp; </span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><span style="mso-spacerun: yes">&nbsp; </span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-para-margin-left: 2.0gd"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">这个实例的大概业务流程可以参照<span lang="EN-US">mule</span>的官方文档（<span lang="EN-US"><a href="http://www.mulesource.org/display/MULEINTRO/LoanBroker+ESB">http://www.mulesource.org/display/MULEINTRO/LoanBroker+ESB</a></span>），</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l1 level1 lfo1"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">三、<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="mso-list: Ignore"><span style="font-family: 微软雅黑;">三、</span></span></span></span></span><span style="font-size: 12pt;"><span style="font-family: 微软雅黑;">样例演示</span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l1 level1 lfo1"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">1.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="mso-list: Ignore"><span style="font-family: 'Times New Roman';">&nbsp;</span></span></span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">在<span lang="EN-US">%MULE_HOME%</span>目录打开命令行，输入<span lang="EN-US">mvn &ndash;Dmaven.test.skip=true,</span>因为单元测试的代码可能通不过编译，所以最好跳过。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l1 level1 lfo1"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">2.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">编译成功之后，在<span lang="EN-US">%MULE_HOME%\examples\loanbroker</span>目录下双击<span lang="EN-US">loanbroker.bat</span>文件。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">3.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">这个<span lang="EN-US">LoanBroker</span>提供了多个实现，选择<span lang="EN-US">1</span>，回车；</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l3 level1 lfo3">&nbsp;</p>
<p class="MsoListParagraph" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 24pt"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;<img src="../../upload/picture/pic/20327/5b023028-2680-3626-ba98-fdbab705fa6c.jpg" height="105" alt="" width="479" /></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">4.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt;"><span style="font-family: 微软雅黑;">接着<span lang="EN-US">mule</span>的服务器就开启了，如果是第一次启动<span lang="EN-US">mule</span>的话，会有一堆的<span lang="EN-US">license</span>要你来确认，直接回车到底。下面这个页面是关于<span lang="EN-US">EJB</span>的配置，直接选<span lang="EN-US">1.</span></span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><img src="../../upload/picture/pic/20329/bc397f4a-3782-3e66-84e4-3f5c4a053ae7.jpg" height="161" alt="" width="554" /></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">5.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 微软雅黑;"><span style="font-size: 12pt;">EJB</span><span style="font-size: 12pt;">启动之后，便可以发送借款请求了。在这里选<span lang="EN-US">1</span>。然后输入我们的借款请求。</span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><img src="../../upload/picture/pic/20331/14f49ff3-075b-3311-bdad-f23c161a00c0.jpg" height="218" alt="" width="480" />&nbsp;</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">6.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="mso-list: Ignore"><span style="font-family: 'Times New Roman';">&nbsp;</span></span></span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-no-proof: yes;">得到了此次异步调用的结果，如果想看看同步调用有什么不一样的话，可以将<span lang="EN-US">LoanBrokerApp</span>类中的<span lang="EN-US">loanBrokerApp.run(false)</span>改为<span lang="EN-US">true</span>。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><img src="../../upload/picture/pic/20333/f2bc356b-3ac3-3557-8cb1-971086d2e1a2.jpg" height="78" alt="" width="554" />&nbsp;</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l1 level1 lfo1"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">四、<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="mso-list: Ignore"><span style="font-family: 微软雅黑;">四、</span></span></span></span></span><span style="font-size: 12pt;"><span style="font-family: 微软雅黑;">步骤的解析</span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l1 level1 lfo1">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l1 level1 lfo1"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">1.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 微软雅黑;"><span style="font-size: 12pt;">Maven</span><span style="font-size: 12pt;">编译部署后的结构图如下：</span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><span lang="EN-US"><img src="../../upload/picture/pic/20335/6214e5e0-cfff-38c1-9994-d8a95d055eb4.jpg" height="123" alt="" width="303" /></span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 60pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中我们只需要关注<span lang="EN-US">esb</span>，而<span lang="EN-US">bpm</span>和<span lang="EN-US">esn</span>我们不去管它。<span lang="EN-US">Creditagency</span>是个<span lang="EN-US">EJB</span>的工程，可以把它看做一个黑盒，不去管它。重点关注<span lang="EN-US">esb</span>和<span lang="EN-US">common</span>两个工程。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">2.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">Esb</span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">工程中有一个很重要的文件&mdash;&mdash;<span lang="EN-US">mule</span>的配置文件<span lang="EN-US">loan-broker-esb-mule-config.xml</span>。这个配置文件的配置项无非分为两个部分。一个是<span lang="EN-US">mule</span>的<span lang="EN-US">model</span>的配置，比如，<span lang="EN-US">&lt;mule-descriptor/&gt;</span>它代表了一个<span lang="EN-US">UMO</span>组件的配置；另一个就是<span lang="EN-US">mule</span>的<span lang="EN-US">Transport</span>的配置，包括<span lang="EN-US">trasformer</span>，<span lang="EN-US">filer</span>，<span lang="EN-US">provider</span>的配置。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">当程序启动以后，由于我们选择的是<span lang="EN-US">1</span>（发送一个标准的借贷请求），所以程序会调用<span lang="EN-US">client.dispatch("CustomerRequests", request, <strong>null</strong>);</span>来发送一个异步请求，其中<span lang="EN-US">client</span>是一个<span lang="EN-US">MuleClient</span>对象，它可以向<span lang="EN-US">MuleServer</span>发送和接受事件对象。<span lang="EN-US">request</span>是我们已经封装好的<span lang="EN-US">CustomerQuoteRequest</span>对象，也就是我们的消息对象；<span lang="EN-US">"CustomerRequests"</span>是事件目的<span lang="EN-US">url</span>，系统会根据这个<span lang="EN-US">url</span>将事件发送到<span lang="EN-US">vm://customer.requests</span>。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">3.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 微软雅黑;"><span style="font-size: 12pt;">Mule</span><span style="font-size: 12pt;">会把这个事件交给<span lang="EN-US">LoanBroker</span>组件来处理，因为它的<span lang="EN-US">inbound-router</span>的<span lang="EN-US">endpoint</span>配置为<span lang="EN-US">vm://customer.requests</span>。那么<span lang="EN-US">LoanBroker</span>组件拿到这个事件之后如何来处理这个事件呢？在<span lang="EN-US">Mule</span>的官方文档上有这样一句话：</span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4"><span style="font-family: 微软雅黑;"><span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-size: 12pt;">When an event is received for your component Mule dynamically chooses the method to invoke based on the payload type of the event.</span></span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也就是说<span lang="EN-US">mule</span>会根据事件的<span lang="EN-US">payload</span>的种类来选择具体调用的<span lang="EN-US">component</span>的方法，在<span lang="EN-US">AsynchronousLoanBroker</span>我们找到了这个方法<span lang="EN-US">public Object getLoanQuote(CustomerQuoteRequest request) throws LoanBrokerException</span>，而它刚好符合我们的要求。这个方法主要是根据用户的输入生成一个<span lang="EN-US">LoanBrokerQuoteRequest</span>对象并返回。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">4.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="mso-list: Ignore"><span style="font-family: 'Times New Roman';">&nbsp;</span></span></span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">这个方法调用结束之后事件再如何进行呢？在官方文档上又有这一句：</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The response or outbound message is obtained using the following - </span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">If the method invoked is not void, (Callable.onEvent() returns an Object) the method return value is used. If null is returned no further processing is done for the current request. </span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">If the method is void, the parameters used to invoke the method are used. This assumes that the parameters themselves were altered or there was no change to the event. </span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">5.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 12pt;"><span style="font-family: 微软雅黑;">我们这里的方法是有返回值的，所以将方法的返回值作为<span lang="EN-US">outbound message</span>。注意此时事件的<span lang="EN-US">payload</span>已经为<span lang="EN-US">LoanBrokerQuoteRequest</span>了。</span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">6.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 12pt;"><span style="font-family: 微软雅黑;">注意看<span lang="EN-US">LoanBroker</span>的<span lang="EN-US">outbound</span>的类型为<span lang="EN-US">OutboundPassThroughRouter</span>，它不做任何处理将事件传给<span lang="EN-US">endpoint </span>&mdash;&mdash;<span lang="EN-US">CreditAgencyGateway</span>。</span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">7.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-size: 12pt;"><span style="font-family: 微软雅黑;">事件会根据配置传到<span lang="EN-US">CreditAgencyGateway</span>这个<span lang="EN-US">component</span>里。这个实现类的实现类为<span lang="EN-US">ReflectionMessageBuilder</span>，文档上对这个类的解释为：</span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Will try and set the result of an invocation as a bean property on the request message using reflection.</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也就是说将在这个<span lang="EN-US">component</span>会将方法调用的结果设置为消息的一个属性，也就是<span lang="EN-US">LoanBrokerQuoteRequest</span>的一个属性。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里的<span lang="EN-US">outbound</span>有两个<span lang="EN-US">endpoint</span>，第一个<span lang="EN-US">endpoint</span>是发送到一个<span lang="EN-US">EJB</span>组件，该组件会根据<span lang="EN-US">LoanBrokerQuoteRequest</span>来判断用户的信用程度，并将信用信息以<span lang="EN-US">xml</span>字符串的形式返回，然后会调用<span lang="EN-US">CreditProfileXmlToCreditProfile</span>这一<span lang="EN-US">trasformer</span>来将<span lang="EN-US">String</span>类型的对象转换为<span lang="EN-US">CreditProfile</span>这一代表用户信用度的对象。结果返回后，将第一个返回结果<span lang="EN-US">CreditProfile</span>对象设置为<span lang="EN-US">LoanBrokerQuoteRequest</span>的一个属性，然后再将这个<span lang="EN-US">LoanBrokerQuoteRequest</span>发送到第二个<span lang="EN-US">endpoint</span>&mdash;&mdash;<span lang="EN-US">LenderGateway</span>。注意一下第一个<span lang="EN-US">endpoint</span>有一个属性<span lang="EN-US">remoteSync="true&rdquo;</span>，它表示<span lang="EN-US">component</span>将消息同步发送给第一个<span lang="EN-US">endpoint</span>，在结果返回前必须等待，否则发往<span lang="EN-US">LenderGateway</span>的事件里<span lang="EN-US">LoanBrokerQuoteRequest</span>对象的<span lang="EN-US">CreditProfile</span>属性就还没有设置了哦！</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">8.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;<span style="mso-list: Ignore"><span style="font-family: 'Times New Roman';">&nbsp;</span></span></span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">事件这一步就到了<span lang="EN-US">LenderGateway</span>这个<span lang="EN-US">component</span>了（<span lang="EN-US">mule</span>是根据<span lang="EN-US">endpoint</span>的配置来判断事件的流向，这里只不过名字<span lang="EN-US">component</span>的名字和<span lang="EN-US">endpoint</span>的名字设置为一样的了），这个<span lang="EN-US">component</span>的<span lang="EN-US">UMO</span>为<span lang="EN-US">BridgeComponent</span>，它会告诉<span lang="EN-US">mule</span>它永远不会被调用，只是简单的将<span lang="EN-US">inbound-endpoint</span>的输出作为<span lang="EN-US">outbound-endpoint</span>的输入，由于它永远不会被调用，所以性能上会表现比较好。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">9.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="mso-list: Ignore"><span style="font-family: 'Times New Roman';">&nbsp;</span></span></span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">这个<span lang="EN-US">component</span>的<span lang="EN-US">outbound</span>的类型为<span lang="EN-US">ChainingRouter</span>，它往往有多个<span lang="EN-US">endpoint</span>，会将上一个<span lang="EN-US">endpoint</span>的输出作为下一个<span lang="EN-US">endpoint</span>的输入。它首先会通过<span lang="EN-US">LenderService</span>，根据用户的信用度和具体的借款额度来选择可以对用户提供借贷的银行列表。根据上面讨论的规则，会调用<span lang="EN-US">DefaultLender</span>类的<span lang="EN-US">setLenderList</span>方法，由于该方法没有返回值，直接将此<span lang="EN-US">LoanBrokerQuoteRequest</span>作为下一个<span lang="EN-US">endpoint</span>的输入。第二个<span lang="EN-US">endpoint BankingGateway</span>将依次调用<span lang="EN-US">SetLendersAsRecipients </span>（下一步将详细表述），<span lang="EN-US">ObjectToJMSMessage</span>（将对象转化为<span lang="EN-US">JMS</span>消息的格式）。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-list: l2 level1 lfo4"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">10.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;&nbsp;&nbsp;<span style="mso-list: Ignore"><span style="font-family: 'Times New Roman';"> </span></span></span></span></span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">BankingGateway</span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">这个<span lang="EN-US">component</span>的<span lang="EN-US">outbound</span>的类型为<span lang="EN-US">StaticRecipientList</span>，它会根据静态配置的<span lang="EN-US">endpoint</span>来群发消息，但细细一看配置文件中也没有相关的配置啊！！其实，在上一步调用<span lang="EN-US">SetLendersAsRecipients</span>的如下代码：</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-para-margin-left: 1.71gd"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">context.getMessage().setProperty(StaticRecipientList.<em>RECIPIENTS_PROPERTY</em>, <span style="text-decoration: underline;">recipients</span>);</span><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">其中<span lang="EN-US">recipient</span>为<span lang="EN-US">String</span>类型的银行列表。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-para-margin-left: 1.71gd"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意到这个<span lang="EN-US">endpoint</span>有个配置<span lang="EN-US">&lt;reply-to address="LoanQuotes"/&gt;</span>，它表示每个银行返回的结果都发送到这个<span lang="EN-US">endpoint</span>中。</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-para-margin-left: 1.71gd">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-para-margin-left: 1.71gd"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif'; mso-bidi-font-family: 微软雅黑;"><span style="mso-list: Ignore">11.<span style="font-family: 'Times New Roman';">&nbsp;&nbsp;</span></span></span><span style="font-size: 12pt;"><span style="font-family: 微软雅黑;">回头去看<span lang="EN-US">LoanBroker</span>这个<span lang="EN-US">component</span>有个配置如下：</span></span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-para-margin-left: 1.71gd"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&lt;response-router timeout="1000000"&gt;</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-para-margin-left: 1.71gd"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>&lt;endpoint address="LoanQuotes"/&gt;</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 29.95pt; TEXT-INDENT: -12pt; TEXT-ALIGN: left; mso-char-indent-count: -1.0; mso-para-margin-left: 1.71gd"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>&lt;router className="org.mule.examples.loanbroker.</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 29.9pt; TEXT-INDENT: 36pt; TEXT-ALIGN: left; mso-char-indent-count: 3.0; mso-para-margin-left: 2.85gd"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">routers.BankQuotesResponseAggregator"/&gt;</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 17.95pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0; mso-para-margin-left: 1.71gd"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">&lt;/response-router&gt;</span></p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0">&nbsp;</p>
<p class="MsoListParagraph" align="left" style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: 0cm; TEXT-ALIGN: left; mso-char-indent-count: 0"><span style="font-size: 12pt; font-family: '微软雅黑','sans-serif';">这个<span lang="EN-US">response router</span>的作用其实就是将各个银行返回的结果进行汇总，然后呈现给用户看。</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://islandoo.javaeye.com/blog/230700#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 14:41:41 +0800</pubDate>
        <link>http://islandoo.javaeye.com/blog/230700</link>
        <guid>http://islandoo.javaeye.com/blog/230700</guid>
      </item>
      <item>
        <title>一次面试经历</title>
        <author>aqining</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://aqining.javaeye.com">aqining</a>&nbsp;
          链接：<a href="http://aqining.javaeye.com/blog/230696" style="color:red;">http://aqining.javaeye.com/blog/230696</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天是来日本以后第一次到日本公司面试。面试后对自己没有任何感觉，就一个字，累！</p>
<p>&nbsp;</p>
<p>我毕业于国内二流大学，四年工作经验。在国内的时候，技术在公司算是比较好的。日语2级左右，口语和听力比较好。在日本前前后后干了2年左右。第一次想跳槽，想换个做中间件的日本公司。通过朋友介绍，得到了某个公司offer.</p>
<p>&nbsp;</p>
<p>本来很担心日语问题，结果对方说的，基本都搞明白了，自认为回答的也比较得体。后来一个技术部门的老大来提问，问了一些比较基础的内容，类加载，反射，OO,Cache和事务，还有一些比较新的技术Rails,基础的部分回答感觉还可以，Grails不懂，所以直接放弃，感觉还算满意。</p>
<p>&nbsp;</p>
<p>后来比较变态的地方来了，直接上机考试，我本以为是一个算法之类的东西，结果开始做了，才吓了一跳。</p>
<p>第一项四则运算，全是小学生的加减法，9分钟，80题，根本搞不定，时间严重不够，好像做了40题左右，就直接跳到第二项了。</p>
<p>&nbsp;</p>
<p>第二项图论，都是类似于IQ测试的题目，这个方面以前在Facebook的IQ测试出139的智商，本来还比较自信，结果还是时间不够，只完成1/2左右。</p>
<p>&nbsp;</p>
<p>第三项变化题，类似于图论，A图形结果某些管道之后，变成了A1,B经过其他几个相关管道之后，变成了B1,让你计算这个管道是用来干吗的，然后题目是C图形经过几个管道之后便成什么样子。规律还比较好找，但是还是时间不够。只完成了1/2左右。</p>
<p>&nbsp;</p>
<p>第四项命令题，是在第三项基础上加深了一层，不仅要考虑图形的变化，还要考虑排列的顺序，被雷到了，只完成了1/3左右。</p>
<p>&nbsp;</p>
<p>第五项，自我总结选择，大概是测试性格之类一些题目，68题，无时间限制，很多问题出现了5次，6次，甚至更多。可能是文化上的差异