??xml version="1.0" encoding="utf-8" standalone="yes"?> • BPEL(Business Process Execution Language)又叫BPEL4WS(Business Process Execution Language For Web Service)Q面?/span>Web服務的業務流E執行語a。是一E?/span>Web服務定義和執行業務流E的語言?/span>BPEL提供了一E相簡單易懂的Ҏ(gu)Q可多?/span>WEB服務i合C個新的復合服?/span>(E׃業務程)中?/span> • BPEL本n是一?/span>Web服務Q可以作為服務的提供者?/span> • BPEL是基?/span>Web服務的,沒有Web服務沒?/span>BPEL?br />
• 一個以bpel為後E的文g(例如MyFlow.bpel) • 一?/span>WSDL文g • 一個部|?/span>XML文gQ樣子Ş?/span>bpel.xml • 需要熟(zhn)單個的Web Service的用方?/span> • 需要了解具體的業務程 • 需要一個運?/span>BPEL的處理器 • 需要一個流E設a器 • 當然需要對BPEL語法標簽的掌握等 BPEL的一般結?/span> • <process> • <partnerLinks> • <partnerLink> • </partnerLink> • </partnerLinks> • <variables> • <variable/> • </variables> • <faultHandlers> • </faultHandlers> • <sequence> • Activities • </sequence> • </process> <process>的屬?/span> <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> <!– 注意:臛_要指定一個角?/span>. --> <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> 基本zd一 • <invoke> – 調用某?/span> Web 服務上的操作 • <receive> – {待一條消息來回應由某人從外部進行調用的服務介面的操作 • <reply> – 生成輸入Q出操作的回應 • <wait> – {待一D|?/span> 基本zd?/span> • <assign> – 把資料從一個地方複製到另一個地?/span> • <throw> – 指明某個地方出錯了 • <terminate> – i止整個服務實?/span> • <empty> – 什麽也不做 i構化活?/span> • <sequence> – 定義一i步驟的有序序列 • <switch> – 使用珑֜常見?/span>“case-statement”辦法來産生分?/span> • <while> – 定義一個迴?/span> • <pick> – 埯q條可選路徑中的一?/span> • <flow> – 以及(qing)指明一i步驟應該並行地埯 一個完整的單CZ <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("Hello", 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>
BPEL的運作方?/span>
BPEL的一般構?/span>
BPEL的實N?/span>
8.6 BPEL的結?/span>
E序名稱
|
JBoss ESB |
|
數據庫\徑和名稱
|
222.118.20.108\jbossesb |
|
E序的文件構成說?/span>
|
||
1)
Jboss
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
配置步驟如下
:
|
||
運行條g和配|說?/span>
|
||
|
Windows
Linux |
|
|
1)數據源配|在JBossESB-ds.xml文g配置Q詳C息如?/span>: <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文g: 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 |
|
|
必需?/span>
JBoss .
運行
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); |
|
?/span>
?/span>
|
||
此文檔是配置安裝JBOSS ESB的步驟說明書. |
||
jinmy
|
||
?JBI(Java Business Integration)
JBI是SOA的解決和集成的基C?br />JBI提供了組件之間交互的消息基礎Q?br /> 1)NormalizedMessage(NM) 所有基于消息的數據片段——SOAP片段、MOM消息、HTTP數據或其它信息——被聚合、集中?br /> 應用到業務邏輯、傳輸,如果有必要則轉換成其他格式隨後被分派到最i目的地
2)JBI machine (SE)
ig提供或者消L務是基於本地?br /> 3)JBI binding (BC)
ig 提供或者消L務是通過一些通信協議或者是其他遠程技?br /> ig之間的交互通過消息交換Q消息是服務提供者發佈的WSDL
服務元g(Service Unit)
一個服務元件看作是一個黑盒子,它提供了一個靜態的服務Q?br /> 服務元g中包含有Q提供的服務和服務消費者。它們都從屬服務元gQ一個服務元件可以有0個或者多個服?/p>
服務集合(service Assembly)
i合服務元g是大的應用程序或者新的服務Ş式出?A Service Assembly:一iJBI 服務元g連同描述它們的關係和目標組?br />^結:
JBI是SOAi構的基C,它把原來的業務函敔R成為一個服務,使服務提供者和服務消費者之間的交互是松耦合的,通過service assembly(服務集合Q?br />可以i合不同的程序,架構?
servicemix
消息i構的介?br />用過web services(SOAP)應該知道消息包括信封、消息頭、主體、附?同樣JMS消息i構也是差不多包括消息頭、消息屬性、消息體.
以JMS、SOAP為基C可以實N向消息模?MOM Message Oriented Model)?br />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單R程實現點對點的消息 服務器用jboss-4.0.3SP1
1)首先在JBOSS中部屬一個點點的消息隊?br />配置文g攑֜JBOSS_Home\server\default\deploy\jms
配置文g的內容為:
<?xml version="1.0" encoding="UTF-8"?>
<server>
<!--是一個點點的用org.jboss.mq.server.jmx.Queue(Topic),desination的名Eqmytestjms
更多的配|說明可以看原來jboss自帶的Jms配置文gQ文件名要用*-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)實現消息發送?br />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
{
env.put(Context.PROVIDER_URL,"localhost");
Context iniCtx = new InitialContext(env) ;
創徏JMS連接的工廠類
Object tmp = iniCtx.lookup("ConnectionFactory");
QueueConnectionFactory qcf = (QueueConnectionFactory)tmp;
//?/a>建JMS會話
session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
clientconnect();
TextMessage textmsg = this.session.createTextMessage();
textmsg.setText("sender message from liao test");
}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)實現消息接受?br />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;
disConnect();
}
public static void main(String[] args)throws Exception
{
new JMSReceiver();
}
}
主題消息用到Topic,思\基本相同Q接受必需先訂閱消息主,當有發送者把消息發這個主的時?br />先前a閱的接受就會收到這個消息?br />SOA中JMS也是一個熱門Q客戶端通常用JMS發送消息再ESB中調用具體的服務?/p>
1) 提供客戶端調用的接口(web services)
2) R寫處理處理消息的類Q消息現在包?/span> , 登陸消息、登出消息、消息發?消息狀態的修改
登陸消息包括
:
客戶端的用戶名?/span>
ip
、端?/span>
;
d消息包括
:
客戶端的用戶名,服務器將注銷客戶端登陸時發過來的消息
發送的消息包括
:
發送hQ接受hQ發送事Ӟ發送的內容
.
修改狀?包括消息的關鍵字ID
3)
在客戶端登陸的時候監測是否是否有新消息,有則發送客戶?br />
4)發送的消息如果接受用戶不在R,則保存該消息Q等接受者登陸的時候再發送接受者?br />
消息有一個狀態N表示新的消息QO表示已經的消?
消息傳用戶Q用戶確認在回寫消息狀?br />客戶端調用的接口可以是JMS,Http由於珑֜只有delphi客戶端,珑֜提供web servicesa問
程?