Java 人生

java (Java EE)&Linux

BlogJava 首页 新随笔 联系 聚合 管理
  15 Posts :: 2 Stories :: 5 Comments :: 0 Trackbacks

2006年4月20日 #

 

BPEL的概念

      BPEL(Business Process Execution Language)又叫BPEL4WS(Business Process Execution Language For Web Service),面向Web服務的業務流程執行語言。是一種使用Web服務定義和執行業務流程的語言。BPEL提供了一種相對簡單易懂的方法,可將多個WEB服務組合到一個新的復合服務(稱作業務流程)中。

      BPEL本身是一個Web服務,可以作為服務的提供者。

      BPEL是基於Web服務的,沒有Web服務就沒有BPEL


  

 BPEL
的運作方式


 BPEL的一般構成

      一個以bpel為後綴的文件(例如MyFlow.bpel)

      一個WSDL文件

      一個部置XML文件,樣子形似bpel.xml

 BPEL的實現需求

      需要熟悉單個的Web Service的使用方法

      需要了解具體的業務流程

      需要一個運行BPEL的處理器

      需要一個流程設計器

      當然需要對BPEL語法標簽的掌握等

8.6 BPEL的結構

BPEL的一般結構

            <process>

              <partnerLinks>

                <partnerLink>

                </partnerLink>

              </partnerLinks>

              <variables>

                <variable/>

              </variables>

              <faultHandlers>   

              </faultHandlers>

              <sequence>

                  Activities

              </sequence>

            </process>

<process>的屬性

<process name="ncname" targetNamespace="uri"

         queryLanguage="anyURI"?

         expressionLanguage="anyURI"?

         suppressJoinFailure="yes|no"?

         enableInstanceCompensation="yes|no"?

         abstractProcess="yes|no"?         xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/">

.

.

</process>

<partnerLinks>樣式

<partnerLinks>

    <!– 注意:至少要指定一個角色. -->

    <partnerLink name="ncname"

                         partnerLinkType="qname"

                         myRole="ncname“

                         partnerRole="ncname">

    </partnerLink>

 </partnerLinks>

<variables>樣式

<variables>

    <variable name="ncname"  

                    messageType="qname/>

 </variables>

<faultHandlers>樣式

<faultHandlers>

 <catch faultName="qname“

             faultVariable="ncname">

      activity

    </catch>

    <catchAll>

      activity

    </catchAll>

 </faultHandlers>

Activities包含具體如下

            <receive>

            <reply>

            <invoke>

            <assign>

            <throw>

            <terminate>

            <wait>

            <empty>

            <sequence>

            <switch>

            <while>

            <pick>

            <flow>

            <scope>

            <compensate>

基本活動一

            <invoke>

– 調用某個 Web 服務上的操作

            <receive>

– 等待一條消息來回應由某人從外部進行調用的服務介面的操作

            <reply>

– 生成輸入/輸出操作的回應

            <wait>

– 等待一段時間

基本活動二

            <assign>

– 把資料從一個地方複製到另一個地方

            <throw>

– 指明某個地方出錯了

            <terminate>

– 終止整個服務實例

            <empty>

– 什麽也不做

結構化活動

            <sequence>

– 定義一組步驟的有序序列

            <switch>

– 使用現在常見的“case-statement”辦法來産生分支

            <while>

– 定義一個迴圈

            <pick>

– 執行幾條可選路徑中的一條

            <flow>

– 以及指明一組步驟應該並行地執行

一個完整的簡單示例

<process name="test" targetNamespace="http://acm.org/samples"

               suppressJoinFailure="yes"

               xmlns:tns="http://acm.org/samples"

               xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"

               xmlns:bpelx="http://schemas.oracle.com/bpel/extension"

               xmlns:ora="http://schemas.oracle.com/xpath/extension"

               xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/">

   <partnerLinks>

   <!-- The 'client' role represents the requester of this service. -->

      <partnerLink name="client" partnerLinkType="tns:test" myRole="testProvider"/>

   </partnerLinks>

   <variables>

      <variable name="input" messageType="tns:testRequestMessage"/>

      <variable name="output" messageType="tns:testResponseMessage"/>

   </variables>

   <sequence name="main">

      <receive name="receiveInput" partnerLink="client" portType="tns:test" operation="process" variable="input" createInstance="yes"/>

      <assign name="creatReturnStr">

         <copy>

            <from expression="concat(&quot;Hello&quot;, bpws:getVariableData('input','payload','/tns:testRequest/tns:input'))"></from>

            <to variable="output" part="payload" query="/tns:testResponse/tns:result"/>

         </copy>

      </assign>

      <reply name="replyOutput" partnerLink="client" portType="tns:test" operation="process" variable="output"/>

   </sequence>

</process>

posted @ 2007-09-14 08:51 jinmy liao 阅读(477) | 评论 (0)编辑 收藏

配置說明

程序名稱

JBoss ESB

數據庫路徑和名稱

222.118.20.108\jbossesb

程序的文件構成說明

1)       Jboss4.0.4GA (contain Ejb3.0)

2)       jbossesb-4.0Beta1MP1    

2.1 jbossesb-appl.ear

2.2 jbossEsb.properties

2.3 JBossESB-ds.xml

2.4 properties-service.xml

2.5 ObjStore.xml

配置步驟如下 :

  1. jbossesb-appl.ear 復制到 <JBoss-home>/server/default/deploy
  2. properties-service.xml 復制到 <Jboss-home>/server/default/deploy
  3. 復制 Jbossesb.properties <Jboss-home>/server/default/conf
  4. 編輯 JBossESB-ds.xml
  5. 復制 JbossESB-ds.xml <JBoss-home>/server/default/deploy

 

運行條件和配置說明

運行平台和條件

Windows

Linux

數據源配置

1)數據源配置在JBossESB-ds.xml文件配置,詳細信息如下:

<datasources>

  <local-tx-datasource>

    <jndi-name>JBossESBDS</jndi-name>

 

    <connection-url>jdbc:jtds:sqlserver://222.118.20.108;DatabaseName=jbossesb</connection-url>

    <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>

    <user-name>dbname</user-name>

    <password>access</password>

 

    <min-pool-size>10</min-pool-size>

    <max-pool-size>100</max-pool-size>

    <blocking-timeout-millis>1000</blocking-timeout-millis>

    <idle-timeout-minutes>5</idle-timeout-minutes>

 

  </local-tx-datasource>

 

</datasources>

2.修改jbossEsb.properties文件:

org.jboss.soa.esb.mail.smtp.host=www.163.com

org.jboss.soa.esb.mail.smtp.port=23

org.jboss.soa.esb.mail.smtp.user=ejinmy

org.jboss.soa.esb.mail.smtp.password=123456789abc

 

 

#

# Object Store Settings

#

org.jboss.soa.esb.objStore.configfile=file:/e:/temp/ObjStore.xml

程序運行配置

必需是 JBoss .4.0.4 版本,還要支持 EJB3.0

運行 JBoss App Server 就啟動了 JBoss ESB.

其它說明

數據庫表(script)

CREATE TABLE batches (

    batch_num int NOT NULL,

    seq integer NOT NULL,

    data varchar,

    CONSTRAINT batches_pk PRIMARY KEY (batch_num,seq)

);

 

 

CREATE TABLE object_snap (

    uid int NOT NULL,

    stamp int,

    snap_type varchar,

    object_uid int,

    batch_num int,

    xml_data varchar,

    CONSTRAINT object_snap_pk PRIMARY KEY (uid)

);

 

 

CREATE TABLE people_index (

    uid bigint NOT NULL,

    stamp int,

    latest_snap_uid int,

    latest_snap_date varchar,

    name varchar,

    phone varchar,

    address varchar,

    CONSTRAINT people_index_pk PRIMARY KEY (uid)

);

 

 

CREATE TABLE uid_table (

    uid integer NOT NULL,

    sequence_name varchar NOT NULL,

    last_used_uid bigint NOT NULL,

    CONSTRAINT uid_table_pk PRIMARY KEY (uid)

);

 

 

INSERT INTO uid_table (uid, sequence_name, last_used_uid) VALUES (1, 'jbossEsb_objuid', 10500000);

INSERT INTO uid_table (uid, sequence_name, last_used_uid) VALUES (2, 'jbossEsb_batchuid', 251000);

   

此文檔是配置安裝JBOSS ESB的步驟說明書.

 

填寫日期: 2006/10/18      填寫人:      jinmy     
  更新日期:

 

 

有使用JBoss ESB的可以一起探討,QQ:182529178
posted @ 2006-10-21 14:20 jinmy liao 阅读(2318) | 评论 (1)编辑 收藏

cimero
posted @ 2006-09-26 11:26 jinmy liao 阅读(772) | 评论 (0)编辑 收藏

  好久都沒有來這裡看一下了,由於這兩個月要忙一個流程,公司在英國開一個銷售公司,要准備程序給他們用,本來現在的流程運作基本上可以,但是現在的程序能拿到英國用?
  由於是一個銷售的公司,有了銷售、采購、倉庫就差不多了。這些程序我們都有,但是為了那邊的程序、流程能順暢的運行,任務還有好多,到8月15任務就要完成,也差不多了,呵,看了下現在的情況,還基本上可以,不過還有程序沒有組合起來。
  從這兩個月的任務中,我感覺到程序的開發要做到重用、擴展,並不是很容易的事。
首先從數據層來說,不同的地方有可能使用不同的數據表,在java中開發到是比較容易處理,但是如果是用C/S的delphi開發的大部分都是直接使用sql的,很難實現這一點
也許你會說,為什麼不使用同一個數據表?情況很多,我們公司是這樣的,賣了一套ERP(不完整版本),自己開發了其余部分,這兩個程序
要同時運行,只有我們新開發的程序要使用不同表的情況。同樣我們的合作公司,有可能有他自己的系統,如果能做到不依賴於基表
就更容易重用,數據共享.
接下來就是:業務功能的重用.
像倉庫的進貨、出貨,可用於PO,SO,生產等,都是一樣的意義。為了能使不同地方的業務功能能重用,我們使用SOA的思想
利用WebServices、ESB的技術來實現,業務的服務化.
再就是:擴展
不同的地方有可能需求有不同,這是很合乎情理的,如現在英國要看到我們貨物在途量,本來倉庫沒有這個功能的.
我想要做到軟件的可維護、可重用不是簡單的知道使用語言,這個直接輿個人的習慣有很大的關係
其他開發軟件,就是開發人員處理這個,等於生活的中的煮飯一樣,有的人很輕松就完成,有的人就弄的一團糟
多鍛煉積累經驗也是重要,最後提醒自己,做任何事情都不能馬虎,要仔細考慮。同時希望8.15能完成任務

 

posted @ 2006-08-01 20:11 jinmy liao 阅读(410) | 评论 (0)编辑 收藏

感覺沒有插件開發工程真的好辛苦,總想去找個插件,但是一直沒有發現,有哪位朋友使用ESB的,能介紹個開發工具?
posted @ 2006-07-23 09:54 jinmy liao 阅读(1563) | 评论 (1)编辑 收藏

不好意思,才知道我也加入了這個團對,非常感謝。
先說一下我的SOA觀點吧.
從程序開始的結構化到面向對象,到現在現在的面向服務(組件),從原來的重用打包提供API,到現在的SPI
世界上的每一個細胞都在發育成長,同樣電腦的技術也是不段的更換原來的技術觀念。
我從去年開始用web services,那時候還不在了解SOA,只知道ws能實現原來的分布式.
隨著ws的wsdl增多,可能要先調用一個接口得到結果再去調用另外一個接口得到結果,這樣就認識了BPEL.
也知道了SOA在一個企業中能把所有不同的系統之間關聯起來的思想的必要性。我覺得SOA思想應該是這十年,重要的編程思想
也許有一天還有更厲害的思想,哪時候應該是很少寫程序的了,這樣就有另外的架構。

呵,以後我會跟大家多認識,我現在在用mule來實現ESB,以後跟大家交流.
posted @ 2006-04-25 19:44 jinmy liao 阅读(524) | 评论 (1)编辑 收藏

一.SOA
SOA是一種新架構程序的方法通過服務組合,而不是模塊方法組合代碼.
SOA軟件系統架構原理是基於自身描述理念:一個服務是一個Function(usually a business function)服務提供者和服務消費者之間通過消息交換來完成.
SOA優點:
1)SOA主要的優點是:松耦合(decoupling)
   在服務提供者和服務消費之間提供接口,這樣可以更改服務的具體實現而不影響服務消費。
2)SOA的另外一個好處是可重用的(reuse)服務可以在不同的應用程序中重用。
我們可以想象應用程序除了包括使用服務、服務提供之外沒有其他的東西了。
SOA應用:
一個應用程序符合SOA包括兩個不同的開發行為:
1)Service Creation:集成現成的方法使它們成為服務。
2)Service Composition:使用現成的服務創建一個應用程序和更大的服務.

二.JBI(Java Business Integration)
JBI是SOA的解決和集成的基礎
JBI提供了組件之間交互的消息基礎:
 1)NormalizedMessage(NM) 所有基于消息的數據片段——SOAP片段、MOM消息、HTTP數據或其它信息——被聚合、集中、
 應用到業務邏輯、傳輸,如果有必要則轉換成其他格式隨後被分派到最終目的地
 2)JBI machine (SE)
   組件提供或者消費服務是基於本地的
 3)JBI binding (BC)
   組件 提供或者消費服務是通過一些通信協議或者是其他遠程技術
 組件之間的交互通過消息交換,消息是服務提供者發佈的WSDL 
服務元件(Service Unit)
 一個服務元件看作是一個黑盒子,它提供了一個靜態的服務,
 服務元件中包含有,提供的服務和服務消費者。它們都從屬服務元件,一個服務元件可以有0個或者多個服務

 服務集合(service Assembly)
 組合服務元件是大的應用程序或者新的服務形式出現 A Service Assembly:一組JBI 服務元件連同描述它們的關係和目標組件
總結:
JBI是SOA結構的基礎,它把原來的業務函數集成為一個服務,使服務提供者和服務消費者之間的交互是松耦合的,通過service assembly(服務集合)
可以組合不同的程序,架構圖:
JBI.bmp

servicemix

 
posted @ 2006-04-22 16:24 jinmy liao 阅读(1270) | 评论 (2)编辑 收藏


消息傳遞系統通常被成為MOM(Message Oriented MiddleWare),作為消息服務器,MOM需要客戶端用統一的標准訪問服務器,JMS標准是使用
最廣泛的消息接口標准.
JMS消息分點對點、基於主題的消息兩種
點對點方式:是兩個客戶端建立消息隊列,消息發送者(sender)把消息(Message)給消息服務器中的一個隊列(Queue),消息接受者(receiver)從服務器中這個隊列中
獲取消息.
主題消息:消息發送者響向消息服務器中的一個主題發送消息(Message),對這個消息有訂閱的接受者都會接受到這個消息.
JMS中的主要名詞:
1)目的地(Desination)
 是發送者和接受者的一個共同的地點,發送者把消息發送到這裡,接受者從這裡獲取消息,是我們在服務器中創建的一個隊列,服務器會對這個地方的所有消息維護。
2)會話
 消息發送者和接受,都要通過JNDI獲取消息服務器的上下文,session就是這樣的一個上下文對象,它可以創建消息生產者、消費者,可以創建點對點消息、主題消息
所有的消息操作都圍繞這個會話展開.

消息結構的介紹
用過web services(SOAP)應該知道消息包括信封、消息頭、主體、附件.同樣JMS消息結構也是差不多包括消息頭、消息屬性、消息體.
以JMS、SOAP為基礎可以實現面向消息模型(MOM Message Oriented Model)。
JMS消息樣式:
SpyTextMessage {
     Header {
        jmsDestination  : QUEUE.mytestjms
        jmsDeliveryMode : 2
        jmsExpiration   : 0
        jmsPriority     : 4
        jmsMessageID    : ID:6-11454947326091
        jmsTimeStamp    : 1145494732609
        jmsCorrelationID: null
        jmsReplyTo      : null
        jmsType         : null
        jmsRedelivered  : false
        jmsProperties   : {}
        jmsPropReadWrite: false
        msgReadOnly     : true
        producerClientId: ID:6
     }
     Body {
        text            :sender message from liao test
     }
JMS簡單編程實現點對點的消息 服務器用jboss-4.0.3SP1
1)首先在JBOSS中部屬一個點對點的消息隊列
配置文件放在JBOSS_Home\server\default\deploy\jms
配置文件的內容為:
<?xml version="1.0" encoding="UTF-8"?>

<server>
 <!--是一個點對點的用org.jboss.mq.server.jmx.Queue(Topic),desination的名稱為mytestjms 
  更多的配置說明可以看原來jboss自帶的Jms配置文件,文件名要用*-service.xml
 -->
  <mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=mytestjms">
    <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
  </mbean>

</server>
2)實現消息發送者
import java.util.Hashtable;
import javax.jms.*;
import javax.naming.*;
public class JMSSender {
    QueueSession session;
    QueueConnection conn;
    QueueSender sender;
    QueueReceiver receiver;
    public void clientconnect()throws Exception
    {
        //消息服務器(destination)設置
        Hashtable env =  new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
        env.put(Context.PROVIDER_URL,"localhost");
        Context iniCtx = new InitialContext(env)  ;
         //查創建JMS連接的工廠類
        Object tmp = iniCtx.lookup("ConnectionFactory");
        QueueConnectionFactory qcf = (QueueConnectionFactory)tmp;
        
        //查找JMS目標對象 點對點
        Queue queue = (Queue)iniCtx.lookup("queue/mytestjms");
        //創建JMS連接
        conn = qcf.createQueueConnection();
        //創建JMS會話
         session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
         //開始連接
        conn.start();
        sender = session.createSender(queue);
        receiver = session.createReceiver(queue);
    }
    public  JMSSender()
    {
        try{
           System.out.println("begin");
            clientconnect();
            TextMessage textmsg = this.session.createTextMessage();
            textmsg.setText("sender message from liao test");
            //發送消息 點對點
            sender.send(textmsg);
            disConnect();
            System.out.println("success");
        }catch(Exception e)
        {
            e.printStackTrace();
        }

    }
    /**
     * 停止和關閉JMS連接
     * @throws JMSException
     */
    public void disConnect() throws JMSException
    {
        conn.stop();
        session.close();
        conn.close();
    }
    public Message receiver() throws JMSException
    {
        return receiver.receive(1000);
    }
    public static void main(String[] args)throws Exception
    {
         new JMSSender();
    }
}
3)實現消息接受者
import java.util.Hashtable;
import javax.jms.*;
import javax.naming.*;
public class JMSReceiver {
    QueueSession session;
    QueueConnection conn;
    QueueReceiver receiver;
   
    public void clientconnect()throws Exception
    {
        Hashtable env =  new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
        env.put(Context.PROVIDER_URL,"localhost");

        Context iniCtx = new InitialContext(env)  ;
        Object tmp = iniCtx.lookup("ConnectionFactory");
        QueueConnectionFactory qcf = (QueueConnectionFactory)tmp;
        Queue queue = (Queue)iniCtx.lookup("queue/mytestjms");
        conn = qcf.createQueueConnection();
         session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
        conn.start();
        receiver = session.createReceiver(queue);
    }
    public void disConnect() throws JMSException
   {
       conn.stop();
       session.close();
       conn.close();
   }
   public Message receiver() throws JMSException
   {
       return receiver.receive(1000);
   }
   public JMSReceiver()throws Exception
   {
        clientconnect();
         Message msg = receiver();
         System.out.println(msg);
         if (msg instanceof TextMessage)
         {
             TextMessage tmsg = (TextMessage)msg;
             //消息主題內容:
             System.out.println(tmsg.getText());
         }
         System.out.println("success");
         disConnect();
 
   }

 

    public static void main(String[] args)throws Exception
    {
        new JMSReceiver();
    }
}

主題消息用到Topic,思路基本相同,接受必需先訂閱消息主題,當有發送者把消息發給這個主題的時候
先前訂閱的接受就會收到這個消息。
SOA中JMS也是一個熱門,客戶端通常用JMS發送消息再ESB中調用具體的服務。

posted @ 2006-04-20 11:15 jinmy liao 阅读(2071) | 评论 (0)编辑 收藏