TrưỜng đẠi học khoa học tự nhiên khoa công nghệ thông tin nguyễn mạnh luân-mai ngọc sưƠng nghiên cứu và phát triển bpel designer sử dụng công nghệ javafx khóa luận tốt nghiệp cử nhân cntt tp. Hcm, 2010



tải về 0.84 Mb.
trang2/7
Chuyển đổi dữ liệu21.12.2018
Kích0.84 Mb.
1   2   3   4   5   6   7
PartnerLinkType:

Các service trong tương tác của tiến trình nghiệp vụ được mô tả là các PartnerLinkType trong BPEL. Mỗi một PartnerLink được mô tả bằng một PartnerLinkType, được đặt tên để đại diện cho tất cả các tương tác thông qua PartnerLink đó. Nếu PartnerLinkType tương ứng chỉ có một role thì role này sẽ mặc định được gán cho thuộc tính myRole của PartnerLink, nhưng nếu có nhiều role thì phải chỉ ra để cho biết PartnerLink này hoạt động với PortType nào.Ví dụ về 1 PartnerLink Type:


xmlns="http://schemas.xmlsoap.org/ws/2003/05/partner-link/">











Bảng 2.1- ví dụ về PartnerLink Type

Trong trường hợp thông thường, portTypes của hai roles (MyRole và ParthnerRole) xác định từ các namespaces riêng biệt. Tuy nhiên trong một số trường hợp thì thì chúng được xác định chung một namespace, điều này thường xảy ra ở các dịch vụ thuộc có mối quan hệ “callback”( gọi lại chính nó).


  • PartnerLink:

Các service trong tương tác của tiến trình nghiệp vụ được mô tả là các PartnerLinkType trong BPEL. Mỗi một PartnerLink được mô tả bằng một PartnerLinkType, được đặt tên để đại diện cho tất cả các tương tác thông qua PartnerLink đó. Nếu PartnerLinkType tương ứng chỉ có một role thì role này sẽ mặc định được gán cho thuộc tính myRole của PartnerLink, nhưng nếu có nhiều role thì phải chỉ ra để cho biết PartnerLink này hoạt động với PortType nào. Ví dụ về PartnerLink:

myRole="ncname"? partnerRole="ncname"?>+






Bảng 2.2-Ví dụ về PartnerLink

 PartnerLinkType được mô tả trong tập tin WSDL như là một khái niệm mở rộng cho chuẩn WSDL . Còn các partnerLink nào được dùng trong tiến trình BPEL thì được chỉ ra trong tập tin BPEL.

Kỹ thuật dùng partnerLink chẳng những giải quyết được vấn đề trên mà còn giúp các BPEL service có thể dễ dàng tích hợp với các bộ phận khác trong kiến trúc tổng thể của SOA. Cụ thể: khi ta khi ta định nghĩa một partnerLink, chúng ta sử dụng thuộc tính myRole để chỉ vai trò của chính BPEL Web Service. Ngược lại, thuộc tính partnerRole được dùng để chỉ vai trò của một service bên ngoài.



  1. Cấu trúc của một tiến trình BPEL

Cấu trúc của một tiến trình BPEL được mô tả trong tập tin BPEL như sau:


"helllo" >

"aloArtifacts.wsdl" namespace="http://eclipse.org/bpel/sample"

importType="http://schemas.xmlsoap.org/wsdl/" />



.

.



.



………………




"main">

/bpel:sequence>







Bảng 2.3-Cấu trúc file BPEL

Một tiến trình BPEL là một mô tả dưới dạng tài liệu XML. Quy trình được mô tả trong BPEL giao tiếp với trang web và các dịch vụ trao đổi tài liệu XML(SOAP). Việc tích hợp các dịch vụ cung cấp hỗ trợ cho chuyển đổi (theo các tài liệu XML) mà đi ngoài sự hỗ trợ của Xpath[ ].

Các khái niệm chính:



Process:Mọi file BPEl đều bắt đầu với thẻ
.Các mô tả cho tiến trình cũng như các namespace liên quan được định nghĩa ở thẻ này.

Imports:Chứa thông tin các tập tin WSDL được import vào.

PartnerLinks: Chứa tập hợp các partnerLink được sử dụng trong tiến trình. Mỗi partnerLink sẽ thiết lập một quan hệ giữa bản thân BPEL service với một service bên ngoài.

Variables: Phần này định nghĩa các biến được dùng trong tiến trình. Mỗi biến đều phải được tham chiếu đến một kiểu thông điệp (messageType) được mô tả trong tập tin WSDL.

Sequence: Đây là phần chính mô tả logic của tiến trình. Trong một sequence sẽ chứa nhiều activity (được trình bày chi tiết bên dưới). Mỗi activity có một nhiệm vụ cụ thể trong tiến trình BPEL. Bản thân sequence cũng là một activity, có thể chứa các cấu trúc song song cũng như tuần tự khác.

  1. Các thành phần và ký hiệu trong BPEL

Một tiến trình BPEL được thể hiện qua các Activity, các Activity trong BPEL được thực hiện tuần tự theo cấu trúc được khai báo trong tiến trình. Trong BPEL 2.0 thì các Activity được chia làm ba nhóm cơ bản như sau:

Basic Activity:là các Activity đơn thể, nó không thể chứa được bất kỳ các Actyvity nào khác bênh trong nó nữa.

Structrer Activity:là các Activity có cấu trúc, nó có thể chứa được các Activity khác bênh trong nó.

Faul Handle Activity: các Activity này được sử dụng để thụ lý lỗi và các ngoại lệ xảy ra trong quá trình hoạt động của một tiến trình

Tùy theo nhu cầu và trong các trường hợp cụ thể mà ta có thể chọn và sử dụng các Activity khác nhau.Bảng sau mô tả chi tiết về các Activity trong BPEL 2.0:



Tên Activity

Ký hiệu

Các trường hợp sử dụng

Các Activity cơ bản

Empty

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\empty.png

Là một activity đặc biệt, không làm gì hết khi được gọi. Activity này được dùng khi

Cần có một activity nhưng không thật sự cần một hành động nào xảy ra.



Invoke

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\invoke.png

Gọi một web servirse để thực hiện một tác vụ nào đó

Receive

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\receive.png

Nhận một thông điệp từ một service partner. Thông thường đây là activity bắt đầu một tiến trình mới

Reply

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\reply.png

Gửi trả một thông điệp cho một đối tượng bênh ngoài tiến trình

Opaque Activity

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\opaqueactivity.png

Là một Activity dạng dẫn xuất

Assign

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\assign.png

Dùng để khởi tạo hoạc gán giá trị cho các biến trong tiến trình BPEL

Validate

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\validate.png

Kiểm tra tính hợp lệ của các biến và các biểu thức dựa trên định nghĩa của nó (chẳng hạn định nghĩa dựa trên XML Schema, hay WSDL…)

Các Activity điều khiển và có cấu trúc

If/Else

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\if.png

Định nghĩa cấu trúc điều kiện

Pick

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\pick.png

Đinh nghĩa cách lựa chọn phương án hành động (hành động nào sẽ được thực hiện khi sự kiện tương ứng mà nó quy định xảy ra, nếu không có sự kiện nào xảy ra trong một thời gian chỉ định trước thì hành động nào sẽ được thực hiện…)

While

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\while.png

Lặp lại một tiến trình con nào đó trong process ở dạng while

RepeatUntil

d:\study\exam\bpelproject\ver6.0\bpel\src\bpel\images\icons20\repeatuntil.png

Lặp lại một tiến trình con nào đó trong process ở dạng do..while

Foreach

d:\study\exam\bpelproject\ver6.0\bpel\src\bpelproject\icons\foreach.png

Định nghĩa vòng lặp để duyệt qua một tập hợp

Wait

d:\study\exam\bpelproject\ver6.0\bpel\src\bpelproject\icons\wait.png

Dừng tiến trình trong một khoản thời gian được thiết lập trước

Sequence

d:\study\exam\bpelproject\ver6.0\bpel\src\bpelproject\icons\sequence.png

Dùng để thiết lập tuần tự hoạt động của các Activity

Scope

d:\study\exam\bpelproject\ver6.0\bpel\src\bpelproject\icons\scope.png

Dùng để chia nhỏ tiến trình thành các activity có các nhiệm vụ liên quan với nhau (khi tiến trình trở nên phức tạp).

Các Activity dùng để quản lý lỗi và ngoại lệ

Exit

d:\study\exam\bpelproject\ver6.0\bpel\src\bpelproject\icons\exit.png

Dừng tiến trình hiện tại

Throw

d:\study\exam\bpelproject\ver6.0\bpel\src\bpelproject\icons\throw.png

Ném ra một ngoại lệ

Rethrow

c:\users\blind kight\desktop\images\rethrow.bmp

Ném ra thông báo lỗi sau khi lỗi này đã được thụ lý trước đó

Compensate Scope

d:\study\exam\bpelproject\ver6.0\bpel\src\bpelproject\icons\compensatescope.png

Là activity dùng để thụ lý lỗi. Khi có lỗi xảy ra thì activity này sẽ được dùng để xử lý lỗi trên phạm vi được chỉ ra

Compensate

d:\study\exam\bpelproject\ver6.0\bpel\src\bpelproject\icons\compensatescope.png

Có chức năng cũng giống như activity Compensate Scope nhưng được dùng để thụ lý lỗi trên phạm vi tất cả các phạm vi liên quan

Bảng 2.4-Các Activity trong BPEL 2.0

Sau đây là mô tả chi tiết và các trường hợp sử dụng của từng Activity:



  • Receive

Khi một tiến trình BPEL cần nhận một thông điệp thì activity receive sẽ được sử.Activity receive sẽ xác định được dịch vụ đối tác mà nó được nhận thông điệp và các Operation từ dịch vụ đối mà nó cần phải gọi thông qua Parthner Link và Operation.Để thực thi được thì receive activity phải xác định được một biến đầu vào(input) hoặc phần dữ liệu mà nó được nhận.Cấu trúc XML của activity receive được thể hiện như sau:


operation=”NCName”

variable=”BPELVariableName”? createInstance=”yes|no”?

messageExchange=”NCName”?

standard-attributes>

standard-elements



?

+



?

+







Bảng 2.5-cấu trúc XML của receive



  • Invoke

Để gọi hoặc thực hiện một dịch vụ web nào đó thì ta sử dụng invoke activity.Invoke activity mô tả một dịch vụ web thực hiện ở dạng “một chiều” hoặc “yêu cầu- đáp ứng”. Các dịch vụ web đối tác được xác định thông qua Parthner Link và Operation. Để thực thi một invoke activity thì cần xác định ít nhất một biến đầu vào và có hoặc không có biến đầu ra tùy thuộc vào từng dạng dịch vụ web mà nó gọi thực hiện (dạng “một chiều” hoặc “ yêu cầu-hồi đáp”). Hình 2.2 mô tả một trường hợp sử dụng cụ thể của invoke activity,ở đây thì dịch vụ tìm kiếm tên khách hang được gọi thực hiện:

d:\study\document\bpel_baocao\tailieuthamkhao\invoke_example.jpg

Hình 2.2-Ví dụ về trường hợp sử dụng invoke

Cấu trúc XML của invoke được mô tả như sau:


operation=”NCName”

inputVariable=”NCName”? outputVariable=”NCName”?

standard-attributes>

standard-elements

?

pattern=”request|response|request-response”/>+





faultMessageType=”QName”? faultElement=”QName”?>*

activity



?

activity




?

activity




?

+



?

+







Bảng 2.6-Cấu trúc Xml của invoke



  • Reply

Một reply activity đóng vai trò như một giá trị trả về trong một tiến trình BPEL. Nội dung thông điệp được gưởi đi sẽ được dịch vụ web đối tác tiếp nhận thông qua Receive Activity ở dạng onMessage(thông điệp) hoặc onEvent( sự kiện). Một Reply Activity thì sẽ có cùng một partner link và operation với Receive Activity tương ứng của dịch vụ web đối tác. Để thực thi được thì Rely Activity yêu cầu phải được đặc tả cho thông điệp mà nó sẽ gửi đi. Khi tiến trình xuất hiện lỗi thì Reply Activity sẽ trả về một ngoại lệ. Chúng ta có thể kiểm soát các lỗi này bằng cách thêm một Throw ativity để trả về một ngoại lệ nếu xử lý trong tiến trình bị lỗi như hình 2.2:

d:\study\document\bpel_baocao\tailieuthamkhao\replywithfaultexample2.jpg

Hình 2.2-Trường hợp sử dụng của Reply

Cấu trúc Xml của Reply như sau:


operation=”NCName”

variable=”BPELVariableName”? faultName=”QName”?

messageExchange=”NCName”?

standard-attributes>

standard-elements



?

+



?

+







Bảng 2.7-Cấu trúc Xml của Reply



  • Validate

Một validate activity có nhiệm vụ kiểm tra tính hợp lệ của các biến dựa trên định nghĩa của nó có liên quan đến tài liệu XML và WSDL. Bạn có thể kiểm tra một danh sách các biến với activity này. Trong suốt quá trình hoạt động nếu có một biến nào đó được tìm thấy có chứa một giá trị không hợp lệ thì tiến trình ngay lập tức kết thúc với một ngoại lệ “invalidVariables” được ném ra. Lưu ý rằng bạn cũng có thể kiểm tra tính hợp lệ của các biến được sử dụng trong Assign Activity.Hình 2.3 mô tả một trường hợp sử dụng của Validate:

d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\validateactivity.jpg

Hình 2.3-Trường hợp sử dụng của Validate

Cấu trúc Xml của validate được mô tả như sau:


standard-attributes>

standard-elements





Bảng 2.8-Cấu trúc Xml của Validate



  • Assign

Assign Activity được dùng để cập nhật giá trị cho các biến chứa bênh trong nó. Assign cập nhật các biến bằng một trong những cách sau:

  • Copy dữ liệu từ một biến khác

  • Khởi tạo thông qua các phương thức của XPath

  • Khởi tạo thông qua các phương thức của WS-BPEL và một số phương thức mở rộng khác.

Cấu trúc Xml của Assign được thể hiện như sau:


standard-elements

(

ignoreMissingFromData=”yes|no”?>

from-spec (see below)

to-spec (see below)



|

...assign-element-of-other-namespace...



) +





Bảng 2.9-Cấu trúc Xml của Assign



  • Throw

Throw Activity được sử dụng để trả ra các lỗi trong quá trình thực thi của một tiến trình BPEL. Bạn có thể thiết lập các các link để dẫn đến Throw Activity từ các Activity khác trong trường hợp xảy ra lỗi như hình 2.4:

d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\throwexample.jpg

Hình 2.4-Trường hợp sử dụng của Throw

Cấu trúc Xml của Throw Activity được thể hiện như sau:


standard-elements







Bảng 2.10-Cấu trúc Xml của Throw



  • ReThrow

Rethrow Activity được sử dụng trong trường hợp bạn không muốn ném ra ngoại lệ và dừng tiến trình tại chính điểm gây ra lỗi mà muốn ném nó lên một cấp xử lý cao hơn. Rethrow được dùng để bắt tất cả các lỗi được ném ra từ tiến trình con bênh dưới bởi Throw Activity.Ví dụ trong hình 2.5:

d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\rethowexample.jpg

Hình 2.5-Trường hợp sử dụng của ReThrow

Cấu trúc Xml của ReThrow Activity được thể hiện như sau:


standard-elements







Bảng 2.11-Cấu trúc Xml của ReThrow



  • Exit

Exit activity được dùng để chấp dứt ngay lập tức một tiến trình đang thực thi bất chấp mọi đều kiện đặt ra.Ví dụ một trường hợp sử dụng của Exit activity như hình 2.6

d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\exitexample.jpg

Hình 2.6-Trường hợp sử dụng của Exit

Cấu trúc Xml của Exit Activity:


standard-elements







Bảng 2.12-Cấu trúc Xml của Exit



  • Wait

Wait activity cho phép dừng tiến trình trong khoản thời gian bao lâu(duration) hay là cho đến một mốc thời gian nào đó (date).Ví dụ:

Dừng trong khoản thời gian 1 giây:

Dừng cho tới mốc thời gian 0 giời ngày 12-12-2010: .

Trường hợp sử dụng của wait được thể hiện trong hình 2.7:



d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\waitexample.jpg

Hình 2.7-Trường hợp sử dụng của Wait

Cấu trúc xml của wait như sau:


standard-elements







Bảng 2.13-Cấu trúc Xml của wait



  • Empty

Khi một tiến trình gặp xửa lý này thì sẽ “không làm gì cả”.Ví dụ như khi có một lỗi cần được bắt và ta không muốn xử lý, lúc này Empty activity sẽ được sử dụng như hình 2.8:

d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\emptyexample.jpg

Hình 2.8-Trường hợp sử dụng của Empty

Cấu trúc xml của Empty như sau:


standard-elements







Bảng 2.14-Cấu trúc Xml của Empty



Là activity dùng để thụ lý lỗi. Khi có lỗi xảy ra thì activity này sẽ được dùng để xử lý lỗi trên phạm vi được chỉ ra. Nó là một trong hai loại activity thụ lý lỗi của BPEL. Ví dụ về trường hợp sử dụng của compensate Scope như hình 2.9. Compen Scope được chỉnh định thụ lý lỗi trong phạm vi A.

d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\compensatescopeexample.jpg

Hình 2.9-Trường hợp sử dụng của Compensate Scope

Cấu trúc xml của Compensate Scope:


standard-elements







Bảng 2.14-Cấu trúc Xml của Compensate Scope



  • Compensate

Có chức năng thụ lý lỗi trên tất cả các phạm vi có liên quan. Ví dụ sau là trường hợp sử dụng của Compensate:

d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\compensation_activity.jpg

Hình 2.10-Trường hợp sử dụng của Compensate

Cấu trúc xml:


standard-elements







Bảng 2.15-Cấu trúc Xml của Compensate



  • Flow

Activity Flow hổ trợ thực hiện song song và đồng bộ các xử lý trong tiến trình. Ngoài hổ trợ xử lý song song thì flow còn cho phép đồng bộ hóa các xử lý thông qua các liên kết đồng bộ . Một được xác định được xác định bởi tên(name) và thể hiện sự ràng buộc giữa hai xử lý. Ví dụ một trường hợp sử dụng của Flow:

d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\flowexample.jpg

Hình 2.11-Trường hợp sử dụng của Flow

Cấu trúc xml:


standard-elements



?

+

activity+







Bảng 2.16-Cấu trúc Xml của Flow



Một Repeat Until Activity được sử dụng để lặp lại một xử lý nào đó cho đến khi nó sai với điều kiện đặt ra. Repeat Until có mối liên hệ với while activity. Repeat Until thực hiện xửa lý trước khi kiểm tra điều kiện còn while thì ngược lại

Cấu trúc xml của repeat Until như sau:




standard-elements

activity

bool-expr









Bảng 2.17-Cấu trúc Xml của Repeat Until



  • Pick

Xử lý pick được dùng để bắt các sự kiện xảy ra trong tiến trình và thực hiện xử lý gắn liền với sự kiện đó. Nếu có nhiều sự kiện xảy ra thì xử lý sẽ ưu tiên sư kiện nào xảy ra trước.

Cấu trúc pick bao gồm một tập các nhánh có dạng event/activity, và chỉ có một nhánh được gọi khi có sự kiện nào đó xảy ra gắn liền với nhánh đó các sự kiện khác thì xử lý pick sẽ không quan tâm nữa, ví dụ một trường hợp sử dụng của Pick Activity:



d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\pickactivity.jpg

Hình 2.12-Trường hợp sử dụng của Pick

Cấu trúc xml của Pick:

standard-elements



portType=”QName”? operation=”NCName”

variable=BPELVariableName”?>+

messageExchange=”NCName”?>+



?

+



?

+

activity




*

(

duration-expr

|

deadline-expr>

)

activity








Bảng 2.18-Cấu trúc Xml của Pick



  • If

If là một activity dùng để điều khiển xử lý của tiến trình. Các xử lý được điều khiển bởi một hoặc nhiều điều kiện được thiết lập và có thêm một tùy chọn với thẻ Elsif. Các điều kiện được xử lý If xem xét theo thứ tự được thiết lập trong cấu trúc của nó.

Cấu trúc xml của if như sau:




standard-elements



bool-expr



activity


*

bool-expr



activity




?

activity








Bảng 2.19-Cấu trúc Xml của Pick



  • Foreach

Foreach activity chứa một scope activity bênh trong và thực hiện một vòng lặp các xử lý chứa bênh trong theo dạng đếm. Việc lặp lại các xử lý bênh trong foreach có thể được thực hiện song song hoặc tuần tự. Số lần lặp lại của foreach được thiết lập bởi biểu thức khởi tạo cho giá trị bắt đầu và giá trị kết thúc. Một thẻ được dùng để thiết lập giá trị khởi đầu vòng lặp và để thiết lập cho giá trị kết thúc. Nếu finalcounter value lớn hơn start counter value thì vòng lặp sẽ không được thực hiện. Ngoài ra trong xử lý foreach còn có thêm một tùy chọn complention condition. Điều kiện complention được sử dụng trong trường hợp xử lý foreach khi ta chỉ muốn xử lý N của M nhánh trong xử lý foreach(N
d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\foreachserial.jpg

Hình 2.13-Trường hợp sử dụng của Foreach

Cấu trúc xml của Foreach được thể hiện như sau:


standard-attributes>

standard-elements









extension-element



countSuccessfulBranchesOnly="yes|no"?>

an-integer-expression



activity






Bảng 2.20-Cấu trúc Xml của Foreach



  • While

While activity được sử dụng để lặp đi lặp lại việc thực thi tuần tự một xử lý chứa bênh trong nó. Quá trình lặp này sẽ dùng lại cho tới khi điều kiện lặp không còn thỏa. Cấu trúc xml của while được thể hiện như sau:




bool-expr



standard-elements

activity





Bảng 2.21-Cấu trúc Xml của While



  • Scope

Ngữ cảnh xử lý (behavior context) của mỗi xử lý được cung cấp bởi một scope activity. Một scope có thể cung cấp fault handle,event handle,compensate handle,data variable,partner link và correlation set. Hình 2.14 là một thể hiện của scope:

d:\study\document\bpel_baocao\tailieuthamkhao\chuogn 2\scopedrawingexample.jpg

Hình 2.14-Trường hợp sử dụng của Scope

Cấu trúc xml của scope như sau:




bool-expr



standard-elements

activity





Bảng 2.22-Cấu trúc Xml của Scope



  1. Các bước xây dựng một tiến trình nghiệp vụ

Trong phần này, chúng ta tạo ra một quy trình BPEL đơn giãn, quy trình này chỉ thực hiện thao tác chuỗi đơn giản. Hãy nhớ rằng nó chỉ là một ví dụ đơn giản và bạn có thể tạo quy trình phức tạp hơn bằng cách sử dụng đặc tả WS-BPEL V2.0.

Quy trình này gồm các bước sau:



  • Bước 1:Nhận một message từ client

  • Bước 2 :Gắn thêm tên người dùng với chuỗi « hello »

  • Bước 3 :Trả về chuỗi được xử lý

Mô hì nh của tiến trình :

example.bmp



Поделитесь с Вашими друзьями:
1   2   3   4   5   6   7


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©tieuluan.info 2019
được sử dụng cho việc quản lý

    Quê hương