﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Java天空 任我翱翔-随笔分类-OFBiz</title><link>http://www.blogjava.net/persister/category/37332.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 13 Sep 2010 08:02:06 GMT</lastBuildDate><pubDate>Mon, 13 Sep 2010 08:02:06 GMT</pubDate><ttl>60</ttl><item><title>OFBiz的MVC框架</title><link>http://www.blogjava.net/persister/archive/2010/08/27/253196.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Fri, 27 Aug 2010 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2010/08/27/253196.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/253196.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2010/08/27/253196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/253196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/253196.html</trackback:ping><description><![CDATA[<p>OFBiz是一个非常强大的企业架构体系，这里只描述它MVC方面的内容，从MVC的角度去看，OFBiz采用的是<a style="color: #0000ff;" href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/ServiceToWorker.html">Service to Worker</a>模式，大名鼎鼎的<a href="http://struts.apache.org/">Struts 1</a>采用的也是这种架构。Service to Worker模式的目标就是维护Action，View和Controller之间的分离。<br />
<br />
<strong>Controller</strong></p>
<p>ControlServlet是<a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html">Front Controller</a>，
接收所有的请求，是请求的入口，执行一些的预备处理后，交由RequestHandler去处理实际的请求工作，View层的处理交给
ViewHandler进行处理，ViewHandler有很多实现类，还可以自定义，可以集成很多页面层显示技术，如JSP和FreeMarker等，
处理流程如下图所示：<br />
</p>
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/untitled2.JPG" width="527" height="188" /><br />
<p>MVC的解耦的地方就是通过controller.xml配置文件实现的，配置文件如下所示：</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">request-map&nbsp;</span><span style="color: #ff0000;">uri</span><span style="color: #0000ff;">="login"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">security&nbsp;</span><span style="color: #ff0000;">https</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;">&nbsp;auth</span><span style="color: #0000ff;">="false"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">event&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="java"</span><span style="color: #ff0000;">&nbsp;path</span><span style="color: #0000ff;">="com.xxx.ldap.LdapLoginWorker"</span><span style="color: #ff0000;">&nbsp;invoke</span><span style="color: #0000ff;">="login"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">response&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="success"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="view"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="main"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">response&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="error"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="view"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="login"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">request-map</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">view-map&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="main"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="screen"</span><span style="color: #ff0000;">&nbsp;page</span><span style="color: #0000ff;">="component://xxx/widget/CustomerScreens.xml#main"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">view-map&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="login"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="screen"</span><span style="color: #ff0000;">&nbsp;page</span><span style="color: #0000ff;">="component://xxx/widget/CommonScreens.xml#login"</span><span style="color: #0000ff;">/&gt;</span></div>
<p>request-map的response元素有一个属性name，这个name理论上可以任意选取，不过OFBiz内置了success和
error这两个值，这类似于Struts
2。属性type如果是view表示得到一个页面，value值对于view-map中的name属性值。之所以不直接写上页面，而是增加view-
map，一是为了解耦，二是针对不同的view，可以设置不同的type等属性。type属性很关键，正是这个属性帮助OFBiz集成不同的显示层技术。
common-controller定义了不同的type和其对应的ViewHandler：</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;view&nbsp;handlers&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="screen"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="view"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.ofbiz.widget.screen.ScreenWidgetViewHandler"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="screenfop"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="view"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.ofbiz.widget.screen.ScreenFopViewHandler"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="screenxml"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="view"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.ofbiz.widget.screen.ScreenXmlViewHandler"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="screentext"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="view"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.ofbiz.widget.screen.ScreenTextViewHandler"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="jsp"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="view"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.ofbiz.webapp.view.JspViewHandler"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="ftl"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="view"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.ofbiz.webapp.ftl.FreeMarkerViewHandler"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">handler&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="http"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="view"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.ofbiz.webapp.view.HttpViewHandler"</span><span style="color: #0000ff;">/&gt;</span></div>
<p>这里的name就对应view map中的type。实现解耦的类不是Front
Controller而是RequestHandler，请求代理类，在这里负责读取controller.xml文件中的对应关系，根据Front
Controller发送过来的请求，选择相应的业务动作进行业务更新，并且选择相应的视图View去解析并展示。在Service to
Worker模式中，RequestHandler类的角色就是Dispatcher。<br />
</p>
<p><br />
</p>
<strong>View</strong><br />
OFBiz支持很多类型的页面展示技术，JSP/FreeMarker/Velocity/PDF/Widget等。OFBiz最常用的就是Widget和<a href="http://www.freemarker.org/">FreeMarker</a>。Widget是OFBiz自己特有的页面技术，好处就是可以不用写任何html和css代码就可以得到一个统一的完整的页面，展示的业务数据也可以轻松的获取。缺点是：不像FreeMarker是一个纯页面技术，从request和session中得到业务数据，然后直接将其展示处理。Widget技术将业务数据获取和业务数据展示混在一起，后台开发人员和页面设计人员不能合作分工，甚至只有后台设计人员才能开发OFBiz应用。OFBiz之所以设计自己的页面技术，与OFBiz实现ERP/CRM复杂的业务系统时分不开的。ERP/CRM业务系统复杂多变，模块众多。什么样的框架能够满足这样的系统呢：一是适应业务变化，第二适合快速开发，第三页面风格能够一致。OFBiz就是这样的框架，entity添加减少一个字段，在OFBiz中只需要在entitymodel中做修改，在输入页面，显示页面，修改页面都不用做任何的修改就可以看到变化，而且业务逻辑模块也不用修改就可以对变化的字段进行维护，非常的Easy。OFBiz适合快速开发，熟悉了OFBiz开发的人员，开发一个Customer模块，对用户进行增删改和复杂的查询，一个小时足够，够快了吧。由于不直接操作html和css代码，使用OFBiz开发的各个模块都长得一样，这是很多设计人员期望的。言归正传，还是从技术上分析View的设计。前面说了通过实现ViewHandler接口，OFBiz集成了不同的页面技术以供选择。相关的类关系图如下：<br />
<br />
<strong>View Handler:</strong><br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/viewhandler.JPG" width="650" height="357" /><br />
<br />
ViewHandler负责选择相应的Renderer，进行页面显示的准备工作,对于简单的页面技术如JSP，JspViewHandler直接进行处理，不再委托给其他Renderer进行处理。AbstractViewHandler的子类中，包含Screen字眼的Handler通常相对较复杂，见上图中下面哪些Handler，典型的是ScreenWidgetViewHandler。<br />
<br />
<strong>View Renderer:</strong><br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/renderer.JPG" width="581" height="489" /><br />
<br />
Renderer负责具体的显示工作。<br />
<br />
<br />
未完待续<br />
<br />
<br />
<br />
<p><strong><br />
</strong></p>
<strong> </strong>
<img src ="http://www.blogjava.net/persister/aggbug/253196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2010-08-27 22:32 <a href="http://www.blogjava.net/persister/archive/2010/08/27/253196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OFBiz中JOB的运行机制</title><link>http://www.blogjava.net/persister/archive/2010/02/26/313974.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Fri, 26 Feb 2010 03:17:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2010/02/26/313974.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/313974.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2010/02/26/313974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/313974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/313974.html</trackback:ping><description><![CDATA[OFBiz执行后台任务的类在org.ofbiz.service.job中。<br />
<br />
JobPoller和JobInvoker是主要的两个类，一个负责查询可以执行的Job，另一个执行Job任务。Job类图如下所示。<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/job1.JPG" width="504" height="314" /><br />
<br />
<strong>1.Job轮询</strong><br />
<br />
创建JobManager时，会创建JobPoller的一个实例。JobPoller实现了Runnable接口，以此创建线程后<br />
通过JobManager一直轮询是否有Job需要执行，如果有奖将其放入队列中。<br />
<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">synchronized</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;run()&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;wait&nbsp;30&nbsp;seconds&nbsp;before&nbsp;the&nbsp;first&nbsp;poll</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.lang.Thread.sleep(</span><span style="color: rgb(0, 0, 0);">30000</span><span style="color: rgb(0, 0, 0);">);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">while</span><span style="color: rgb(0, 0, 0);">&nbsp;(isRunning)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;grab&nbsp;a&nbsp;list&nbsp;of&nbsp;jobs&nbsp;to&nbsp;run.</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">Job</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;pollList&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;jm.poll();<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Debug.logInfo("Received&nbsp;poll&nbsp;list&nbsp;from&nbsp;JobManager&nbsp;["&nbsp;+&nbsp;pollList.size()&nbsp;+&nbsp;"]",&nbsp;module);</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(Job&nbsp;job&nbsp;:&nbsp;pollList)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(job.isValid())&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queueNow(job);<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">Debug.logInfo("Job&nbsp;["&nbsp;+&nbsp;job.getJobId()&nbsp;+&nbsp;"]&nbsp;is&nbsp;queued",&nbsp;module);</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;NOTE:&nbsp;using&nbsp;sleep&nbsp;instead&nbsp;of&nbsp;wait&nbsp;for&nbsp;stricter&nbsp;locking</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.lang.Thread.sleep(pollWaitTime());<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.logError(e,&nbsp;module);<br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stop();<br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;</div>
<br />
queueNow方法将要执行job放入到队列中，如果队列中的等待执行的job数量很多，那么就创建一定数量的线程执行这些job。<br />
<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;queueNow(Job&nbsp;job)&nbsp;{<br />
&nbsp;</span>2<span style="color: rgb(0, 0, 0);"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">synchronized</span><span style="color: rgb(0, 0, 0);">&nbsp;(run)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;run.add(job);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(Debug.verboseOn())&nbsp;Debug.logVerbose(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">New&nbsp;run&nbsp;queue&nbsp;size:&nbsp;</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">&nbsp;run.size(),&nbsp;module);<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(run.size()&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;pool.size()&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;pool.size()&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;maxThreads())&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">synchronized</span><span style="color: rgb(0, 0, 0);">&nbsp;(pool)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(run.size()&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;pool.size()&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;pool.size()&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;maxThreads())&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;calcSize&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(run.size()&nbsp;</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">&nbsp;jobsPerThread())&nbsp;</span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);">&nbsp;(pool.size());<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;addSize&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;calcSize&nbsp;</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;maxThreads()&nbsp;</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);">&nbsp;maxThreads()&nbsp;:&nbsp;calcSize;<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">for</span><span style="color: rgb(0, 0, 0);">&nbsp;(</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">&nbsp;addSize;&nbsp;i</span><span style="color: rgb(0, 0, 0);">++</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JobInvoker&nbsp;iv&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JobInvoker(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">,&nbsp;invokerWaitTime());<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool.add(iv);<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span></div>
<br />
JobInvoker就是执行的线程，它从queue中取job并执行。JobInvoker线程不是一直运行下去，运行的时间长度超过一定的值（见serviceengine.xml中ttl的值）线程就会停止并从pool中删除。JobInvoker的run方法中job.exec()执行具体的任务。<br />
<br />
<br />
<strong>2.Job执行</strong><br />
<br />
Job类都有一个exec方法，用户执行Job的service。如GenericServiceJob中的exec方法如下：<br />
<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;exec()&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;InvalidJobException&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;no&nbsp;transaction&nbsp;is&nbsp;necessary&nbsp;since&nbsp;runSync&nbsp;handles&nbsp;this</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;get&nbsp;the&nbsp;dispatcher&nbsp;and&nbsp;invoke&nbsp;the&nbsp;service&nbsp;via&nbsp;runSync&nbsp;--&nbsp;will&nbsp;run&nbsp;all&nbsp;ECAs</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LocalDispatcher&nbsp;dispatcher&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;dctx.getDispatcher();<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);">String,&nbsp;Object</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;result&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;dispatcher.runSync(getServiceName(),&nbsp;getContext());<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;check&nbsp;for&nbsp;a&nbsp;failure</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;isError&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;ModelService.RESPOND_ERROR.equals(result.get(ModelService.RESPONSE_MESSAGE));<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(isError)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;errorMessage&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;(String)&nbsp;result.get(ModelService.ERROR_MESSAGE);<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.failed(</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Exception(errorMessage));<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(requester&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requester.receiveResult(result);<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(Throwable&nbsp;t)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;pass&nbsp;the&nbsp;exception&nbsp;back&nbsp;to&nbsp;the&nbsp;requester.</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(requester&nbsp;</span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;requester.receiveThrowable(t);<br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;call&nbsp;the&nbsp;failed&nbsp;method</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.failed(t);<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">&nbsp;call&nbsp;the&nbsp;finish&nbsp;method</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.finish();<br />
</span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;</div>
<br />
在执行service执行，有一个init方法，在PersistedServiceJob类中init方法主要是生成下一个执行的任务，如果有的话。也即是说每一个job是由当时执行的这个job生成的，根据是什么呢？主要是两个变量：tempExprId和maxRecurrenceCount，init方法中：<br />
&nbsp;&nbsp; &nbsp;<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;TemporalExpression&nbsp;expr&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&#8230;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(expr&nbsp;</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">null</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">&amp;&amp;</span><span style="color: rgb(0, 0, 0);">&nbsp;UtilValidate.isNotEmpty(job.getString(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">tempExprId</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)))&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expr&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;TemporalExpressionWorker.getTemporalExpression(</span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.delegator,&nbsp;job.getString(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">tempExprId</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">));<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">&nbsp;(GenericEntityException&nbsp;e)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;RuntimeException(e.getMessage());<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;</div>
<br />
TemporalExpressionWorker里面有一个makeTemporalExpression方法很重要，从这个方法可以知道怎么配置TemporalExpression实体数据了，当然要结合TemporalExpressions类，里面定义了各种配置的细节。<br />
<br />
tempExprTypeId有如下几种：<br />
<br />
DateRange<br />
DayInMonth<br />
DayOfMonthRange<br />
DayOfWeekRange<br />
Difference<br />
Frequency<br />
Intersection<br />
MonthRange<br />
TimeOfDayRange<br />
Union<br />
<br />
比如如果希望服务只执行一次，可以如下配置：<br />
&nbsp;&nbsp;&nbsp; &lt;TemporalExpression tempExprId="RUNONCE" tempExprTypeId="FREQUENCY" integer1="1" integer2="1"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;JobSandbox jobId="CurrencyRateSynAll" jobName="Currency Rate SynAll" runTime="2010-02-26 09:38:00.000" serviceName="currencyRateSynAll" poolId="pool" runAsUser="system" tempExprId="RUNONCE" maxRecurrenceCount="0"/&gt;<br />
<br />
maxRecurrenceCount="0" 表示，不重复。tempExprTypeId="FREQUENCY" integer1="1" integer2="1"表示一年执行一次。所以总共执行一次就结束了。<br />
<br />
每天都执行可以这样配置：<br />
<br />
&lt;TemporalExpression tempExprId="MIDNIGHT_DAILY" tempExprTypeId="TIME_OF_DAY_RANGE" string1="20:00:00" string2="20:00:00"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;JobSandbox jobId="MailNotification" jobName="Mail Notification Job" runTime="2010-02-25 18:00:00.000" serviceName="mailNotificantion" poolId="pool" runAsUser="system" tempExprId="MIDNIGHT_DAILY" maxRecurrenceCount="-1"/&gt;<br />
<br />
maxRecurrenceCount="-1"表示无限循环下去。tempExprId="MIDNIGHT_DAILY" tempExprTypeId="TIME_OF_DAY_RANGE" string1="20:00:00" string2="20:00:00"/&gt;表示每天晚上八点执行。<br />
<br />
每个月一次任务可以如下配置：<br />
<br />
&lt;TemporalExpression tempExprId="ONCEINMONTH" tempExprTypeId="FREQUENCY" date1="2010-02-26 11:05:00.000" integer1="2" integer2="1"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;JobSandbox jobId="CurrencyRateSyn" jobName="Currency Rate Syn" runTime="2010-02-26 11:05:00.000" serviceName="currencyRateSyn" poolId="pool" runAsUser="system" tempExprId="ONCEINMONTH" maxRecurrenceCount="-1"/&gt;<br />
<br />
tempExprTypeId="FREQUENCY" date1="2010-02-26 11:05:00.000" integer1="2" integer2="1"表示每月一次，时间就是date1定义的时间，如果没用定义date1，那么就是当前时间。<br />
<br />
这里的配置相当灵活，好好掌握。<br />
&nbsp;&nbsp;&nbsp; <br />
<img src ="http://www.blogjava.net/persister/aggbug/313974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2010-02-26 11:17 <a href="http://www.blogjava.net/persister/archive/2010/02/26/313974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OFBiz中services调用机制</title><link>http://www.blogjava.net/persister/archive/2010/02/24/313799.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Wed, 24 Feb 2010 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2010/02/24/313799.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/313799.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2010/02/24/313799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/313799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/313799.html</trackback:ping><description><![CDATA[OFBiz业务方法里面，当执行一个service的时候，通常采用如下的方式：<br />
<br />
&nbsp;&nbsp; &nbsp;LocalDispatcher dispatcher = dctx.getDispatcher();<br />
&nbsp;&nbsp; &nbsp;Map&lt;String, Object&gt; result = dispatcher.runSync(getServiceName(), getContext());<br />
<br />
LocalDispatcher是本地调度器，实现服务的同步异步调度和定时任务的调度。与服务调度相关的类图如下：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/Dispatcher1.JPG" /><br />
<br />
LocalDispatcher是一个接口，实例化的都是GenericDispatcher类，ContextFilter实现了Servlet
Filter，会初始化一个GenericDispatcher,并将其存放在ServletContext中，以备整个应用使用。<br />
在请求处理过程中，如果遇到service的event，那么EventHandler会使用LocalDispatcher执行service。<br />
实际上GenericDispatcher只是一个Proxy，自己并不处理相关的调度工作，真正最苦最累的调度工作是由ServiceDispatcher完成的。下面具体研究一下Dispatcher同步和异步调用方法的实现代码：<br />
<br />
<strong>1.同步调用</strong><br />
<br />
通过dispatcher调用runSync方法，也即是调用GenericDispatcher的runSync方法：<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @see org.ofbiz.service.LocalDispatcher#runSync(java.lang.String, java.util.Map)<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; public Map&lt;String, Object&gt; runSync(String serviceName, Map&lt;String, ? extends Object&gt; context) <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; throws ServiceValidationException, GenericServiceException<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ModelService service = ctx.getModelService(serviceName);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return dispatcher.runSync(this.name, service, context);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
dispatcher实际是ServiceDispatcher对象。ServiceDispatcher的runSync方法有三百多行，比较复杂，<br />
但最终调用service的是GenericEngine。<br />
<br />
&nbsp;&nbsp; &nbsp;GenericEngine engine = this.getGenericEngine(modelService.engineName);<br />
&nbsp;&nbsp; &nbsp;&#8230;&#8230;<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;Map&lt;String, Object&gt; invokeResult = engine.runSync(localName, modelService, context);<br />
&nbsp;&nbsp; <br />
GenericEngine是其工厂类GenericEngineFactory获取的，这个Factory类非常简单：<br />
<br />
public class GenericEngineFactory {<br />
<br />
&nbsp;&nbsp;&nbsp; protected ServiceDispatcher dispatcher = null;<br />
&nbsp;&nbsp;&nbsp; protected Map&lt;String, GenericEngine&gt; engines = null;<br />
<br />
&nbsp;&nbsp;&nbsp; public GenericEngineFactory(ServiceDispatcher dispatcher) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.dispatcher = dispatcher;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engines = FastMap.newInstance();<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Gets the GenericEngine instance that corresponds to given the name<br />
&nbsp;&nbsp;&nbsp;&nbsp; *@param engineName Name of the engine<br />
&nbsp;&nbsp;&nbsp;&nbsp; *@return GenericEngine that corresponds to the engineName<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public GenericEngine getGenericEngine(String engineName) throws GenericServiceException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element rootElement = null;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rootElement = ServiceConfigUtil.getXmlRootElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (GenericConfigException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new GenericServiceException("Error getting Service Engine XML root element", e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element engineElement = UtilXml.firstChildElement(rootElement, "engine", "name", engineName);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (engineElement == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new GenericServiceException("Cannot find a service engine definition for the engine name [" + engineName + "] in the serviceengine.xml file");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String className = engineElement.getAttribute("class");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GenericEngine engine = engines.get(engineName);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (engine == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (GenericEngineFactory.class) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engine = engines.get(engineName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (engine == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ClassLoader loader = Thread.currentThread().getContextClassLoader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class&lt;?&gt; c = loader.loadClass(className);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Constructor cn = c.getConstructor(ServiceDispatcher.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engine = (GenericEngine) cn.newInstance(dispatcher);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new GenericServiceException(e.getMessage(), e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (engine != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; engines.put(engineName, engine);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return engine;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
从配置文件serviceengine.xml文件中获取相应的engine子类，如java的是org.ofbiz.service.engine.StandardJavaEngine<br />
bsh的是org.ofbiz.service.engine.BeanShellEngine。<br />
<br />
Java的StandardJavaEnignerunSync方法采用的是反射来执行相应的方法，如下：<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Class&lt;?&gt; c = cl.loadClass(this.getLocation(modelService));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Method m = c.getMethod(modelService.invoke, DispatchContext.class, Map.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = m.invoke(null, dctx, context);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
不同的Engine实现的方式不一样。<br />
<br />
<strong>2. 异步调用</strong><br />
<br />
异步调用怎么实现的呢？实现异步的原理就是启动一个线程来执行相应的业务逻辑，原方法直接返回，从而实现异步。具体实现的时候可以根据实际情况而定，比如将业务逻辑封装成一个任务，将此任务放到一个任务链中，线程池采用先进先出的方式来选择任务进行执行。OFBiz中怎么实现呢？具体查看GenericAsyncEngine的runAsync方法发现是通过一个生成一个Job来实现的：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; job = new GenericServiceJob(dctx, jobId, name, modelService.name, context, requester);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dispatcher.getJobManager().runJob(job);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (JobManagerException jse) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new GenericServiceException("Cannot run job.", jse);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
对于Job的执行，感兴趣的可以看我的另一篇文章<a href="http://www.blogjava.net/persister/archive/2010/02/26/313974.html">OFBiz中Job的运行机制</a>。<br />
<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/313799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2010-02-24 15:19 <a href="http://www.blogjava.net/persister/archive/2010/02/24/313799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OFBiz的中文乱码解决方案</title><link>http://www.blogjava.net/persister/archive/2009/08/10/290568.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Mon, 10 Aug 2009 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/08/10/290568.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/290568.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/08/10/290568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/290568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/290568.html</trackback:ping><description><![CDATA[<p>OFBiz开发时遇到乱码的问题，MySQL数据库插入中文数据时出现了一个问题，报告中文错误：incorrect string value ．．．．．</p>
<p>1.这时由于字符编码不一致导致的，应该将数据库对应的表或coloum改成uft-8，所以如果在CustomerExtra这表中存储中文的话，需要将<br />
&nbsp; 此表另外还有operationlog表的charset改成utf-8</p>
<p>2.Servlet中字符显示为证券的中文，而且表也设置为utf-8，但是数据库和页面还是乱码，怎么回事？<br />
&nbsp; 这里需要修改jdbc url的参数，如将jdbc:mysql://localhost/ccbportal?zeroDateTimeBehavior=convertToNull<br />
&nbsp; 改成：jdbc:mysql://localhost/ccbportal?zeroDateTimeBehavior=convertToNull&amp;amp;useUnicode=true&amp;amp;characterEncoding=UTF-8</p>
<p>3.前台输入的是中文，到后台就变成了乱码，怎么回事？<br />
&nbsp; 无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");<br />
&nbsp; 来转换成你想要的UTF－8编码方式。但如果每处都加词句太麻烦，故分post和get两种方式区分提交。<br />
&nbsp; 写一个Filter即可解决问题：<br />
&nbsp;
</p>
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;java.io.IOException;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.ServletException;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.Filter;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.FilterChain;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.FilterConfig;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.ServletRequest;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.ServletResponse;<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;public&nbsp;class&nbsp;SetCharacterEncodingFilter&nbsp;implements&nbsp;Filter&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;protected&nbsp;String&nbsp;encoding&nbsp;=&nbsp;"GBK";<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;protected&nbsp;FilterConfig&nbsp;filterConfig&nbsp;=&nbsp;null;<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;protected&nbsp;boolean&nbsp;ignore&nbsp;=&nbsp;true;<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;public&nbsp;void&nbsp;init(FilterConfig&nbsp;filterConfig)&nbsp;throws&nbsp;ServletException&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;this.filterConfig&nbsp;=&nbsp;filterConfig;<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;this.encoding&nbsp;=&nbsp;filterConfig.getInitParameter("encoding");<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;filterConfig.getInitParameter("ignore");<br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;if&nbsp;(value&nbsp;==&nbsp;null)<br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;true;<br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(value.equalsIgnoreCase("true"))<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;true;<br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(value.equalsIgnoreCase("yes"))<br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;true;<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;else<br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;false;<br />
</span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;public&nbsp;void&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,<br />
</span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;chain)&nbsp;throws&nbsp;IOException,&nbsp;ServletException&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">35</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;//&nbsp;Conditionally&nbsp;select&nbsp;and&nbsp;set&nbsp;the&nbsp;character&nbsp;encoding&nbsp;to&nbsp;be&nbsp;used<br />
</span><span style="color: rgb(0, 128, 128);">36</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;if&nbsp;(ignore&nbsp;||&nbsp;(request.getCharacterEncoding()&nbsp;==&nbsp;null))&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">37</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encoding&nbsp;=&nbsp;selectEncoding(request);<br />
</span><span style="color: rgb(0, 128, 128);">38</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(encoding&nbsp;!=&nbsp;null)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">39</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setCharacterEncoding(encoding);<br />
</span><span style="color: rgb(0, 128, 128);">40</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">41</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">42</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">43</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;//&nbsp;Pass&nbsp;control&nbsp;on&nbsp;to&nbsp;the&nbsp;next&nbsp;filter<br />
</span><span style="color: rgb(0, 128, 128);">44</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;chain.doFilter(request,&nbsp;response);<br />
</span><span style="color: rgb(0, 128, 128);">45</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">46</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">47</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;protected&nbsp;String&nbsp;selectEncoding(ServletRequest&nbsp;request)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">48</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;return&nbsp;(this.encoding);<br />
</span><span style="color: rgb(0, 128, 128);">49</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">50</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">51</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;public&nbsp;void&nbsp;destroy()&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">52</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;this.encoding&nbsp;=&nbsp;null;<br />
</span><span style="color: rgb(0, 128, 128);">53</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;this.filterConfig&nbsp;=&nbsp;null;<br />
</span><span style="color: rgb(0, 128, 128);">54</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">55</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">56</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp; <br />
</span></div>
<p><br />
web.xml添加此Filter：<br />
</p>
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">encodeFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;com.aicent.ccb.filter.SetCharacterEncodingFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">encoding</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">GBK</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">ignore</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">encodeFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">/control/*</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp; <br />
</span></div>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/persister/aggbug/290568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-08-10 16:58 <a href="http://www.blogjava.net/persister/archive/2009/08/10/290568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分布式事务及其在OFBiz的实现</title><link>http://www.blogjava.net/persister/archive/2009/04/19/266439.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Sun, 19 Apr 2009 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/04/19/266439.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/266439.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/04/19/266439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/266439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/266439.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt;"><span style="font-size: 10pt;">
<strong>1、分布式事务相关概念</strong><br />
<span style="font-size: small;">分布式事务处理（Distributed Transaction Processing，DTP）是指一个事务可能涉及多个数据库操作，分布式事务处理的关键是必须有一种方法可以知道事务在任何地方所做的所有动作，提交或回滚事务的决定必须产生统一的结果（全部提交或全部回滚）。</span><span style="font-family: &quot;Courier New&quot;;"><br />
</span><span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;"> X/Open </span>组织（即现在的<span style="font-family: &quot;Courier New&quot;;"> Open Group </span>）定义了分布式事务处理模型。<span style="font-family: &quot;Courier New&quot;;"> X/Open DTP </span>模型（<span style="font-family: &quot;Courier New&quot;;"> 1994 </span>）包括应用程序（<span style="font-family: &quot;Courier New&quot;;"> AP </span>）、事务管理器（<span style="font-family: &quot;Courier New&quot;;"> TM </span>）、资源管理器（<span style="font-family: &quot;Courier New&quot;;"> RM </span>）、通信资源管理器（<span style="font-family: &quot;Courier New&quot;;"> CRM </span>）四部分。一般，常见的事务管理器（<span style="font-family: &quot;Courier New&quot;;"> TM </span>）是交易中间件，常见的资源管理器（<span style="font-family: &quot;Courier New&quot;;"> RM </span>）是数据库，常见的通信资源管理器（<span style="font-family: &quot;Courier New&quot;;"> CRM </span>）是消息中间件。</span><span style="font-family: &quot;Courier New&quot;;"><br />
</span><span style="font-size: small;">　　通常把一个数据库内部的事务处理，如对多个表的操作，作为本地事务看待。数据库的事务处理对象是本地事务，而分布式事务处理的对象是全局事务。</span><br />
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span>&nbsp;&nbsp;&nbsp; 所谓全局事务，是指分布式事务处理环境中，多个数据库可能需要共同完成一个工作，这个工作即是一个全局事务，例如，一个事务中可能更新几个不同的数据库。对
数据库的操作发生在系统的各处但必须全部被提交或回滚。此时一个数据库对自己内部所做操作的提交不仅依赖本身操作是否成功，还要依赖与全局事务相关的其它
数据库的操作是否成功，如果任一数据库的任一操作失败，则参与此事务的所有数据库所做的所有操作都必须回滚。</span>&nbsp; <br />
</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-size: small;">&nbsp;&nbsp; 一般情况下，某一数据库无法知道其它数据库在做什么，因此，在一个<span style="font-family: &quot;Courier New&quot;;"> DTP </span>环境中，交易中间件是必需的，由它通知和协调相关数据库的提交或回滚。而一个数据库只将其自己所做的操作（可恢复）影射到全局事务中。</span></p>
<span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; XA </span>就是<span style="font-family: &quot;Courier New&quot;;"> X/Open DTP </span>定义的交易中间件与数据库之间的接口规范（即接口函数），交易中间件用它来通知数据库事务的开始、结束以及提交、回滚等。<span style="font-family: &quot;Courier New&quot;;"> XA </span>接口函数由数据库厂商提供。</span><br />
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; <span style="font-size: small;">XA </span></span><span style="font-size: small;">与两阶段提交协议</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span><span style="font-size: small;">通常情况下，交易中间件与数据库通过<span style="font-family: &quot;Courier New&quot;;"> XA </span>接口规范，使用两阶段提交来完成一个全局事务，<span style="font-family: &quot;Courier New&quot;;"> XA </span>规范的基础是两阶段提交协议。</span><span style="font-family: &quot;Courier New&quot;;"><br />
</span><span style="font-size: small;"><span>
在第一阶段，交易中间件请求所有相关数据库准备提交（预提交）各自的事务分支，以确认是否所有相关数据库都可以提交各自的事务分支。当某一数据库收到预
提交后，如果可以提交属于自己的事务分支，则将自己在该事务分支中所做的操作固定记录下来，并给交易中间件一个同意提交的应答，此时数据库将不能再在该事
务分支中加入任何操作，但此时数据库并没有真正提交该事务，数据库对共享资源的操作还未释放（处于上锁状态）。如果由于某种原因数据库无法提交属于自己的
事务分支，它将回滚自己的所有操作，释放对共享资源上的锁，并返回给交易中间件失败应答。</span>在第二阶段，交易中间件审查所有数据库返回的预提交结果，如所有数据库都可以提交，交易中间件将要求所有数据库做正式提交，这样该全局事务被提交。而如果有任一数据库预提交返回失败，交易中间件将要求所有其它数据库回滚其操作，这样该全局事务被回滚。</span><span style="font-family: &quot;Courier New&quot;;"><br />
</span><span style="font-size: small;">　　以一个全局事务为例，<span style="font-family: &quot;Courier New&quot;;"> AP </span>首先通知交易中间件开始一个全局事务，交易中间件通过<span style="font-family: &quot;Courier New&quot;;"> XA </span>接口函数通知数据库开始事务，然后<span style="font-family: &quot;Courier New&quot;;"> AP </span>可以对数据库管理的资源进行操作，数据库系统记录事务对本地资源的所有操作。操作完成后交易中间件通过<span style="font-family: &quot;Courier New&quot;;"> XA </span>接口函数通知数据库操作完成。交易中间件负责记录<span style="font-family: &quot;Courier New&quot;;"> AP </span>操作过哪些数据库（事务分支）。<span style="font-family: &quot;Courier New&quot;;"> AP </span>根据情况通知交易中间件提交该全局事务，交易中间件会通过<span style="font-family: &quot;Courier New&quot;;"> XA </span>接口函数要求各个数据库做预提交，所有数据库返回成功后要求各个数据库做正式提交，此时一笔全局事务结束。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span><span style="font-size: small;"><span style="font-family: &quot;Courier New&quot;;">XA </span>规范对应用来说，最大好处在于事务的完整性由交易中间件和数据库通过<span style="font-family: &quot;Courier New&quot;;"> XA </span>接口控制，<span style="font-family: &quot;Courier New&quot;;"> AP </span>只需要关注与数据库的应用逻辑的处理，而无需过多关心事务的完整性，应用设计开发会简化很多。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span style="font-family: &quot;Courier New&quot;;">&nbsp;&nbsp; </span><span style="font-size: small;">具体来说，如果没有交易中间件，应用系统需要在程序内部直接通知数据库开始、结束和提交事务，当出现异常情况时必须由专门的程序对数据库进行反向操作才能完成回滚。如果是有很多事务分支的全局事务，回滚时情况将变得异常复杂。而使用<span style="font-family: &quot;Courier New&quot;;"> XA </span>接口，则全局事务的提交是由交易中间件控制，应用程序只需通知交易中间件提交或回滚事务，就可以控制整个事务（可能涉及多个异地的数据库）的全部提交或回滚，应用程序完全不用考虑冲正逻辑。</span><span style="font-family: &quot;Courier New&quot;;"><br />
</span><span><span style="font-size: small;">
在一个涉及多个数据库的全局事务中，为保证全局事务的完整性，由交易中间件控制数据库做两阶段提交是必要的。但典型的两阶段提交，对数据库来说事务从开
始到结束（提交或回滚）时间相对较长，在事务处理期间数据库使用的资源（如逻辑日志、各种锁），直到事务结束时才会释放。因此，使用典型的两阶段提交相对
来说会占用更多的资源，在网络条件不是很好，如低速网、网络颠簸频繁，情况会更为严重。</span></span><span style="font-family: &quot;Courier New&quot;;"><br />
</span><span style="font-size: small;">　　当一个全局事务只涉及一个数据库时，有一种优化方式，即一阶段提交。当<span style="font-family: &quot;Courier New&quot;;"> AP </span>通知交易中间件提交事务时，交易中间件直接要求数据库提交事务，省去两阶段提交中的第一阶段，可以缩短处理一个事务的时间，以提高事务处理的效率。作为两阶段提交的一种特例，与两阶段一样，一阶段提交也是标准的。</span></p>
<p style="margin: 0cm 0cm 0pt;"><strong>XA的要求</strong>
<br />
对于jms来说，需要配置支持XA的 connection factory.
<br />
对于db来说，需使用支持XA的JDBC driver. <br />
</p>
<p style="margin: 0cm 0cm 0pt;"><strong>两阶段提交(2 phase commit)</strong>
<br />
先说transaction的管理，如下图。&nbsp;</p>
<p style="margin: 0cm 0cm 0pt;"><img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/046a643e-1b51-3aa3-9ac2-779f5e4755ea.bmp.png" width="447" height="237" /><br />
&nbsp;
<br />
transaction manager与不同的resource manager都有交互。
<br />
<br />
在phase1时，transaction manager向两个resouce询问是否可以准备提交。Resouce可回复ready,
not_ready或是read_only. 当两个都ready时，则可以进入phase2
进行提交。任何一个回复not_ready则整个transaction 回滚。回复read_only的资源在phase2阶段被排除在提交过程之外。
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/dd3536a3-d5fa-3e43-b905-8e13a755c9ca.bmp.png" width="300" height="256" /><br />
</p>
<p style="margin: 0cm 0cm 0pt;"><br />
</p>
<strong>2.JTA</strong><br />
JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。<br />
要用 JTA 进行事务界定，应用程序要调用 javax.transaction.UserTransaction 接口中的方法。
<p>让我们来关注下面的话：<br />
&nbsp;&#8220;用 JTA 界定事务，那么就需要有一个实现 javax.sql.XADataSource 、
javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC
驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection
对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。&#8221;<br />
要使用JTA事务，必须使用XADataSource来产生数据库连接，产生的连接为一个XA连接。</p>
<p>XA连接（javax.sql.XAConnection）和非XA（java.sql.Connection）连接的区别在于：XA可以参与JTA的事务，而且不支持自动提交。</p>
Note:<br />
Oracle, Sybase, DB2, SQL Server,MySQL(5.0以后InnoDB存储引擎)等大型数据库才支持XA, 支持分布事务。 <br />
<br />
<strong>3.OFBiz中实现的事务<br />
</strong>OFBiz采用<a href="http://commons.apache.org/dbcp/">Apache Commons DBCP</a>作为数据库连接池技术，分布式事务是通过Apache <a href="http://geronimo.apache.org/">Geronimo Transaction</a>实现的。下面是部分实现类关系：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/transaction.JPG" width="622" height="504" /><br />
<br />
<br />
<strong>
</strong>TransactionFactory和ConnectionFactory都可以自己实现并且在entityengine.xml中进行配置，OFBiz中默认配置的是</span></span>GeronimoTransactionFactory和DBCPConnectionFactory。OFBiz中实现事务不需要显示调用，在services.xml中的service进行配置，配置的项目有两个require-new-transaction和use-transaction，是否起一个新的事务和是否启用事务，默认是false和true。如果不是采用service，event为java实现，那么需要手动实现事务，通常如下：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; beganTransaction&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;TransactionUtil.begin(DEFAULT_TX_TIMEOUT);<br />
<br />
</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000;">db&nbsp;operation</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp; return "success";<br />
}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp; TransactionUtil.rollback(beganTransaction,&nbsp;e.getMessage(),&nbsp;e);<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">error</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
}&nbsp;</span><span style="color: #0000ff;">finally</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp; TransactionUtil.commit(beganTransaction);<br />
}</span></div>
<br />
<br />
<br />
<span style="font-size: 10pt;"><span style="font-size: 10pt;"><br />
</span></span>
<img src ="http://www.blogjava.net/persister/aggbug/266439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-04-19 18:01 <a href="http://www.blogjava.net/persister/archive/2009/04/19/266439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OSWorkflow与OFBiz的集成</title><link>http://www.blogjava.net/persister/archive/2009/04/12/265066.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Sat, 11 Apr 2009 16:01:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/04/12/265066.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/265066.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/04/12/265066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/265066.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/265066.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.OSWorklow的基本概念Osworkflow是完全用java语言编写的开放源代码的工作流引擎，具有显著的灵活性及完全面向有技术背景的用户的特点。用户可以根据自身的需求利用这款开源软件设计简单或是复杂的工作流。Osworkflow几乎提供了所有用户可能在实际流程定义中需要用到的工作流构成元素，如：环节（step）、条件（conditions）、循环（loops）、分支（splits）...&nbsp;&nbsp;<a href='http://www.blogjava.net/persister/archive/2009/04/12/265066.html'>阅读全文</a><img src ="http://www.blogjava.net/persister/aggbug/265066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-04-12 00:01 <a href="http://www.blogjava.net/persister/archive/2009/04/12/265066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OFBiz's trunk version遇到的两个问题</title><link>http://www.blogjava.net/persister/archive/2009/03/30/262857.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Mon, 30 Mar 2009 04:38:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/03/30/262857.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/262857.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/03/30/262857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/262857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/262857.html</trackback:ping><description><![CDATA[<h3 class="type_reprint" title="转载">1. <a href="http://dwtq.javaeye.com/blog/317352">在eclipse下运行或调试Ofbiz的出现<span class="hilite1">Can't</span> <span class="hilite2">find</span> <span class="hilite3">bundle</span> <span class="hilite4">for</span> <span class="hilite5">base</span> </a></h3>
<strong>关键字: ofbiz</strong> <br />
<br />
eclipse 中利用org.ofbiz.<span class="hilite5">base</span>.start.Start类运行Ofbiz 出现错误: <br />
<br />
Exception in thread "main" java.lang.ExceptionInInitializerError <br />
at org.ofbiz.<span class="hilite5">base</span>.util.Debug.&lt;clinit&gt;(Debug.java:90) <br />
at org.ofbiz.<span class="hilite5">base</span>.container.ContainerLoader.load(ContainerLoader.java:50) <br />
at org.ofbiz.<span class="hilite5">base</span>.start.Start.initStartLoaders(Start.java:248) <br />
at org.ofbiz.<span class="hilite5">base</span>.start.Start.init(Start.java:87) <br />
at org.ofbiz.<span class="hilite5">base</span>.start.Start.main(Start.java:403) <br />
Caused by: java.util.MissingResourceException: <span class="hilite1">Can't</span> <span class="hilite2">find</span> <span class="hilite3">bundle</span> <span class="hilite4">for</span> <span class="hilite5">base</span> <span class="hilite6">name</span> <span class="hilite7">cache</span>, <span class="hilite8">locale</span> zh_CN <br />
at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:836) <br />
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:805) <br />
at java.util.ResourceBundle.getBundle(ResourceBundle.java:549) <br />
at org.ofbiz.<span class="hilite5">base</span>.util.<span class="hilite7">cache</span>.UtilCache.setPropertiesParams(UtilCache.java:217) <br />
at org.ofbiz.<span class="hilite5">base</span>.util.<span class="hilite7">cache</span>.UtilCache.setPropertiesParams(UtilCache.java:213) <br />
at org.ofbiz.<span class="hilite5">base</span>.util.<span class="hilite7">cache</span>.UtilCache.&lt;init&gt;(UtilCache.java:172) <br />
at org.ofbiz.<span class="hilite5">base</span>.util.UtilProperties.&lt;clinit&gt;(UtilProperties.java:53) <br />
... 5 more <br />
<br />
原因是没有正确设置Debug环境，OFBiz Wiki上的<a href="http://docs.ofbiz.org/display/OFBIZ/Running+and+Debugging+OFBiz+in+Eclipse">文章</a>描述的很详细，按照它的步骤设置，就不会出现上面的问题。<br />
<br />
2.trunk 中定义entity时在entitymodel中，如果定义的group在org.ofbiz中就不需要在entitygroup中定义，而自定义的<br />
如在com.aicent中，实体存放在不同的数据库，那么需要定义entitygroup。因此导致的一个问题就是：<br />
如果有自定义实体在entitymodel中定义了但是没有加入到entitygroup中，那么就会导致此实体默认放在在org.ofbiz中从而在ofbiz的数据库中建表了，这点得注意。<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/262857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-03-30 12:38 <a href="http://www.blogjava.net/persister/archive/2009/03/30/262857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OFBiz开发需要用到的几个重要（配置）文件</title><link>http://www.blogjava.net/persister/archive/2009/01/21/252211.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Wed, 21 Jan 2009 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/01/21/252211.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/252211.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/01/21/252211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/252211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/252211.html</trackback:ping><description><![CDATA[OFBiz是一个非常好的企业级开发框架，实现了多层的松耦合结构，其中一部分松耦合就是通过配置文件实现的，这里就要提到一些配置文件和开发文件。<br />
<br />
1、首先是entityengine.xml文件，这个文件是配置数据源的，也包括数据库连接池、事务实现类的配置和字段类型配置文件。企业级系统的开发一般都离不开数据库，那么在OFBiz中，数据库的配置就在这个配置文件里面，先配置一个group-map，然后配置其对应的数据源：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">delegator&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="default"</span><span style="color: #ff0000;">&nbsp;entity-model-reader</span><span style="color: #0000ff;">="main"</span><span style="color: #ff0000;">&nbsp;entity-group-reader</span><span style="color: #0000ff;">="main"</span><span style="color: #ff0000;">&nbsp;entity-eca-reader</span><span style="color: #0000ff;">="main"</span><span style="color: #ff0000;"> <br />
&nbsp;&nbsp; distributed-cache-clear-enabled</span><span style="color: #0000ff;">="false"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">group-map&nbsp;</span><span style="color: #ff0000;">group-name</span><span style="color: #0000ff;">="org.ofbiz"</span><span style="color: #ff0000;">&nbsp;datasource-name</span><span style="color: #0000ff;">="ofbiz"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">group-map&nbsp;</span><span style="color: #ff0000;">group-name</span><span style="color: #0000ff;">="com.aicent"</span><span style="color: #ff0000;">&nbsp;datasource-name</span><span style="color: #0000ff;">="portal"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">delegator</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">datasource&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="ofbiz"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;helper-class</span><span style="color: #0000ff;">="org.ofbiz.entity.datasource.GenericHelperDAO"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field-type-name</span><span style="color: #0000ff;">="mysql"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check-on-start</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add-missing-on-start</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check-pks-on-start</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use-foreign-keys</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;join-style</span><span style="color: #0000ff;">="ansi-no-parenthesis"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alias-view-columns</span><span style="color: #0000ff;">="false"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drop-fk-use-foreign-key-keyword</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table-type</span><span style="color: #0000ff;">="InnoDB"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;character-set</span><span style="color: #0000ff;">="latin1"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;collate</span><span style="color: #0000ff;">="latin1_swedish_ci"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">read-data&nbsp;</span><span style="color: #ff0000;">reader-name</span><span style="color: #0000ff;">="seed"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">read-data&nbsp;</span><span style="color: #ff0000;">reader-name</span><span style="color: #0000ff;">="seed-initial"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">read-data&nbsp;</span><span style="color: #ff0000;">reader-name</span><span style="color: #0000ff;">="demo"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">read-data&nbsp;</span><span style="color: #ff0000;">reader-name</span><span style="color: #0000ff;">="ext"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">inline-jdbc<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">jdbc-driver</span><span style="color: #0000ff;">="com.mysql.jdbc.Driver"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc-uri</span><span style="color: #0000ff;">="jdbc:mysql://localhost/ofbiztrunk"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc-username</span><span style="color: #0000ff;">="root"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc-password</span><span style="color: #0000ff;">="123456"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isolation-level</span><span style="color: #0000ff;">="ReadCommitted"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool-minsize</span><span style="color: #0000ff;">="2"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool-maxsize</span><span style="color: #0000ff;">="20"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;&lt;jndi-jdbc&nbsp;jndi-server-name="localjndi"&nbsp;jndi-name="java:/MySqlDataSource"&nbsp;isolation-level="Serializable"/&gt;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">datasource</span><span style="color: #0000ff;">&gt;<br />
</span></div>
<br />
datasource配置里面有一个<span style="color: #ff0000;">field-type-name</span><span style="color: #0000ff;">="mysql"</span><span style="color: #ff0000;">，到entitymodel.xml配置文件就知道是干吗用的了。<br />
<br />
2.entitymodel.xml &amp; entitygroup.xml<br />
&nbsp; OFBiz本质上来说还是面向数据库的设计，entitymodel.xml的配置entity的，entity实体对应数据库里面的table，实体的field对应数据库里面的字段,如下是一个entity配置：<br />
<br />
</span>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entity&nbsp;</span><span style="color: #ff0000;">entity-name</span><span style="color: #0000ff;">="Customerinfo"</span><span style="color: #ff0000;">&nbsp;package-name</span><span style="color: #0000ff;">="com.aicent.ccb"</span><span style="color: #ff0000;">&nbsp;no-auto-stamp</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title</span><span style="color: #0000ff;">="customerinfo"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="int10"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="varchar128"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="customernameshort"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="varchar16"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="country"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="varchar64"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="businessaddr"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="text"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="mailaddr"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="text"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="billaddr"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="text"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="phone"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="varchar32"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="fax"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="varchar32"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="website"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="varchar128"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="note"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="text"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">entity</span><span style="color: #0000ff;">&gt;</span></div>
<br />
<span style="color: #ff0000;">里面有一个type，这个type对应数据库字段的类型（日期型，字符串型，整型等），这个对于关系在哪里呢？就在刚才说的</span><span style="color: #ff0000;">field-type-name</span><span style="color: #ff0000;">里面配置，如果配置为mysql，那么entitygengine.xml中mysql的<br />
field-type指向的文件是：<br />
<br />
</span>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="mysql"</span><span style="color: #ff0000;">&nbsp;loader</span><span style="color: #0000ff;">="fieldfile"</span><span style="color: #ff0000;">&nbsp;location</span><span style="color: #0000ff;">="fieldtypemysql.xml"</span><span style="color: #0000ff;">/&gt;</span></div>
<br />
在fieldtypemysql.xml中，就可以找到如int10,varchar128表示的实际mysql字段类型了：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">fieldtypemodel&nbsp;</span><span style="color: #ff0000;">xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;">&nbsp;<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:noNamespaceSchemaLocation</span><span style="color: #0000ff;">="http://ofbiz.apache.org/dtds/fieldtypemodel.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;=====================&nbsp;field-type-def&nbsp;====================&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;General&nbsp;Types&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;">&nbsp;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="blob"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="BLOB"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="java.sql.Blob"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="date-time"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="DATETIME"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="java.sql.Timestamp"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="date"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="DATE"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="java.sql.Date"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="time"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="TIME"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="java.sql.Time"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="currency-amount"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="DECIMAL(18,2)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="java.math.BigDecimal"</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">validate&nbsp;</span><span style="color: #ff0000;">method</span><span style="color: #0000ff;">="isSignedDouble"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="currency-precise"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="DECIMAL(18,3)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="java.math.BigDecimal"</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">validate&nbsp;</span><span style="color: #ff0000;">method</span><span style="color: #0000ff;">="isSignedDouble"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="fixed-point"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="DECIMAL(18,6)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="java.math.BigDecimal"</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">validate&nbsp;</span><span style="color: #ff0000;">method</span><span style="color: #0000ff;">="isSignedDouble"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="floating-point"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="DECIMAL(18,6)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="Double"</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">validate&nbsp;</span><span style="color: #ff0000;">method</span><span style="color: #0000ff;">="isSignedDouble"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="numeric"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="DECIMAL(20,0)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="Long"</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">validate&nbsp;</span><span style="color: #ff0000;">method</span><span style="color: #0000ff;">="isSignedLong"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="integer"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="INTEGER"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="Integer"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="id"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(20)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="id-long"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(60)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="id-vlong"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(250)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="indicator"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="CHAR(1)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="very-short"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(10)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="short-varchar"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(60)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="long-varchar"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(255)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="very-long"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="LONGTEXT"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="comment"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(255)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="description"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(255)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="name"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(100)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="value"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(255)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;customize&nbsp;field&nbsp;type&nbsp;definitions&nbsp;for&nbsp;ccb&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="text"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="TEXT"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="char"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="CHAR(1)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="char125"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="CHAR(125)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="varchar16"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(16)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="varchar20"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(20)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="varchar24"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(24)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="varchar50"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(50)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="varchar64"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(64)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">43</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">field-type-def&nbsp;</span><span style="color: #ff0000;">type</span><span style="color: #0000ff;">="varchar128"</span><span style="color: #ff0000;">&nbsp;sql-type</span><span style="color: #0000ff;">="VARCHAR(128)"</span><span style="color: #ff0000;">&nbsp;java-type</span><span style="color: #0000ff;">="String"</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">field-type-def</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">44</span> <span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">fieldtypemodel</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span></div>
<br />
OFBiz这里为什么不在entitymodel里面直接使用字段在数据库中的类型，而这么绕呢？我想至少有两个目的：首先是公司企业开发时可以针对使用的字段类型有一个规范，所有的字段都采用这个配置文件中的字段类型，而不是开发人员自己随意定义数据库字段的类型；第二是为了使用不同Vendor的数据库，如果想从mysql换成oracle，只需要定义另一份fieldtypeoracle.xml，field-type-def中sql-type不变，而sql-tye换成oracle的类型即可。<br />
<br />
entitygroup.xml配置文件时用于配置entitymodel.xml中配置的entity是属于哪个group的，这个group对应entityengine.xml中的group-name，如果忘记在entitygroup.xml中配置，那么在OFBiz 9之前，这个entity就无法使用，不会创建相应的table，OFBiz 9以后，默认的group name是org.ofbiz。<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entitygroup&nbsp;</span><span style="color: #ff0000;">xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:noNamespaceSchemaLocation</span><span style="color: #0000ff;">="http://www.ofbiz.org/dtds/entitygroup.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entity-group&nbsp;</span><span style="color: #ff0000;">group</span><span style="color: #0000ff;">="com.aicent"</span><span style="color: #ff0000;">&nbsp;entity</span><span style="color: #0000ff;">="Customerextra"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">entity-group&nbsp;</span><span style="color: #ff0000;">group</span><span style="color: #0000ff;">="com.aicent"</span><span style="color: #ff0000;">&nbsp;entity</span><span style="color: #0000ff;">="Customerinfo"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">entitygroup</span><span style="color: #0000ff;">&gt;</span></div>
<br />
3.ofbiz-containers.xml 里面配置了各种容器类，经常修改的容器就是name为catalina-container的容器，使用的是embeded tomcat，里面可以修改各种tomcat的配置项，就像我们修改tomcat的配置文件server.xml一样，在里面修改端口等信息。<br />
<br />
4.log4j.xml 日志配置文件<br />
<br />
5.component-load.xml 这个文件在几个文件夹中都存在，如framework,applications,specialpurpose中。OFBiz将一个个应用实现为component，这些componnet是就好像tomcat中webapps中的一个个web应用。每次是否加载这个component可以在component-load.xml配置，如果不想加载，注释掉就可以。<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">component-loader&nbsp;</span><span style="color: #ff0000;">xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:noNamespaceSchemaLocation</span><span style="color: #0000ff;">="http://ofbiz.apache.org/dtds/component-loader.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-component&nbsp;</span><span style="color: #ff0000;">component-location</span><span style="color: #0000ff;">="commonext"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;common&nbsp;component&nbsp;used&nbsp;by&nbsp;most&nbsp;other&nbsp;components&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-component&nbsp;</span><span style="color: #ff0000;">component-location</span><span style="color: #0000ff;">="securityext"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-component&nbsp;component-location="party"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-component&nbsp;component-location="content"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-component&nbsp;component-location="workeffort"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-component&nbsp;component-location="product"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-component&nbsp;component-location="manufacturing"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-component&nbsp;component-location="accounting"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-component&nbsp;component-location="humanres"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-component&nbsp;component-location="order"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-component&nbsp;component-location="marketing"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">component-loader</span><span style="color: #0000ff;">&gt;</span></div>
<br />
到底哪些目录下的component-load.xml有效呢，这个目录在framework/base/config/component-load.xml进进行配置：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">component-loader&nbsp;</span><span style="color: #ff0000;">xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:noNamespaceSchemaLocation</span><span style="color: #0000ff;">="http://ofbiz.apache.org/dtds/component-loader.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-components&nbsp;</span><span style="color: #ff0000;">parent-directory</span><span style="color: #0000ff;">="framework"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-components&nbsp;</span><span style="color: #ff0000;">parent-directory</span><span style="color: #0000ff;">="themes"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-components&nbsp;</span><span style="color: #ff0000;">parent-directory</span><span style="color: #0000ff;">="applications"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-components&nbsp;</span><span style="color: #ff0000;">parent-directory</span><span style="color: #0000ff;">="specialpurpose"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">load-components&nbsp;</span><span style="color: #ff0000;">parent-directory</span><span style="color: #0000ff;">="hot-deploy"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">component-loader</span><span style="color: #0000ff;">&gt;</span></div>
<br />
6.general.properties 这里面配置的东西很多，大家自己去看吧。<br />
<br />
7.cache.properties 配置OFBiz中的缓存，配置这个文件需要对OFBiz中的缓存有所了解，这个在后续文章中进行分析。<br />
<br />
其他还有一些比较配置的文件，就不一一说明了。<br />
<span style="color: #ff0000;"><br />
</span>
<img src ="http://www.blogjava.net/persister/aggbug/252211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-01-21 14:25 <a href="http://www.blogjava.net/persister/archive/2009/01/21/252211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>