﻿<?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-hengheng123456789-随笔分类-JAVA-Definition</title><link>http://www.blogjava.net/hengheng123456789/category/20271.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 03 Sep 2007 13:41:32 GMT</lastBuildDate><pubDate>Mon, 03 Sep 2007 13:41:32 GMT</pubDate><ttl>60</ttl><item><title>JRuby - Web 2.0 in the Enterprise Java world</title><link>http://www.blogjava.net/hengheng123456789/archive/2007/09/03/142401.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Mon, 03 Sep 2007 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/archive/2007/09/03/142401.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/142401.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/archive/2007/09/03/142401.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/142401.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/142401.html</trackback:ping><description><![CDATA[<p>On a recent project , the choice was between Enterprise Java (using frameworks such as DWR and Struts) , or Oracle Forms. The newest latest Java technology , versus a 15 year old technology that Oracle is comitted to phasing out (and moving to ADF / Oracle fusion). No contest , you think , until you hear that the decision was made (and rightly so) to us Oracle Forms.</p>
<p>&#8216;What?!&#8217; I hear you say - how could this happen? The project in question was fairly simple - get information and store it in a database. The problem is , despite being mainstream for the last 6 years, there is no standard, easy &#8216;drag and drop&#8217; method of doing these applications in Java. C# does it in Visual Studio. Oracle does it with Forms. With Java (and despite having doing 10 or so of these projects), there is still too much plumbing that the developer needs to know.</p>
<p>I&#8217;m expecting a deluge of &#8216;have you tried project X&#8217; on this post. And yes, I expect that an Eclipse based tool will probably fill the gap. But for these simple applications , there is no standard way of doing this (standard being a solution that dominates the market in the way Struts did the Web App framework space, <a href="http://www.firstpartners.net/red-piranha/knowledgebase/AjaxJavaLibraries">until recently</a>). But we&#8217;ve been waiting 6 long years!</p>
<p>All of which brings me to Ruby. Ruby on Rails&#8217; sweet spot is exactly these kind of simple, ajax enabled , no frills &#8216;get info from web and store it on database&#8217; applications. Enterprise Java&#8217;s sweet spot is the heavy lifting <a href="http://www.firstpartners.net/blog/workflow">workflow</a> , Rules , Calculations, Integration with Legacy and other systems , web services and basically anything to do with Business logic. The two are a perfect complement to each other, which is why the news that <a href="http://jruby.sourceforge.net/" target="_blank">JRuby now runs Ruby on Rails</a> is especially interesting.</p>
<p>JRuby is a version of Ruby that runs in the Standard Java Virtual Machine (JVM). It means that (1) You don&#8217;t have to install Ruby, which might meet resistance in a corporate environment. It also means (2) that all the methods you have available in Java you have available in Ruby. The <a href="http://www.oreillynet.com/ruby/" target="_blank">O&#8217;Reilly Ruby site</a> and <a href="http://www.javaworld.com/javaworld/jw-07-2006/jw-0717-ruby.html" target="_blank">this Javaworld Article</a> are good places to start learning more about Ruby and linking it into Java. Fellow O&#8217;Reilly Blogger Steve Anglin also has <a href="http://www.oreillynet.com/onjava/blog/2006/07/jruby_maturing.html">more information about the latest JRuby release</a>.</p>
<p><a href="http://www.firstpartners.net/blog/technology">More on Technology in plain English</a></p>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/142401.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2007-09-03 17:44 <a href="http://www.blogjava.net/hengheng123456789/archive/2007/09/03/142401.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EJB Stateless Session Begining</title><link>http://www.blogjava.net/hengheng123456789/archive/2007/05/31/121221.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Thu, 31 May 2007 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/archive/2007/05/31/121221.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/121221.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/archive/2007/05/31/121221.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/121221.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/121221.html</trackback:ping><description><![CDATA[&nbsp;
<p align=center><span>EJB Stateless Session Begining</span></p>
<p>&nbsp;</p>
<p><span>参考：</span><span><a href="http://www.tusc.com.au/tutorial/html/index.html">http://www.tusc.com.au/tutorial/html/index.html</a></span></p>
<p>&nbsp;</p>
<p><span>一、</span><span>Enterprise Beans</span></p>
<p>&nbsp;</p>
<p><span>在</span><span>EJB</span><span>（</span><span>Enterprise Java Beans</span><span>）中定义了两种不同类别的</span><span>Enterprise Bean </span><span>：</span><span> </span></p>
<p><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>会话</span><span> Bean (Session Bean) </span></p>
<p><span><span>l<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>实体</span><span>Bean (Entity Bean) </span></p>
<p>&nbsp;</p>
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>会话</span><span> Bean (Session Bean) </span></p>
<p><span>请把</span><span>Session Beans</span><span>看作任务而非持久数据，只有这样，你才能清晰地理解使用它的场合和原因。比如说，</span><span>Session Bean</span><span>可能会对数据库内的用户进行检索操作，但并不把用户表示为持久的业务对象。</span><span>Session Beans</span><span>可以同其他类型的</span><span>Java beans</span><span>通信，这种能力已经超出了数据库事务概念之外。在这种方式下工作的分布式应用程序特别适合于采用</span><span>Session Beans</span><span>。</span></p>
<p>&nbsp;</p>
<p><span>所有的</span><span>Session Beans</span><span>都派生于</span><span>javax.ejb.SessionBean</span><span>类。就像其名称那样，</span><span> Session Beans</span><span>只存在于单一客户会话中。这里的客户可能是</span><span>Java Servlet</span><span>、桌面应用程序、别的</span><span>EJB</span><span>乃至采用</span><span>Java Bean</span><span>的其他事务信息方式。</span><span>Session Bean</span><span>的生存期从客户程序发起接触开始，在客户通过调用</span><span>EJB</span><span>宿主接口的</span><span>remove()</span><span>方法显式破坏</span><span>bean</span><span>时终止。会话还会在预先设置的时间终止，而这种时间设置则由</span><span>EJB</span><span>容器内确定。考虑到服务器的资源，开发者往往会设法避免处理&#8220;超时&#8221;设置而在编写客户程序时做相应的延期处理。此外，开发者还应该在</span><span>EJB</span><span>容器重新启动的时候小心</span><span>Session Bean</span><span>的短暂寿命；客户程序可以重新获得同类</span><span>bean</span><span>的引用，但很有可能却不是同一</span><span>bean</span><span>。</span></p>
<p>&nbsp;</p>
<p><span>Session Beans</span><span>可以是无状态也可以是有状态的，因而两者会显示出不同的行为。</span><span>Session Bean</span><span>的状态概念类似于</span><span>HTTP</span><span>设置：客户程序和服务器之间的交互（在这种情况下就是</span><span>bean</span><span>自身）发生在定义的环境之内。有状态的</span><span>Session Bean</span><span>会在多个方法调用的情况下保存客户和</span><span>bean</span><span>的有关信息。有状态的</span><span>Session Bean</span><span>只能同一个客户程序通讯，而无状态</span><span>Session bean</span><span>的实例却可以同时和若干个客户程序通讯。</span></p>
<p>&nbsp;</p>
<p><span>会话</span><span> Bean </span><span>是调用它的客户端代码要完成的工作。当客户端与服务器建立联系，那么一个会话</span><span> Bean </span><span>就建立起来了。根据会话</span><span> Bean </span><span>的状态不同有分为</span><span>: </span></p>
<p>&nbsp;</p>
<p><span>A. </span><span>状态会话</span><span> Bean (Stateful Session Bean) </span></p>
<p><span>B. </span><span>无状态会话</span><span> Bean (Stateless Session Bean) </span></p>
<p><span>1.1 </span><span>状态会话</span><span> Bean (Stateful Session Bean) </span></p>
<p><span>当客户机和服务器建立连接之后，状态会话</span><span> Bean (Stateful Session Bean) </span><span>将一直在客户机和服务器之间保持着用户的某个状态。例如：用户使用银行的</span><span>ATM</span><span>时，经过验证之后，用户可以连续执行多次操作，在这个过程当中，用户的合法状态将一直被保留，直到她将信用卡取出，结束这次操作。这时，状态会话</span><span> Bean (Stateful Session Bean) </span><span>也就被销毁。</span><span> </span></p>
<p>&nbsp;</p>
<p><span>1.2</span><span>无状态会话</span><span> Bean (Stateless Session Bean) </span></p>
<p><span>当客户机和服务器建立连接之后，无状态会话</span><span> Bean (Stateless Session Bean)</span><span>处理单一的用户请求或商务过程。无状态会话</span><span> Bean (Stateless Session Bean)</span><span>不需要从以前的请求中提取任何状态。例如，用户的用户密码确认。用户输入密码后，发送请求。组件返回真或假来确认用户，一旦过程完成，无状态会话</span><span> Bean (Stateless Session Bean) </span><span>也宣告结束。</span><span> </span></p>
<p>&nbsp;</p>
<p><span>2. </span><span>实体</span><span>Bean (Entity Bean) </span></p>
<p><span>实体</span><span>Bean (Entity Bean)</span><span>只是数据模型，它不包括商务逻辑。实体</span><span>Bean (Entity Bean)</span><span>可以将关系</span><span>/</span><span>对象数据库的数据映射到内存中供其它组件使用。实体</span><span>Bean (Entity Bean)</span><span>是一直存在的，而且具有很高的容错性能。实体</span><span>Bean (Entity Bean)</span><span>能供允许多用户同时访问。</span></p>
<p>&nbsp;</p>
<p><span>二、会话</span><span> Bean (Session Bean) </span></p>
<p>&nbsp;</p>
<p><span>Ejb</span><span>的执行过程是被放在一个</span><span>EJB</span><span>容器中进行的，所以客户端不会直接调用我们写好的</span><span>Enterprise Bean </span><span>，而是调用</span><span>EJB</span><span>容器生成的一个</span><span>EJBObject (EJB</span><span>对象</span><span>)</span><span>来实现。那么，我们在编写服务器端的</span><span>Enterprise Bean </span><span>时，就要考虑这点。既然客户端不能直接访问，就由</span><span>EJBObject</span><span>来代劳，所以在编写服务器端时，就要编写服务器端的一个接口（</span><span>Remote</span><span>）用来与客户机联系，实力化</span><span>EJBObject</span><span>。要生成</span><span>EJBObject </span><span>就要调有</span><span>Home </span><span>接口，来建立这个实力。</span><span> </span></p>
<p>&nbsp;</p>
<p><span>以下是会话</span><span> Bean </span><span>的代码分析：</span><span> </span></p>
<p>&nbsp;</p>
<p><span>A.Enterprise Bean </span><span>类：</span><span>sailorsy.class </span></p>
<p>&nbsp;</p>
<p><span>1.setSessionContext(SessionContext ctx)</span><span>方法</span><span> </span></p>
<p><span>它是</span><span>EJB</span><span>容器和</span><span>Enterprise Bean</span><span>互相作用的关口。</span><span> </span></p>
<p><span>import java.rmi.*; </span></p>
<p><span>import javax.ejb.*; </span></p>
<p><span>public class sailorsy implements SessionBean{ </span></p>
<p><span>private SessionContext ctx=null; </span></p>
<p><span>public voic setSessionContext(SessionContext ctx){ </span></p>
<p><span>this.ctx=ctx; </span></p>
<p><span>}//setSessionContext </span></p>
<p><span>}//class sailorsy </span></p>
<p><span>2.ejbCreate(</span><span>&#8230;</span><span>)</span><span>方法</span><span> </span></p>
<p><span>它可以初始化</span><span>Enterprise Bean ,</span><span>可以定义不同的</span><span>ejbCreate(</span><span>&#8230;</span><span>)</span><span>方法，每个方法所带的参数不同。但是，必许要存在至少一种。</span><span> </span></p>
<p><span>import java.rmi.*; </span></p>
<p><span>import javax.ejb.*; </span></p>
<p><span>public class sailorsy implements SessionBean{ </span></p>
<p><span>private SessionContext ctx=null; </span></p>
<p><span>public voic setSessionContext(SessionContext ctx){ </span></p>
<p><span>this.ctx=ctx; </span></p>
<p><span>}//setSessionContext </span></p>
<p><span>public void ejbCreate() { </span></p>
<p><span>}//ejbCreate </span></p>
<p><span>}//class sailorsy </span></p>
<p><span>3.ejbPassivate()</span><span>方法</span><span> </span></p>
<p><span>如果初始化的</span><span>Enterprise Bean </span><span>过多，</span><span>EJB</span><span>容器将其中的一些挂起（</span><span>passivate</span><span>）</span><span>,</span><span>释放他们所占用的空间。</span><span> </span></p>
<p><span>import java.rmi.*; </span></p>
<p><span>import javax.ejb.*; </span></p>
<p><span>public class sailorsy implements SessionBean{ </span></p>
<p><span>private SessionContext ctx=null; </span></p>
<p>&nbsp;</p>
<p><span>public voic setSessionContext(SessionContext ctx){ </span></p>
<p><span>this.ctx=ctx; </span></p>
<p><span>}//setSessionContext </span></p>
<p>&nbsp;</p>
<p><span>public void ejbCreate() { </span></p>
<p><span>}//ejbCreate </span></p>
<p><span>public void ejbPassivate() { </span></p>
<p><span>}//ejbPassivate </span></p>
<p>&nbsp;</p>
<p><span>}//class sailorsy </span></p>
<p><span>4.ejbActivate()</span><span>方法</span><span> </span></p>
<p><span>和</span><span>ejbPassivate</span><span>正好相反，它将被挂起的</span><span>Bean</span><span>从新调回。</span><span> </span></p>
<p><span>import java.rmi.*; </span></p>
<p><span>import javax.ejb.*; </span></p>
<p><span>public class sailorsy implements SessionBean{ </span></p>
<p><span>private SessionContext ctx=null; </span></p>
<p>&nbsp;</p>
<p><span>public voic setSessionContext(SessionContext ctx){ </span></p>
<p><span>this.ctx=ctx; </span></p>
<p><span>}//setSessionContext</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p align=left><strong><span>Creating a Stateless Session Bean</span></strong></p>
<p align=left><span>This chapter covers how to create a stateless session EJB component. This bean will be responsible for authenticating the user by communicating with the database using Data Access Object (DAO) which encapsulates Java Database Connectivity (JDBC) code. A DAO has all attributes (fields) and behavior (methods) corresponding to the bean it is being used for. </span></p>
<p align=left>&nbsp;</p>
<p align=left><span><br clear=left></span></p>
<p align=left><span>All customers, supplier and manager of MyStore have been assigned a unique username and userid to access services of MyStore, but in order to access these services all these entities have to first login into the system (MyStore). The method for authentication is named <strong>loginUser</strong>, which takes <strong>two String parameters, username and password and returns the userID if authentication is successful. </strong></span></p>
<p align=left><em><span>Note : This method loginUser is a business method, normally business methods carry out operations or processing on values EJB components. From clients perspective, clients can see only business methods and invoke them on bean.</span></em></p>
<p align=left><strong><span>Tasks :</span></strong></p>
<ol type=1>
    <li><span>Create a J2EE project named MyStore.</span></li>
    <li><span>Create a Stateless Session Bean named StoreAccess.</span></li>
    <li><span>Add a business method in bean named loginUser with the following signature</span></li>
</ol>
<p align=left><strong><span>public String loginUser (String username, String password)</span></strong></p>
<ol type=1 start=4>
    <li><span>Create a DAO named StoreAccessDAOImpl under package au.com.tusc.dao. Generate the DAO interface.</span></li>
    <li><span>Implement the method named loginUser, generated in DAO interface, in StoreAccessDAOImpl. Method signature is </span></li>
</ol>
<p align=left><strong><span>public String loginUser (String username, String password) </span></strong></p>
<ol type=1 start=6>
    <li><span>Add callback methods and implement them.</span></li>
    <li><span>Deploy StoreAccess bean.</span></li>
    <li><span>Create your test client named SessionClient under package au.com.tusc.client.</span></li>
    <li><span>Run your client and test the bean.</span></li>
</ol>
<p align=left><strong><span>Create J2EE Project :</span></strong></p>
<p align=left><span>Now, lets start to write our first component of this tutorial.</span></p>
<p align=left><strong><span>Go to File &gt; New &gt; LombozJ2EE Project, project creation wizard will pop up.</span></strong></p>
<p align=left><strong><span>Insert Project Name MyStore &gt; Next .</span></strong></p>
<p align=left><strong><span>Under Java Settings Check source, should be MyStore/src , libraries pointing to $JAVA_HOME &gt; Go Next as shown in fig below. </span></strong></p>
<p align=left><em><span>Note: This step is shown in chapter1, as there is a bug in eclipse 2.1, so its important that you check your library settings are right.</span></em></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Under Create J2EE Module, select Web Modules tab &gt; Add.., enter Module name as OnlineStore &gt; OK as shown in figure below.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Under Create J2EE Module, select EJB Modules tab &gt; Add.., enter Module name as MyStoreMgr &gt; OK .</span></strong></p>
<p align=left><strong><span>Under Create J2EE Module, select Targeted Servers tab &gt; Select JBOSS 3.2.1 ALL &gt; Add.. &gt; Finish.</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>Create Stateless Bean :</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>Go To Package Explorer &gt; Expand Mystore (project) node &gt; select src, right click and menu will pop up.</span></strong></p>
<p align=left><strong><span>On pop up menu &gt; New &gt; Lomboz EJB Creation Wizard.</span></strong></p>
<p align=left><strong><span>Enter package name au.com.tusc.session, bean name StoreAccess and select bean type as stateless &gt; Finish.</span></strong></p>
<p align=left><strong><span>This will create a package named au.com.tusc.session under src and StoreAccessBean under that package as shown in the figure below.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>As we can see from the figure below it has created a class level tag @ejb.bean, which has assigned the bean type, name and its JNDI name which will be generated in Home interface. This tag will also generate deployment descriptors in ejb-jar.xml and jboss.xml file as well once you generate your EJB classes, which is covered later on in this chapter.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><em><span>Note: It will generate the bean name, jndi-name and type of bean in the file. Also, the name of file is appended with word 'Bean' as you gave the name of the bean as StoreAccess only. Again, be careful with naming conventions, specifying the bean name only in the wizard without adding the word 'Bean' to the name as the wizard appends that for you. </span></em></p>
<p align=left><em><span>Expand MyStoreMgr/META-INF node under Package Explorer. You will find there are seven files which are generated by Lomboz using Xdoclet as shown in the figure below. </span></em></p>
<p align=left><span><br clear=left></span></p>
<p align=left><span>Now we are going to generate all the interfaces including Home, Remote, DAO and other helper classes. We will explain why later on, but for the time being just follow the steps.</span></p>
<p align=left><span>But before we get too excited, there are a few concepts to cover here.</span></p>
<p align=left><strong><span>Go to MyStoreMgr/META-INF &gt; select and open ejbGenerate.xml.</span></strong></p>
<p align=left><em><span>Note: Lomboz uses this file to generate required interfaces and helper classes, so in the event that you have special needs then you will have to customize this file. See ejbdoclet under the Xdoclet documentation.</span></em></p>
<p align=left><em><span>'ejbGenerate.xml' file is generated only once when you create your EJB module. So any changes made in this file will be reflected even if you modify your bean class and generate your classes again and again.</span></em></p>
<table cellPadding=0 width="100%" border=0>
    <thead>
        <tr>
            <td vAlign=top width="50%">
            <p align=left><span>As we can see from the code snippet of file shown in figure at right, there are following tags defined.</span></p>
            <p align=left><span>&lt;dataobject/&gt; is defined for generating data Objects for holding values of EJB component's persistent fields, which correspond to columns in the associated table in the database. </span></p>
            <p align=left><em><span>Note: &lt;dataobject/&gt; has been deprecated in favour of Value Object which is more powerful in terms of relationships (1-1, 1-n and n-m). </span></em></p>
            <p align=left><span>&lt;utilobject/&gt; Creates method for generating GUID and for accessing Remote and Local Home objects. </span></p>
            <p align=left><span>&lt;remoteinterface/&gt; Generates remote interfaces for EJBs.</span></p>
            <p align=left><span>&lt;</span><span>localinterface/&gt; Generates local interfaces for EJBs.</span></p>
            <p align=left><span>&lt;homeinterface /&gt; Generates remote home interfaces for EJBs.</span></p>
            <p align=left><span>&lt;localhomeinterface/&gt;Generates local home interfaces for EJBs.</span></p>
            <p align=left><span>&lt;entitypk/&gt;Generates primary key classes for entity EJBs.</span></p>
            <p align=left><span>&lt;entitybmp/&gt;Creates entity bean classes for BMP entity EJBs.</span></p>
            <p align=left><span>&lt;entitycmp/&gt;</span></p>
            <p align=left><span>&lt;session/&gt; Generates session bean class.</span></p>
            <p align=left><em><span>Note : There is no tag for generating a DAO.</span></em></p>
            <p align=left><em><span>So, we have to include this &lt;dao/&gt; tag.</span></em></p>
            <p align=left><em><span>For details, please refer ejbdoclet under Xdoclet documentation.</span></em></p>
            </td>
            <td vAlign=top width="50%">
            <p align=left><span><br clear=left></span></p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<table cellSpacing=4 cellPadding=0 width="100%" border=0>
    <thead>
        <tr>
            <td vAlign=top width="50%">
            <p align=left><span>As we can see from the code snippet from this file the following tags are defined.</span></p>
            <p align=left><span>&lt;jboss/&gt; is a JBOSS specific tag required for JBOSS. You have to specify datasource, datasourcemapping and preferredrelationmapping. As it differs for different databases, so you may have to specify values appropriate to your environment. If these tags are commented out in JBOSS they default to the correct values for the built-in Hypersonic SQL database, but for the moment we'll set them anyway.</span></p>
            </td>
            <td vAlign=top width="50%">
            <p align=left><span><br clear=left></span></p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<p align=left><span>The other two files which are of importance to us are ejb-jar.xml and jboss.xml. The file ejb-jar.xml has all the deployment descriptors for beans and jboss.xml has the JBOSS specific deployment descriptors required by JBOSS.</span></p>
<p align=left><em><span>Note : ejb-jar.xml file is generated every time you generate interface and helper classes for your bean. For the first time, it is empty, and jboss.xml will be generated every time when you will generate your classes for your bean.</span></em></p>
<p align=left>&nbsp;</p>
<p align=left><strong>&nbsp;</strong></p>
<p align=left><strong><span>Setup DAO :</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><span>Now, let's customize ejbGenerate.xml for setting up a DAO. </span></p>
<p align=left><strong><span>We have included a &lt;dao&gt; tag specifying the destination directory for the generated DAO interface and what pattern to be used.</span></strong></p>
<p align=left><span><br clear=left></span><em><span>Note : For details, please refer ejbdoclet under Xdoclet documentation.</span></em></p>
<table cellSpacing=4 cellPadding=0 width="100%" border=0>
    <thead>
        <tr>
            <td vAlign=top width="51%">
            <p align=left><span>We have included the datasource, datasoucremapping and preferredrelationmapping as shown in code snippet of ejbGenerate.xml file on right. </span></p>
            <p align=left><span>datasource="java:/DefaultDS" is a local JNDI name for data source to be used.</span></p>
            <p align=left><span>datsourcemapping="Hypersonic SQL" maps data object/value objects and their types to columns and data types associated with these columns.</span></p>
            <p align=left><span>preferredrelationmapping="foreign-key" defines type of database to be used. </span></p>
            <p align=left><em><span>Note : For more details, please refer JBOSS documentation.</span></em></p>
            <p align=left>&nbsp;</p>
            <p align=left><span>Since we are using the Hypersonic database, these parameters are appropriate to that. These parameters relate to the configuration file standardjbosscmp-jdbc.xml which controls the CMP-to-JDBC mappings for JBOSS. This resides in $JBOSS_HOME/server/conf/ , e.g. /opt/jboss/jboss-3.2.1/server/default/conf/.</span></p>
            <p align=left><span>Code snippet from standardjbosscmp-jdbc.xml is shown in figure at right.</span></p>
            </td>
            <td vAlign=top width="49%">
            <p align=left><span><br clear=left></span></p>
            <p align=left><span><br clear=left></span></p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<p align=left><em><span>Note : The way Xdoclet works is bit different from some conventional styles of programming, as the Xdoclet tags will generate these (home and remote) interfaces along with necessary helper classes, which then will used in Bean and DAO Implementation class. However, until these are generated, we cannot write any business methods in Bean and JDBC wrappers in the DAO Implementation class. If this seems confusing then just follow the steps, and hopefully it will become more clear. </span></em></p>
<p align=left><strong>&nbsp;</strong></p>
<p align=left><strong><span>Create DAO Interface :</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><span>Since we are going to use a DAO to access the database for this Stateless Bean, we have to create a DAOImpl class which will implement that generated DAO interface.</span></p>
<p align=left><strong><span>Go to src &gt; add package named au.com.tusc.dao &gt; Add a class StoreAccessDAOImpl in that package</span></strong><span>.</span></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Now go to your Bean class and declare this tag at the class level (that is at the top) as shown below to generate the DAO interface.</span></strong></p>
<p align=left><span><span>&nbsp;&nbsp; </span></span><span>@ejb.dao class="au.com.tusc.session.StoreAccessDAO"</span></p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>impl-class="au.com.tusc.dao.StoreAccessDAOImpl"</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Expand StoreAccessBean node under Package Explorer. Right click and a pop up menu will appear. </span></strong></p>
<p align=left><strong><span>On that menu go to Lomboz J2EE &gt; Add EJB to module. Select EJB '[MyStoreMgr]' &gt; OK.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Expand MyStoreMgr node under MyStore Project in Package Explorer. Right click and a menu will pop up.</span></strong></p>
<p align=left><strong><span>Go to Lomboz J2EE &gt; Generate EJB Classes as shown in the figure below.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <thead>
        <tr>
            <td vAlign=top width="70%">
            <p align=left><strong><span>EJB interfaces and helper classes are generated under ejbsrc/au.com.tusc.session directory as shown in the figure at the right. </span></strong></p>
            <p align=left><span>Seven files are generated. </span></p>
            <p align=left><span>StoreAccess is the remote object interface.</span></p>
            <p align=left><span>StoreAccessLocal is the local object interface.</span></p>
            <p align=left><span>StoreAccessSession extends our bean class named StoreAccesBean.</span></p>
            <p align=left><span>StoreAccessHome is the remote home interface.</span></p>
            <p align=left><span>StoreAccessLocalHome is the local home interface.</span></p>
            <p align=left><span>StoreAccessUtil is a helper class which has methods for accessing Home and LocalHome interface along with generating GUID.</span></p>
            <p align=left><span>StoreAccesDAO is the DAO interface which we will use to implement our StoreAccessDAOImpl under au.com.tusc.dao.</span></p>
            <p align=left><strong><span>StoreAccessDAO is generated by this tag declared in StoreAccesBean shown below. If you don't declare this tag in that file it won't generate this interface.</span></strong></p>
            <p align=left><span>&nbsp;</span><span>@ejb.dao class=au.com.tusc.session.StoreAccessDAO</span></p>
            <p align=left><span>&nbsp;</span><span>impl-class=au.com.tusc.dao.StoreAccessDAOImpl</span></p>
            <p align=left><strong><span>Other files of interest which are generated are ejb-jar.xml and jboss.xml under MyStoreMgr/META-INF. </span></strong></p>
            </td>
            <td vAlign=top width="30%">
            <p align=left><span><br clear=left></span></p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<table cellSpacing=4 cellPadding=0 width="100%" border=0>
    <thead>
        <tr>
            <td vAlign=top width="42%">
            <p align=left><strong><span>As shown in the figure on the right, a few descriptors are generated in the ejb-jar.xml file.</span></strong></p>
            <p align=left><strong><span>These descriptors are generated by the following tag declared in the StoreAccesBean file.</span></strong></p>
            <p align=left><span>@ejb.bean name ="StoreAccess"</span></p>
            <p align=left><span>jndi-name="StoreAccessBean"</span></p>
            <p align=left><span>type="Stateless"<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
            <p align=left><strong><span>This tag is added by Lomboz's bean creation wizard.</span></strong></p>
            </td>
            <td vAlign=top width="58%">
            <p align=right><span><br clear=left></span></p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p align=left><span>T<strong>his tag also generates the following descriptors in jboss.xml as shown in the code snippet below.</strong></span></p>
<p align=left><span><br clear=left><strong>So now we know which tags are responsible for generating classes, interfaces and descriptors</strong>.</span></p>
<p align=left><strong><span>Add Business Method :</span></strong></p>
<p align=left><strong><span>Next step is to add a business method in the bean.</span></strong></p>
<p align=left><strong><span>Go to StoreAccesBean &gt; Right click &gt; Select New on pop up menu &gt; Select Lomboz Ejb Method Wizard.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Add a business method with the following signature: public String loginUser (String username, String password).</span></strong></p>
<p align=left><strong><span>Select Method Type as Business and Interface as Remote as shown in the figure below..</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>This wizard generates a loginUser method in our bean class, with the method level tag '@ejb.interface' shown below.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>This tag is responsible for generating this method in the Remote Interface (in this case it is StoreAccess which will be created once you generate your classes). This tag is covered later on in this chapter. </span></strong></p>
<p align=left>&nbsp;</p>
<table cellSpacing=4 cellPadding=0 width="100%" border=0>
    <thead>
        <tr>
            <td vAlign=top width="52%">
            <p align=left><strong><span>Now, This business method needs to invoke a method on the DAO, which will communicate with the database.</span></strong></p>
            <p align=left><strong><span>Therefore we add another tag on this method, so that a method with this signature is generated in DAO interface which we can implement in the DAOImpl class. Then this business method can invoke the method in DAOImpl class to get the desired result.</span></strong></p>
            <p align=left><span>@dao.call name="loginUser"</span></p>
            <p align=left><strong><span>So add this tag at the method level as shown in the figure at right.</span></strong></p>
            <p align=left><strong><span>Now generate your EJB classes again as shown in the steps we went through earlier.</span></strong></p>
            <p align=left><em><span>Note: OK, OK! For reference these are the steps you have to follow.</span></em></p>
            <p align=left><em><span>Expand 'MyStoreMgr' node under 'MyStore' Project in Package Explorer.</span></em></p>
            <p align=left><em><span>Right click and a pop up menu will appear.</span></em></p>
            <p align=left><em><span>Go to Lomboz J2EE &gt; Generate EJB Classes.</span></em></p>
            </td>
            <td vAlign=top width="48%">
            <p align=left><span><br clear=left></span></p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p align=left><strong><span>After generating the classes, we look at first the generated DAO interface and then the generated Session Class.</span></strong></p>
<p align=left><strong><span>In StoreAcessDAO two methods are generated.</span></strong></p>
<p align=left><strong><span>1. init() by default.</span></strong></p>
<p align=left><strong><span>2. loginUser(), generated by tag shown below. </span></strong></p>
<p align=left><span>@dao.call name="loginUser"</span></p>
<p align=left><span><br clear=left><em><span>Note: Please do not edit any class generated by Xdoclect</span></em></span><em><span>.</span></em></p>
<p align=left><strong><span>In StoreAcessSession two methods of our interest are </span></strong></p>
<p align=left><strong><span>1. getDAO() creates instance of DAOImpl calss.</span></strong></p>
<p align=left><strong><span>2. loginUser(), calls loginUser method in DAOImpl class, which we have to implement. </span></strong></p>
<p align=left><strong><span>Code snippet from 'StoreAccessSession'.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Implement DAO Interface :</span></strong></p>
<p align=left><strong><span>Now, we will implement methods in the StoreAccessDAOImpl class.</span></strong></p>
<table cellSpacing=4 cellPadding=0 width="100%" border=0>
    <thead>
        <tr>
            <td vAlign=top width="45%">
            <p align=left><strong><span>First import the following packages.</span></strong></p>
            <p align=left><span>javax.naming.InitialContext;</span></p>
            <p align=left><span>javax.sql.DataSource;</span></p>
            <p align=left><span>java.sql.Connection;</span></p>
            <p align=left><span>java.sql.PreparedStatement;</span></p>
            <p align=left><span>java.sql.ResultSet;</span></p>
            <p align=left><span>java.sql.SQLException;</span></p>
            <p align=left><strong><span>Change your class declaration so that StoreAccessDAOImpl implements StoreAccessDAO.</span></strong></p>
            <p align=left><strong><span>Add a field to store the JDBC resource factory reference.</span></strong></p>
            <p align=left><strong><span>private</span></strong><span> DataSource jdbcFactory;</span></p>
            <p align=left><strong><span>In init() method, locate the reference "jdbc/DefaultDS" using the JNDI API, and store the reference in variable jdbcFactory.</span></strong></p>
            <p align=left><strong><span>Lookup string is </span></strong><span>"java:comp/env/jdbc/DefaultDS".</span></p>
            <p align=left><span>Code Snippet is shown in the figure on the right.</span></p>
            <p align=left><span>Now add the required code in loginUser().</span></p>
            </td>
            <td vAlign=top width="55%">
            <p align=left><span><br clear=right></span></p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p align=left>&nbsp;</p>
<table cellSpacing=4 cellPadding=0 width="100%" border=0>
    <thead>
        <tr>
            <td vAlign=top width="37%">
            <p align=left><strong><span>In method loginUser(), first get the connection to the database using the jdbcFactory.</span></strong></p>
            <p align=left><strong><span>Create a SQL statement which searches for userid in the table StoreAccess where userid and password is provided for each user. </span></strong></p>
            <p align=left><strong><span>Return userid if successful, else raise SQLException.</span></strong></p>
            <p align=left><span>Code snippet is shown in the figure on the right.</span></p>
            <p align=left><span>Go back to your loginUser method in StoreAccessBean class.</span></p>
            </td>
            <td vAlign=top width="63%">
            <p align=left><span><br clear=left></span></p>
            </td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
<p align=left><strong><span>In StoreAcessBean class under the loginUser method just add some debug statements, as shown below in this code snippet.</span></strong></p>
<p align=left><span><br clear=left><em><span>Note : We don't have to call the loginUser method in StoreAccessDAOImpl, as it being invoked by the loginUser method in StoreAccessSession class which inherits StoreAccessBean class, that is the StoreAccessSession class has overridden this method.</span></em></span></p>
<p align=left><em><span>Code snippet from StoreAccessSession shown below.</span></em></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Add Callback Methods :</span></strong></p>
<p align=left><span>Now, add callback methods to complete this bean as shown below.</span></p>
<ol type=1>
    <li><span>setSessionContext.</span></li>
    <li><span>UnsetSessionContext.</span></li>
</ol>
<p align=left><em><span>Note : These callback methods are invoked by the EJB container.</span></em></p>
<p align=left><strong><span>Add a field to store sessionContext.</span></strong></p>
<p align=left><strong><span>protected</span></strong><span> <span>SessionContext</span> <span>ctx;</span></span></p>
<p align=left><strong><span>Add method setSessionContext with sessionContext as parameter and assign that to the sessionContext variable as shown below in the code snippet.</span></strong></p>
<p align=left><span><br clear=left><strong>Similarly add method unsetSessionContext, assign context variable to null as shown above.</strong></span></p>
<p align=left><em><span>Note : StoreAccessSession class inherits the StoreAccessBean abstract class and implements </span></em><em><span>SessionBean, which will override all methods of interface SessionBean. So after finishing the methods in the bean class, generate your EJB classes again. SessionContext methods will be overridden as shown in figure below. </span></em><em><span>Code snippet from StoreAccessSession shown below.</span></em></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Now let's look at the generated Home and Remote interfaces.</span></strong></p>
<p align=left><strong><span>In the case of the Remote interface all business methods declared in the bean are also generated with the same signature. This is due to the class level tag declared in the StoreAccess Bean as discussed above after adding business methods. Code snippet for tag is shown below. </span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>So, loginUser is generated in a Remote Interface called StoreAccess as shown below because of this tag. </span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>In the case of the Home Interface only one method is created named 'create', which is generated by default because of the &lt;homeinterface/&gt; tag in ejbGenerate.xml as shown below.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Also, other then that, it has JNDI_NAME and COMP_NAME (which is the logical name to lookup the component) is also generated, these are generated because of this tag declared at class level in 'StoreAccessBean' class shown below in figure. </span></strong></p>
<p align=left><span><br clear=left><em><span>Note : For further options associated with these tags please refer to the 'ejbdoclet' documentation in Xdoclet.</span></em></span></p>
<p align=left><strong><span>Now, all the aspects are pretty much covered, and our bean's functionality is complete. Now for the deployment descriptors..</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>Deploy Bean :</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><span>In order to deploy our bean we have to declare a few tags in the StoreAccessBean class as shown below in the code snippet.</span></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Add the tag shown below in at the class level (at the top).</span></strong></p>
<p align=left><span>@ejb.resource</span><span>-</span><span>ref</span><span> <span>res</span><span>-</span><span>ref</span><span>-</span><span>name="jdbc/DefaultDS"</span></span></p>
<p align=left><span>res</span><span>-</span><span>type="javax.sql.Datasource"</span></p>
<p align=left><span>res</span><span>-</span><span>auth="Container"</span></p>
<p align=left><strong><span>This tag will generate deployment descriptors in ejb-jar.xml, as the bean has to know which datasource you are going to connect to, what is its type, etc. This will generate these descriptors as shown in code snippet below.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Add the tag shown below in StoreAccessBean at the class level (at the top).</span></strong></p>
<p align=left><span>@jboss.resource</span><span>-</span><span>ref</span><span> <span>res</span><span>-</span><span>ref</span><span>-</span><span>name="jdbc/DefaultDS" jndi</span><span>-</span><span>name="java:/DefaultDS<strong>"</strong></span></span></p>
<p align=left><strong><span>This tag will generate deployment descriptors in jboss.xml, as the application server has to know with what jndi-name datasource it has been registered with. This will generate these descriptors as shown in the code snippet below.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><span>Now, everything is complete, and it's time to deploy the bean.</span></p>
<p align=left><strong><span>First, regenerate your EJB classes as shown in the steps above for the final time.</span></strong></p>
<p align=left><em><span>Note : We have regenerated the classes again and again, in order to explain every step and its result. Once you are familiar with these steps you will need much fewer of these iterations. Either way, it doesn't matter, as your implementation always remains untouched by this process.</span></em></p>
<p align=left><strong><span>Go to Lomboz J2EE View &gt; expand node MyStore &gt; expand MyStoreMgr &gt; select 'Jboss 3.2.1 ALL' .</span></strong></p>
<p align=left><strong><span>Right click &gt; select Debug Sever on the pop up menu as shown in figure below.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Go to MyStoreMgr node in LombozJ2EE view &gt; right click &gt; select Deploy on the pop up menu as shown in the figure below</span></strong><span>.</span></p>
<p align=left><span><br clear=left></span></p>
<p align=left><span>And now wait for your deployment result.</span></p>
<p align=left><span>If everything goes fine, you will have this message under your console as shown in the figure below.</span></p>
<p align=left><span><br clear=left></span></p>
<p align=left><span>So, now our bean is deployed successfully, let's create our test client, which will invoke the loginUser method on 'StoreAccessBean'.</span></p>
<p align=left><strong>&nbsp;</strong></p>
<p align=left><strong><span>Create your Test Client :</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><span>G<strong>o to Project MytStore node &gt; select src node &gt; right click.</strong></span></p>
<p align=left><strong><span>Select New on pop up menu &gt; select Lomboz EJB Test Client Wizard</span></strong><span> as shown in the figure below. </span></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Select package name au.com.tusc.client, name as SessionClient and select Ejb Home as au.com.tusc.session.StoreAccessHome and Ejb Interface as au.com.tusc.session.StoreAccess</span></strong><span> <strong>as shown in the figure below</strong>.</span></p>
<p align=left><span><br clear=left></span></p>
<p align=left><span>This will generate the required methods for you in your SessionClient class and you have to just invoke the loginUser method on the bean as shown below.</span></p>
<p align=left><span><br clear=left></span></p>
<p align=left><span>Now the last step is to write code in your client.</span></p>
<p align=left><strong><span>So add these lines under the testBean </span></strong><span>method as shown in figure below<strong>. </strong></span></p>
<p align=left><span>System.out.println(</span><span>"Request from client : "</span><span>);</span></p>
<p align=left><span>System.out.println(</span><span>"Reply from Server: Your userid is "</span><span> <span>+</span></span></p>
<p align=left><span>myBean.loginUser(</span><span>"ANDY"</span><span>,</span><span>"PASSWD"</span><span>));</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong>&nbsp;</strong></p>
<p align=left><strong><span>Test your Client :</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><strong><span>Now, in order to test your client, Select SessionClient node &gt; Go at top level menu and select the icon with the 'Running Man'</span></strong><span>.</span></p>
<p align=left><strong><span>On that select 'Run as' &gt; select 'Java Application'</span></strong><span>, as shown below.</span></p>
<p align=left><span><br clear=left></span></p>
<p align=left><strong><span>Now under your console, if you get your reply for 'ANDY' as 'U2', then your call is successful as shown below.</span></strong></p>
<p align=left><span><br clear=left></span></p>
<p align=left><em><span>Note : So our Stateless Session Bean is deployed and tested successfully and from now onwards you should be comfortable using Lomboz. In future we will not go into the detail of the steps for using Lomboz and will concentrate more on other aspects of beans.</span></em></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span>小结</span></p>
<p><span>通过表示</span><span>J2EE</span><span>应用程序中的任务或者行动。</span><span>Session Beans</span><span>可以因此而处理大量的状态。尤其是在同其他</span><span>EJB</span><span>合用的情况下。理解</span><span>Session Beans</span><span>的瞬时现象对开发者的工作会带来莫大的帮助。有状态和无状态</span><span>Beans</span><span>的细微差别就如同充分利用其行为一样重要。在掌握以上的概念之后，正确的设计和实现</span><span>Session Beans</span><span>必然会显著改进</span><span>EJB</span><span>应用程序的功能和效率。</span></p>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/121221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2007-05-31 18:28 <a href="http://www.blogjava.net/hengheng123456789/archive/2007/05/31/121221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jBPM 流程定义语言 (JPDL)</title><link>http://www.blogjava.net/hengheng123456789/archive/2007/03/02/101387.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Fri, 02 Mar 2007 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/archive/2007/03/02/101387.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/101387.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/archive/2007/03/02/101387.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/101387.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/101387.html</trackback:ping><description><![CDATA[JPDL 是指定的xml模式和机制包装所有的流程定义相关文件到一个流程文档. <br /><br /><p>流程文档是一个zip文件. 文档的中心流程是 <tt class="literal">processdefinition.xml</tt> . 文件中主要信息是流程图.  <tt class="literal">processdefinition.xml也包含关于动作和任务的信息</tt> . 流程文档也包含其他流程相关文档比如类,任务ui-form  ...<br /><br /></p><p>发布文档文档可以通过3种方式来做: 用流程设计器工具, 用ant任务或编程实现. </p><p>发布任务通过设计器工具依然在开发阶段. </p><p>发布任务文档通过ant任务如下: </p><pre class="programlisting">&lt;target name="deploy.par"&gt;
  &lt;taskdef name="deploypar" classname="org.jbpm.jpdl.par.ProcessArchiveDeployerTask"&gt;
    &lt;classpath --make sure the jbpm-[version].jar is in this classpath--/&gt;  
  &lt;/taskdef&gt;  
  &lt;deploypar par="build/myprocess.par" /&gt; 
&lt;/target&gt;</pre><p>一次发布多个流程文件, 用嵌套的fileset元素. file属性是可选的. 其他ant 任务属性是:</p><div class="itemizedlist"><ul type="disc"><li><span class="bold"><b>cfg</b></span> : cfg 可选的, 默认值是'hibernate.cfg.xml'. hibernate配置文件包含jdbc connection属性和mapping 文件. 
</li><li><span class="bold"><b>properties</b></span> : 属性是可选的并且覆盖所有来自hibernate.cfg.xml的同样属性 
</li><li><span class="bold"><b>createschema</b></span> : 如果为true, jbpm数据库模式将在发布之前被建立.</li></ul></div><p>流程文档也可通过编程来发使用类 <tt class="literal">org.jbpm.jpdl.par.ProcessArchiveDeployer</tt><br /><br /></p><p>流程定义基本不会改变,因为预测所有流程定义变化是非常困难的.</p><p>围绕这个问题, jBPM 有一个久经考验的流程版本机制.版本机制允许多个同名的流程定义在数据库中同时存在. 流程实例使用最后的可用版本并且并且在同一个流程里持续执行知道生命周期结束.当较新的版本被发布, 较新的建立实例将用最新的版本,同时老的流程实例用老的流程定义保持执行.</p><p>流程定义是组合声明指定图和一组相关的java classes. Java classes  能被jBPM运行时间环境以2种方式使用: 让这些class被jBPM classloader看到. 这是把你的委托 类放到.jar文件然后到 <tt class="literal">jbpm-[version].jar</tt> . java classes 也能被包括进流程文档. 当你包括你的委托类到流程文档(它们对jbpm classloader是不可见的), jBPM 将使用这些class版本. 关于流程载入的信息参考 <a title="13.2.&amp;nbsp;Delegation" href="http://www.open68.com/doc/jbpm-3.0/jpdl.html#delegation"><font color="#002c99">13.2章节, “委托”</font></a></p><p>当流程档案被发布时, 它在jBPM数据库中生成一个流程定义. 流程定义可以被版本化基于基本的流程定义名字.当命名的流程档案被发布时,发布者将分配给它一个版本数字. 为了分配数字,发布者将查询同名的流程最高版本数字加1.没有名字的流程定义版本数字为-1. </p><img src ="http://www.blogjava.net/hengheng123456789/aggbug/101387.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2007-03-02 10:11 <a href="http://www.blogjava.net/hengheng123456789/archive/2007/03/02/101387.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JBI与ServiceMix</title><link>http://www.blogjava.net/hengheng123456789/archive/2007/03/02/101367.html</link><dc:creator>哼哼</dc:creator><author>哼哼</author><pubDate>Fri, 02 Mar 2007 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/hengheng123456789/archive/2007/03/02/101367.html</guid><wfw:comment>http://www.blogjava.net/hengheng123456789/comments/101367.html</wfw:comment><comments>http://www.blogjava.net/hengheng123456789/archive/2007/03/02/101367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hengheng123456789/comments/commentRss/101367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hengheng123456789/services/trackbacks/101367.html</trackback:ping><description><![CDATA[
		<p>
				<br />Java的进展都是围绕着JSR形式的规格说明书进行的。最近，这个家族中又新添了一个成员，那就是JBI(Java Business Integration)。它是一种企业服务总线(Enterprise Service Bus,ESB)，用于形成一种关键基础设施片段，使我们能够用Java实现面向服务的架构。我们将在本文中探讨JBI有关概念以及一种名为SeviceMix的开源实现。 </p>
		<p>JBI的主要目的是提供一个基于服务的平台作为对现有Java/J2EE平台功能的扩展。由于Web services已经实际应用于J2EE中，而且ESB和SOA等术语与其说是技术推动力倒不如说更是市场概念，所以让我们一起来深究一下到底什么是Java/J2EE中所谓的“基于服务的平台”。 </p>
		<p>当前的J2EE部署都运行在一个基础上，那就是应用服务器。应用服务器本身由两个独立的部分组成——Servlet容器和EJB容器，它们分别用于部署JSP/Servlets和EJB构件。在它们中的任何一个，你都能使用Web services。但是，在任何环境中以分散的方式使用services是很困难的工作，而JBI的目的就是为完成这个任务提供一个专门的环境。 </p>
		<p>JBI的最底层是一个容器，它与J2EE中的容器一样定义了自身的部署构件。在我们深入之前，让我们先详细了解一下JBI的主要构想。 </p>
		<p>首先，它关注了Web services的核心部分:在终端之间传输的SOAP 消息/信封。这种数据段或标记能够包含被服务于很多应用的信息。不仅如此，根据发送端或接受端的不同，它还能协助把某个业务逻辑与数据适配。 </p>
		<p>现在，回过头来看看今天的Web services。在Web services出现之前，对于很多企业应用来说，使用面向消息的中间件系统或者MOM实现异构系统之间的通信已经足够了。Web services的出现同样是处于这个目的。用MOM的基于消息的架构和Web services很类似，被服务的数据也能在应用之间进行无缝操作。 </p>
		<p>这种场景可以被应用到典型的J2EE环境中，并通过JMS或JAX-RPC等技术进行服务。这种做法对简单部署是可行的，但正如前面提到的，当进行很复杂的设计时，现有的容器则显得很难用。于是JBI试图解决这个问题。 </p>
		<p>JBI提供了一种正规消息路由器(Normalized Message Router,NMR)，说白了，就是一个地点。在这个地点，所有基于消息的数据片段——SOAP片段、MOM消息、HTTP数据或其它信息——被聚合、集中、应用到业务逻辑、传输，如果有必要则被转换成其它格式并随后被分派到最终目的地。 </p>
		<p>先前的描述说明了为什么JBI被称为ESB。它很适合企业级应用，因为它通过一种总线型架构的基于消息的手段到达了适应大范围的消费者和提供者的目的。现在，让我们看看除了NMR还有什么构成了JBI。 </p>
		<p>和JBI环境直接交互的是两个部分，JBI machine和JBI binding。JBI machine定义了部署构件以及在环境中管理它们的方式。本质上，它是提供商设计的黑盒，用于在JBI中支持他们自己的模型。另一方面，JBI binding则被环境通过专门的业务协议与外部世界进行通信。 <br /> <br />现在，再让我们把这些概念放到真实的JBI实现ServiceMix中。ServiceMix是完全用JBI的思想开发的一个开源项目。它可以支持多种绑定，包括HTTP、JMS、平面文件以及RSS，还提供了一系列类似BPEL、Schema Validation、JCA 和缓存等服务。 </p>
		<p>与ServiceMix协作的还有基于JMX的管理接口以及用来与JBI构件通信的对本地客户端API。尽管本文不对ServiceMix功能做进一步说明，但你可以很容易地下载该软件然后继续学习。下面，让我们来看看一个可部署在ServiceMix上的真实的JBI构件，这样你会对它有点感性认识。</p>
		<p>Listing for JBI Components - File Sender &amp; File Receiver.　　</p>
		<p> </p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
		<p>&lt;beans xmlns:my="<a href="http://servicemix.org/demo/">http://servicemix.org/demo/</a>"&gt;</p>
		<p>  &lt;!-- the JBI container --&gt;</p>
		<p>  &lt;container id="jbi"&gt;</p>
		<p>  &lt;property name="useMBeanServer" value="true"/&gt;</p>
		<p>  &lt;property name="createMBeanServer" value="true"/&gt;</p>
		<p>  &lt;property name="dumpStats" value="true"/&gt;</p>
		<p>  &lt;property name="statsInterval" value="10"/&gt;</p>
		<p>     &lt;components&gt;</p>
		<p>     &lt;!-- Write files to the outbox directory --&gt;</p>
		<p>      &lt;component id="fileSender"   service="foo:fileSender"     class="org.servicemix.components.file.FileWriter"&gt;</p>
		<p>      &lt;property name="directory" value="outbox"/&gt;</p>
		<p>      &lt;property name="marshaler"&gt;</p>
		<p>      &lt;bean  class="org.servicemix.components.util.DefaultFileMarshaler"&gt;</p>
		<p>      &lt;property name="fileName"&gt;</p>
		<p>      &lt;bean class="org.servicemix.expression.JaxenStringXPathExpression"&gt;</p>
		<p>      &lt;constructor-arg value="concat('sample_', <a>/sample/@id</a>, '.xml')"/&gt;</p>
		<p>      &lt;/bean&gt;</p>
		<p>      &lt;/property&gt;</p>
		<p>       &lt;/bean&gt;</p>
		<p>      &lt;/property&gt;</p>
		<p>   &lt;/component&gt;</p>
		<p>   &lt;!-- Look for files in the inbox directory --&gt;</p>
		<p>    &lt;component id="filePoller" service="foo:filePoller"  class="org.servicemix.components.file.FilePoller"   destinationService="foo:fileSender"&gt;</p>
		<p>      &lt;property name="workManager"  ref="workManager"/&gt;</p>
		<p>      &lt;property name="file" value="inbox"/&gt;</p>
		<p>      &lt;property name="period" value="1000"/&gt;</p>
		<p>    &lt;/component&gt;   </p>
		<p>   &lt;/components&gt;    </p>
		<p> &lt;/container&gt;</p>
		<p>  &lt;!-- the work manager (thread pool)  for this container --&gt;</p>
		<p>  &lt;bean id="workManager"  class="org.jencks.factory.WorkManagerFactoryBean"&gt;</p>
		<p>      &lt;property name="threadPoolSize"  value="30"/&gt;</p>
		<p>  &lt;/bean&gt;</p>
		<p>&lt;/beans&gt;<br /> </p>
		<p>JBI规格说明书本身并没有定义构件应该如何编码。请注意，ServiceMix用XML风格的语法定义了两个核心构件，关联到特定的类和属性。在把这种结构部署到ServiceMix以后，环境就会创建一种查询构件，负责从系统和其它构件中读取存档信息，然后把读取的值返回到文件系统。 </p>
		<p>该文件系统是JBI中非常基本的场景，因为信息就是从JBI环境(NMR)原样集中的，然后被返回到同样类型的绑定(文件系统)。但是很明显，一旦JBI环境有能力把任何业务逻辑适配成数据，例如BPEL或schema validation，然后重定向到其它类型的绑定，例如HTTP或RSS，那么就不只是返回到文件系统了。 </p>
		<p>正如你意识到的一样，当一用到JBI，操纵及分发数据的可能性就很大，但即使JBI用Java的方法实现了SOA，JSR-208规格说明书还是受到了批评。IBM和BEA是Java/J2EE领域的两个主要推动者，他们就不支持这个新项目。尽管如此，还是有像ServiceMix这样的小项目开发者和一些闭源开发组织打赌，一个培育良好的JBI市场将和J2EE的情况差不多。 </p>
		<p>假如你正在Java中使用Web services或者为了复杂的集成任务使用基于消息的设计，你应该对JBI的进展特别关心，因为它能为执行这样的任务提供更健壮的平台。就算你对JBI/ESB是否能加入J2EE协议栈还存有怀疑，继续关注还是有帮助的，因为它可能会成为应用服务器领域像Spring那样的事实上的“第三容器”或轻量级的容器扩展，为Java提供SOA能力。 <br /></p>
<img src ="http://www.blogjava.net/hengheng123456789/aggbug/101367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hengheng123456789/" target="_blank">哼哼</a> 2007-03-02 09:41 <a href="http://www.blogjava.net/hengheng123456789/archive/2007/03/02/101367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>