2010-01-14 27 views
8

Làm thế nào để giải quyết vấn đề này (trong WF4):tải vẫn kiên trì công việc sau workflowdefinition đã thay đổi trong WF4

tôi tạo ra một quy trình làm việc trong XAML và bắt đầu một số trường hợp của nó, tôi có một persistancestore và tất cả các quy trình công việc tồn tại trên một bookmark một nửa công việc của họ.

Bây giờ tôi dừng ứng dụng

Nếu tôi khởi động lại ứng dụng, mọi thứ sẽ được tiếp tục, hãy hoàn thành tốt.

Nhưng điều gì xảy ra nếu tôi muốn thay đổi định nghĩa quy trình làm việc sau khi các cá thể đang chạy vẫn tồn tại? cách duy nhất để tải các quy trình công việc chạy (mà tôi đã có thể tìm thấy) là theo cách sau:

 WorkflowApplication wfapp = new WorkflowApplication(new WorkflowDefinition()); 
     wfapp.InstanceStore = new SqlWorkflowInstanceStore(connStr); 

     wfapp.Load(wfGuid); 

Vì vậy, bạn cần định nghĩa công việc, nếu nó đã thay đổi trong thời gian kiên trì, mọi thứ đi sai lầm khủng khiếp.

Cách tốt nhất để giải quyết vấn đề này là gì?

+1

BTW, kịch bản này là chủ đề của một số tương lai WF4. Xem bản trình bày này từ MIX 10: http://channel9.msdn.com/Events/PDC/PDC10/FT08 – Will

Trả lời

3

Kịch bản này hơi khó khăn. Không có cách nào để di chuyển định nghĩa luồng công việc cũ sang định dạng mới. Tôi đã thực hiện một số thử nghiệm giới hạn và một số tình huống có thêm/xóa các hoạt động mà ở đó chưa thực hiện tốt công việc. Nhưng sau đó tôi cũng có kịch bản đi sai, bao gồm cả việc thực hiện lại một hoạt động đã hoàn thành. Theo tôi biết, không có cách nào tốt để giải quyết vấn đề khác ngoài việc theo dõi phiên bản XAML/assembly được sử dụng để tạo luồng công việc và kiểm tra khi bạn muốn khởi động lại luồng công việc để xác định phiên bản luồng công việc sử dụng.

1

Nó không phải là quá nhiều vấn đề với Windows Workflow vì nó là dịch vụ SQL persistence. Bạn có thể tạo dịch vụ persistence của riêng mình có thể xử lý tình trạng này, bằng cách hỗ trợ chuyển đổi luồng công việc cũ thành luồng công việc mới hoặc một thứ trừu tượng hơn, giống như dịch vụ kiên trì tuần tự hóa dưới dạng XML/JSON, một thứ có thể dễ dàng hỗ trợ deserialization của một là phiên bản khác.

2

Nhiều phiên bản của quy trình làm việc cùng phải cùng tồn tại. Tôi có nghĩa là, các trường hợp cũ phải hoàn thành với phiên bản dòng công việc cũ, và những người mới phải bắt đầu với phiên bản quy trình làm việc mới. Trong trường hợp của tôi, chúng tôi có các dịch vụ quy trình làm việc. Đó là trên cấu hình nơi một bộ định tuyến mô tả thứ tự trong đó các trường hợp cố gắng được thực hiện. Nếu một cá thể không thể bắt đầu làm việc với một phiên bản, thì phiên bản tiếp theo sẽ được thử, v.v.

Ngoài ra, nếu thay đổi của bạn không liên quan đến các thay đổi trong biến luồng công việc, hợp đồng đã tiếp xúc, vv ... phiên bản thể hiện dòng công việc cũ và mới có thể chạy trên cùng một phiên bản quy trình làm việc. Bạn sẽ biết rằng, thử nghiệm nó.

1

Có thể tải trường hợp wf được lưu lại sau khi thay đổi định nghĩa trong WF4 - bạn phải phân tích cú pháp và thay đổi các tệp xml mà công cụ wf lưu trữ. Bạn nên tạo hai quy trình công việc tương đương: với phiên bản cũ và phiên bản mới và so sánh chúng để loại bỏ sự khác biệt. Điều này phải được thực hiện cho định nghĩa xml và xml dữ liệu phức tạp được sử dụng để lưu trữ trạng thái luồng công việc. Phân tích nó với LinqToXML sẽ giúp bạn tiết kiệm rất nhiều thời gian và bạn phải chắc chắn rằng bạn đã kiểm tra tất cả các khác biệt - nếu có một sự khác biệt còn lại, wf sẽ không thể tải. Có một phần tử "ResumeData", mà bạn có thể tìm thấy trong trạng thái wml xml, quá nặng để phân tích cú pháp, nhưng tin tốt là bạn chỉ cần xóa nó đi.

Các vấn đề liên quan