第一篇:調用外部方法及工作流
調用外部方法及工作流
公開一個對象,來從執行的工作流中傳給宿主應用程序,或者從宿主應用程序傳給工作流不就行了嗎?其實,使用現有的串行化技術,如.NET Remoting或者XML Web服務,就可完成這些事。串行化,也叫序列化,它可把數據從原有的形式轉換成合適的形式,以在不同進程甚至不同計算機之間進行傳輸。
學習完本章,你將掌握:
1.創建并調用你的工作流外部的本地數據服務
2.理解怎樣使用接口來為宿主進程和你的工作流之間進行通信。
3.使用設計的外部方法在你的工作流和宿主應用程序之間傳輸數據。
4.在一個正執行的工作流中調用其它工作流
在寫前面的章節時,我自己不斷地思考,“我不能再等了,我要弄清楚在哪里可把(工作流中的)真實數據返回到宿主應用程序中!”為什么?做了這么多的活動和工作流的演示,但都沒有實際返回某些感興趣的東西給宿主應用程序。我不知寫過多少我們感興趣的工作流的實例和演示,但至多只是僅僅處理過數據的初始化(就像第一章-WF簡介中你看過的郵政編碼的例子)。但事情變得更加有趣,坦率地說,當我們啟動工作流,然后從外部源中尋找并處理數據、返回處理后的數據給我們的主應用程序要更加接近現實。
為什么不這樣呢?公開一個對象,來從執行的工作流中傳給宿主應用程序,或者從宿主應用程序傳給工作流不就行了嗎?其實,使用現有的串行化技術,如.NET Remoting或者XML Web服務,就可完成這些事。串行化,也叫序列化,它可把數據從原有的形式轉換成合適的形式,以在不同進程甚至不同計算機之間進行傳輸。
為什么談到序列化呢?因為你的工作流是在你的宿主進程中的不同線程上執行,不同線程之間傳送數據,如不進行適當的序列化,將會引發災難,具體原因超出了本書的討論范圍。其實,你的工作流能在一個持久化的狀態下發送它的數據。這并沒有在不同線程上,甚至它不在執行中。
但我們想在我們的工作流和正控制該工作流的宿主進程間傳送數據時,使用.NET Remoting或者XML Web服務這樣的技術為什么并沒有認為是多余的呢?其實這絕對有必要!我們將創建local通信,本章將以此出發。我們將搭建必須的體系來滿足線程數據序列化,以進行計算機之間或進程之間的數據傳輸。
創建ExternalDataService服務
當工作流和它的宿主進行通信時,在它發送和接收數據的時候,工作流要使用隊列和消息。WF為我們做的越多,我們就可把重點更多的放到應用中特定任務的解決上。
工作流內部進程通信
對于簡單的通信任務,WF使用“abstraction layer”來在工作流和宿主之間進行緩沖。抽象層像一個黑盒,你為它提供輸入,它會執行一些神奇的任務,然后信息流出到另一邊。但我們不用知道它是如何工作的。
在這種情形下,該黑盒就是一個知名的“local communication”服務。和WF術語中的任何一種服務一樣,它也是另一種可插拔服務。區別是它不像WF中的那些已預先創建好的服務,你需要寫出這個服務的一部分。為什么呢?因為你在宿主應用程序和你的工作流之間傳遞的數據有一定的特殊性。更進一步說,你可創建各種各樣的數據傳輸方法,你可使用你設計的各種方法從宿主應用程序發送數據,然后在工作流中接收數據。
備注:這里有些事情你需要進行關注,那就是對象或集合的共享問題。因為宿主應用程序和工作流運行時在同一個應用程序域執行,因此引用類型的對象和集合就是通過引用而不是值進行傳遞。這意味著宿主應用程序和工作流實例在同一時間會訪問和使用同一個對象,多線程環境下這會產生bug,出現數據并發訪問錯誤。因此,對于可能要進行并發訪問的對象或集合,你可考慮傳遞一個對象或集合的副本,或許這可通過實現ICloneable接口,或者考慮親自序列化該對象或集合并傳遞序列化后的版本。
你可寫這種local service,把它插進工作流,然后打開連接,發送數據。這些數據可以是字符串,DataSet對象,甚至可以是你設計的任何可被序列化的自定義對象。通信可以是雙向的,盡管在本章我沒有演示它。(這里,我僅僅是把數據從工作流中傳回給宿主應用程序。)從工作流的角度來說,我們使用工具生成活動的目的是發送和接收數據。從宿主應用程序的角度來說,接收數據等同于一個事件,而發送數據就是在一個服務對象上的方法的簡單調用。
備注:我們在后面幾章看到更多的活動后還會重溫該雙向數據傳輸的概念。工作流活動從宿主應用程序中接收數據基于一個HandleExternalEvent活動,我們將在第10章“Event活動”中看到。我們也需要更深入地了解這些概念間的相互關系,這在第17章“宿主通信”中將進行介紹。對于當前,我們只是在工作流實例完成它的任務后,簡單地返回復合數據給宿主。
我們需要做的還不僅僅是這一點,我們最終需要添加ExternalDataService服務到我們的工作流運行時中。ExternalDataService是一個可插拔的服務,它方便了工作流實例和宿主應用程序之間進行序列化數據的傳輸。在緊接下來的一節我們將寫出的該服務的代碼將做很多事(包括序列化數據的傳輸)。讓我們來看看大體的開發過程。
第二篇:工作流配置方法
自定義工作流的方法
1、在WSS3.0中只有文檔庫,表單庫和列表庫可以使用工作流。
2、以請假管理為例
在請假管理界面中“設置”按鈕,選擇“列表設置”。
在列表設置界面中選擇“版本控制設置”
在“版本控制設置”里把審批功能選中
返回設置界面,然后點擊菜單上的OFFICE按鈕,選擇“sharepoint designer 編輯”
在“新建”中選擇“工作流”
在此界面中輸入工作流的名稱,選擇工作流的模板,以及啟動工作流的方式。
在上圖中也可以知道可以使用工作流的列表。因為我的是sharepoint2007所以可以應用的列表比較多。Wss3.0可能沒有這么多。
由于請假的時間不同申批的領導也不同,所以需要輸入請假天數。這樣在啟動用設置請假天數,以此來啟動不同的工作流。點擊“啟動”按鈕
添加
下一步
完成,確定
然后在“工作流設置器”界面點擊下一步
在接下來的界面中輸入工作流執行的條件
首先當審批狀態是待定的時候我們才執行工作流。所以要先設這個條件
點擊“域”,選擇審批狀態
然后再點擊值,選擇“待定”
接下來,要看請假的天數是幾天,1天以內的部門經理批,超過一天的要總經理批。選擇“比較任意數據源”
點擊“值”
點擊“Fx”函數按鈕,在彈出窗口選擇“工作流數據”
確定
點擊“等于”改為“小于等于”
點擊“值”,輸入1
點擊“操作”
點擊“待辦事項”
下一步
在彈出的窗口中輸入待辦事項的名字和說明,完成
點擊“這些用戶”(假使ALAN為IT部門經理)。
確定
到此請假一天的工作流,我們已經做完了,接下來再做請假超過一天的。超過一天按常理,部門經理也需要批準,然后再給總經理。操作如下: 點擊“添加IF條件”
同理也是要在審批狀態是待定的時侯
然后再添加條件
點擊“值”
然后,點擊“操作”,分配待辦事項
點擊“待辦事項”
點擊“這些用戶”
然后再點擊“操作”,分配待辦事項
點擊“完成”
回到SHAREPOINT DESIGNER界面會看到多出一個工作流
回到sharepoint網站
輸入請假的天數,然后啟動
這時我換成ALAN的帳號 查看一下工作流
審批
然后點擊“進行中”
“新請假任務1”選擇“編輯”
點擊完成任務
1天以上的請假
切換到alan用戶
在任務界面中會列出需要我審批的任務
回到請假管理
注意在此步驟中此圖應為沒有BEN的內容,當編輯->完成任務后,才會出現BEN這一項
切換用戶到BEN
切換回請假申請者chris
流程設計完畢。
第三篇:指標導入方法和調用
首先,指標是導入的。不是打開用的1.先打開通達信行情軟件
1.找到功能--專家系統--公示管理器--導入公式
2.導入完成之后具體使用方法:
功能——選股器——條件選股——揚帆漲停選股——加入條件——選股入板塊
調用指標的方法和路徑:CRTL+F,其他類型,然后看好你想用的指標的名字,再把公式管理器關掉,打出你想要用的指標的名字的拼音的第一個字母,比如:導彈出擊:DDCJ
第四篇:java 調用webservice的各種方法總結
一、利用jdk web服務api實現,這里使用基于 SOAP message 的 Web 服務
1.首先建立一個Web services EndPoint:
Java代碼
package Hello;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.xml.ws.Endpoint;
@WebService
public class Hello {
@WebMethod
public String hello(String name){
return “Hello, ” + name + “n”;}
public static void main(String[] args){
// create and publish an endpoint
Hello hello = new Hello();
Endpoint endpoint Endpoint.publish(“http://localhost:8080/hello”, hello);
} }
=
2.使用 apt 編譯 Hello.java(例:apt-d [存放編譯后的文件目錄] Hello.java),會生成 jaws目錄
3.使用java Hello.Hello運行,然后將瀏覽器指向http://localhost:8080/hello?wsdl就會出現下列顯示
4.使用wsimport 生成客戶端
使用如下:wsimport-p.-keep http://localhost:8080/hello?wsdl
5.客戶端程序:
Java代碼
1.class HelloClient{ 2.3.public static void main(String args[]){ 4.5.HelloService service = new HelloService();6.7.Hello helloProxy = service.getHelloPort();8.9.String hello = helloProxy.hello(“你好”);10.11.System.out.println(hello);12.13.} 14.15.} 16.二、使用xfire,我這里使用的是myeclipse集成的xfire進行測試的
利用xfire開發WebService,可以有三種方法:
1一種是從javabean 中生成;
一種是從wsdl文件中生成;
還有一種是自己建立webservice
步驟如下:
用myeclipse建立webservice工程,目錄結構如下:
首先建立webservice接口,代碼如下:
Java代碼
1.package com.myeclipse.wsExample;2.3.//Generated by MyEclipse 4.5.6.7.public interface IHelloWorldService { 8.9.10.11.public String example(String message);12.13.14.15.} 16.Java代碼
1.package com.myeclipse.wsExample;2.3.//Generated by MyEclipse 4.5.6.7.public class HelloWorldServiceImpl implements IHelloWorldService { 8.9.10.11.public String example(String message){ 12.13.return message;14.15.} 16.17.18.19.} 20.修改service.xml 文件,加入以下代碼:
Xml代碼
1.2.3.
客戶端實現如下:
Java代碼
1.package com.myeclipse.wsExample.client;2.3.import java.net.MalformedURLException;4.5.import java.net.URL;6.7.8.9.import org.codehaus.xfire.XFireFactory;10.11.import org.codehaus.xfire.client.Client;12.13.import org.codehaus.xfire.client.XFireProxyFactory;14.15.import org.codehaus.xfire.service.Service;16.17.import org.codehaus.xfire.service.binding.ObjectServiceFactory;18.19.20.21.import com.myeclipse.wsExample.IHelloWorldService;22.23.24.25.public class HelloWorldClient { 26.27.public static void main(String[] args)throws MalformedURLException, Exception { 28.29.// TODO Auto-generated method stub 30.31.Service s=new ObjectServiceFactory().create(IHelloWorldService.class);32.33.XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());34.35.String url=“http://localhost:8989/HelloWorld/services/HelloWorldService”;36.37.38.39.try 40.41.{ 42.43.44.45.IHelloWorldService hs=(IHelloWorldService)xf.create(s,url);46.47.String st=hs.example(“zhangjin”);48.49.System.out.print(st);50.51.} 52.53.catch(Exception e)54.55.{ 56.57.e.printStackTrace();58.59.} 60.61.} 62.63.64.65.} 66.這里再說點題外話,有時候我們知道一個wsdl地址,比如想用java客戶端引用.net 做得webservice,使用myeclipse引用,但是卻出現無法通過驗證的錯誤,這時我們可以直接在類中引用,步驟如下:
Java代碼
1.public static void main(String[] args)throws MalformedURLException, Exception { 2.3.// TODO Auto-generated method stub 4.5.Service s=new ObjectServiceFactory().create(IHelloWorldService.class);6.7.XFireProxyFactory xf=new XFireProxyFactory(XFireFactory.newInstance().getXFire());8.9.10.11.//遠程調用.net開發的webservice 12.13.Client c=new Client(new URL(“http://www.tmdps.cn/axis2/
同理,也需要將axis2復制到webapp目錄中
在axis2中部署webservice有兩種方法,第一種是pojo方式,這種方式比較簡單,但是有一些限制,例如部署的類不能加上包名
第二種方式是利用xml發布webservice,這種方法比較靈活,不需要限制類的聲明
下面分別說明使用方法:
1.pojo方式:在Axis2中不需要進行任何的配置,就可以直接將一個簡單的POJO發布成WebService。其中POJO中所有的public方法將被發布成WebService方法。先實現一個pojo類:
Java代碼
1.public class HelloWorld{ 2.3.public String getName(String name)4.5.{ 6.7.return ”你好 “ + name;8.9.} 10.11.public int add(int a,int b)12.13.{ 14.15.return a+b;16.17.} 18.19.} 20.由于這兩個方法都是public類型,所以都會發布成webservice。編譯HelloWorld類后,將HelloWorld.class文件放到%tomcat%webappsaxis2WEB-INFpojo目錄中(如果沒有pojo目錄,則建立該目錄),然后打開瀏覽器進行測試:
輸入一下url:
http://localhost:8080/axis2/services/listServices
會列出所有webservice
這是其中的兩個webservice列表,接著,在客戶端進行測試:
首先可以寫一個封裝類,減少編碼,代碼如下:
Java代碼
1.package MZ.GetWebService;2.3.import javax.xml.namespace.QName;4.5.6.7.import org.apache.axis2.AxisFault;8.9.import org.apache.axis2.addressing.EndpointReference;10.11.import org.apache.axis2.client.Options;12.13.import org.apache.axis2.rpc.client.RPCServiceClient;14.15.16.17.18.19.public class GetWSByAxis2 { 20.21.private static String EndPointUrl;22.23.private static String QUrl=”http://ws.apache.org/axis2“;
24.25.private QName opAddEntry;26.27.public String WSUrl;28.29.public RPCServiceClient setOption()throws AxisFault 30.31.{ 32.33.RPCServiceClient serviceClient = new RPCServiceClient();34.35.Options options = serviceClient.getOptions();36.37.EndpointReference targetEPR = new EndpointReference(WSUrl);38.39.options.setTo(targetEPR);40.41.return serviceClient;42.43.} 44.45.46.47.public QName getQname(String Option){ 48.49.50.51.return new QName(QUrl,Option);52.53.} 54.55.//返回String 56.57.public String getStr(String Option)throws AxisFault 58.59.{ 60.61.RPCServiceClient serviceClient =this.setOption();62.63.64.65.opAddEntry =this.getQname(Option);66.67.68.69.String str =(String)serviceClient.invokeBlocking(opAddEntry, 70.71.new Object[]{}, new Class[]{String.class })[0];72.73.return str;74.75.} 76.77.// 返回一維String數組 78.79.public String[] getArray(String Option)throws AxisFault
80.81.{ 82.83.RPCServiceClient serviceClient =this.setOption();84.85.86.87.opAddEntry =this.getQname(Option);88.89.90.91.String[] strArray =(String[])serviceClient.invokeBlocking(opAddEntry, 92.93.new Object[]{}, new Class[]{String[].class })[0];94.95.return strArray;96.97.} 98.99.//從WebService中返回一個對象的實例
100.101.public Object getObject(String Option,Object o)throws AxisFault 102.103.{ 104.105.RPCServiceClient serviceClient =this.setOption();106.107.QName qname=this.getQname(Option);108.109.Object object = serviceClient.invokeBlocking(qname, new Object[]{},new Class[]{o.getClass()})[0];110.111.return object;112.113.} 114.115.116.117.///////////////////////////////////////// 讀者可以自己封裝數據類型,如int,byte,float等數據類型
118.119.} 120.客戶端調用方法:
Java代碼
1.MZ.GetWebService.GetWSByAxis2 ws=new MZ.GetWebService.GetWSByAxis2();2.3.ws.WSUrl=”http://localhost:8989/axis2/services/HelloWorld“;4.5.HelloWorld hello=(HelloWorld)ws.getObject(”getName“, HelloWorld.class);6.7.8.9.10.11.System.out.println(hello.getName(”zhangjin“));12.2.使用service.xml發布webservice,這種方式和直接放在pojo目錄中的POJO類不同。要想將MyService類發布成Web Service,需要一個services.xml文件,這個文件需要放在META-INF目錄中,該文件的內容如下:
Xml代碼
1.
http://localhost:8080/axis2/services/myService?wsdl
除此之外,還有直接可以在其中制定webservice操作方法:可以這樣些service.xml文件
Java代碼
1. 10.11.service.HelloWorld 12.13. 14.15.
第五篇:ORACLE9i動態SQL調用方法心得
ORACLE9i動態SQL調用方法心得
一、執行動態函數--返回值
OUT_CS:=0;--參數
IN_CS1:=100;
IN_CS2:=150;--自定義函數名稱FUN_01();
NAME:='01'
V_SQL := 'BEGIN :1:=FUN_'||NAME||'(:2);END;';
BEGIN
EXECUTE IMMEDIATE V_SQL
USING OUT OUT_CS, IN IN_CS;
EXCEPTION
WHEN OTHERS THEN
OUT_JG := '執行異常!';
END;
FUNCTION GET_DMGZ(IN_CS IN NUMBER)RETURN NUMBER AS AS BEGIN
RETURN IN_CS+1;END;
二、執行動態過程--輸出參數
OUT_CS:=0;--輸入參數
IN_CS:=100;--自定義函數名稱PRO_01();
NAME:='01'
V_SQL := 'BEGIN PRO_' || NAME|| '(:1,:2);END;';
BEGIN
EXECUTE IMMEDIATE V_SQL
USING IN IN_CS, OUT RVAR;
EXCEPTION
WHEN OTHERS THEN
OUT_JG := 0;
END;
PROCEDURE PRO_01(IN_CS
IN NUMBER, OUT_CS OUT NUMBER)AS BEGIN
OUT_CS:=IN_CS+1;END;
三、返回游標參數
1、在包里新建一類型 TYPE MY_CUR IS REF CURSOR;
2、在參數定義時使用自定義類型
OUT_CS OUT MY_CUR;--存儲過程
RETURN MY_CUR;
--自定義函數
3、存儲過程
PROCEDURE PRO_01(IN_CS
IN NUMBER, OUT_CS OUT MY_CUR)AS BEGIN
OPEN OUT_CS FOR SELECT IN_CS+1 FROM DUAL;END;
4、自定義函數
FUNCTION GET_DMGZ(IN_CS IN NUMBER)RETURN MY_CUR AS RC MY_CUR;AS BEGIN
OPEN RC FOR SELECT IN_CS+1 FROM DUAL;
RETURN RC;END;
3、如何使用返回游標參數
FETCH MY_CUR INTO OUT_CS;
四、注意事項
動態調用存儲過程,返回游標類型時系統會出現錯誤,系統執行完函數或存儲過程時會停止,不返回上級程序。