2011-02-06 35 views
14

câu hỏi của tôi là, liệu có tồn tại một khung công tác trong Java để quản lý và đồng thời chạy các Tác vụ có phụ thuộc hợp lý hay không.Java Framework để quản lý các nhiệm vụ

Nhiệm vụ của tôi như sau: Tôi có rất nhiều tác vụ độc lập (Giả sử A, B, C, D ...), Chúng được triển khai dưới dạng Lệnh (như trong mẫu Lệnh). Tôi muốn có một loại người thực thi sẽ chấp nhận tất cả các nhiệm vụ này và thực thi chúng theo cách song song. Các tác vụ có thể phụ thuộc vào nhau (Ví dụ, tôi không thể chạy C, Trước khi tôi chạy A), đồng bộ hoặc không đồng bộ.

Tôi cũng muốn kết hợp các chẩn đoán tùy chỉnh để ảnh hưởng đến việc thực thi lịch biểu, ví dụ: nếu các tác vụ A và B là CPU chuyên sâu và C, nói, có mức tiêu thụ bộ nhớ cao, Có ý nghĩa khi chạy A và C trong song song, thay vì chạy A và B.

Trước khi tự mình xây dựng công cụ này (tôi đang nghĩ về các ràng buộc/quy tắc dựa trên java.util.concurrent + chú thích), tôi đã tự hỏi, nếu ai đó có thể chỉ cho tôi một số dự án có thể phù hợp với nhu cầu của tôi. Cảm ơn rất nhiều trước

+0

Bạn đã xem Ngã ba/Tham gia chưa? –

+0

Tôi tự hỏi liệu các tác vụ có sử dụng lại các kết quả khác hay không. Nếu họ là những đơn vị khá độc lập của công việc với trình tự được xác định trước thì lập kế hoạch và tùy chỉnh heuristic có thể được giải quyết bằng cách thực hiện khá đơn giản chủ đề hồ bơi thread. –

+0

Vâng, tôi cũng đang nghĩ đến việc sử dụng Dịch vụ Executor từ java.util.concurrent, các tác vụ dường như độc lập về việc sử dụng lại các kết quả của nhau. Tôi nên nhìn vào ngã ba/tham gia như Viktor Klang vui lòng đề xuất là tốt. –

Trả lời

7

Tôi không nghĩ rằng có một khuôn khổ để quản lý các tác vụ có thể đáp ứng yêu cầu của bạn. Bạn đang đi đúng hướng bằng cách sử dụng mẫu Lệnh. Bạn có thể xem Akka framework cho một mô hình đồng thời đơn giản hóa. Akka được dựa trên mô hình Diễn viên:

Mô hình diễn viên là một mô hình đồng thời cao mức rất đơn giản: các diễn viên không thể đáp ứng với nhiều hơn một thông điệp tại một thời điểm (thông điệp được xếp hàng đợi vào hộp thư) và chỉ có thể giao tiếp bằng cách gửi tin nhắn, không chia sẻ biến. Miễn là các tin nhắn là cấu trúc dữ liệu bất biến (là luôn đúng trong Erlang, nhưng phải là quy ước bằng ngôn ngữ không có nghĩa là đảm bảo tài sản này), mọi thứ an toàn chủ đề mà không cần bất kỳ cơ chế. Điều này rất giống với để yêu cầu tìm thấy chu trình trong web các khung MVC phát triển. http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/

Akka được viết bằng Scala nhưng nó cho thấy Java API sạch.

2

Tôi khuyên bạn nên kiểm tra khả năng sử dụng ant cho mục đích này. Mặc dù ant được biết đến như một công cụ xây dựng phổ biến nhưng nó thực sự là công cụ kiểm soát XML chạy các tác vụ khác nhau. Tôi nghĩ rằng cờ của nó fork=true thực hiện chính xác những gì bạn cần: chạy nhiệm vụ đồng thời. Như bất kỳ ứng dụng java ant có thể được thực hiện từ ứng dụng java khác: chỉ cần gọi phương thức main của nó. Trong trường hợp này, bạn có thể bọc các tác vụ của mình bằng cách sử dụng ant API, tức là thực hiện chúng dưới dạng nhiệm vụ Ant.

Tôi chưa bao giờ thử phương pháp này nhưng tôi tin rằng nó sẽ hoạt động. Tôi đã nghĩ về nó vài năm trước và đề nghị nó để quản lý của tôi như là một giải pháp có thể cho vấn đề tương tự như của bạn.

+0

Có, cũng nghĩ về tùy chọn này. Có vẻ như nó phù hợp với nhu cầu của tôi, nhưng theo cách riêng của nó :) Trông giống như một công cụ sai để giải quyết vấn đề này. Các nhiệm vụ đã được viết (một phần của một mã sẵn sàng sản xuất lớn). Vì vậy, giới thiệu kiến ​​chỉ để giải quyết âm thanh này như một overkill. Cảm ơn lời khuyên mặc dù! –

+0

Không đề cập đến. Tôi đồng ý một phần với bạn khi bạn nói rằng kiến ​​là một công cụ sai. Tôi nghĩ rằng việc sử dụng kiến ​​ở đây là sự lạm dụng của nó. Nhưng tôi tin rằng đôi khi việc lạm dụng API có thể hữu ích. Tôi thậm chí đã viết bài về điều này: http://java.dzone.com/articles/useful-abuse – AlexR

0

Có một khung đặc biệt cho mục đích này gọi là dexecutor (Disclaimer: Tôi là chủ sở hữu)

dexecutor là một khung trọng lượng rất nhẹ để thực hiện phụ thuộc/nhiệm vụ độc lập trong một cách đáng tin cậy, để làm điều này nó cung cấp API tối thiểu.

  • Một API để thêm các nút trong đồ thị dưới (addDependency, addIndependent, addAsDependentOnAllLeafNodes, addAsDependencyToAllInitialNodes Sau hai là phiên bản hybrid đầu tiên hai)
  • và khác để thực hiện các nút theo thứ tự.

Dưới đây là ví dụ đơn giản nhất:

DefaultDependentTasksExecutor<Integer, Integer> executor = newTaskExecutor(); 

    executor.addDependency(1, 2); 
    executor.addDependency(1, 2); 
    executor.addDependency(1, 3); 
    executor.addDependency(3, 4); 
    executor.addDependency(3, 5); 
    executor.addDependency(3, 6); 
    //executor.addDependency(10, 2); // cycle 
    executor.addDependency(2, 7); 
    executor.addDependency(2, 9); 
    executor.addDependency(2, 8); 
    executor.addDependency(9, 10); 
    executor.addDependency(12, 13); 
    executor.addDependency(13, 4); 
    executor.addDependency(13, 14); 
    executor.addIndependent(11); 


    executor.execute(ExecutionBehavior.RETRY_ONCE_TERMINATING); 

Dưới đây là làm thế nào đồ thị phụ thuộc sẽ được xây dựng enter image description here

Nhiệm vụ 1,12,11 sẽ chạy song song, một lần vào các nhiệm vụ hoàn thành nhiệm vụ phụ thuộc sẽ chạy, ví dụ, cho phép nói nhiệm vụ 1 kết thúc, nhiệm vụ 2 và 3 sẽ chạy tương tự một lần nhiệm vụ 12, kết thúc nhiệm vụ 13 sẽ chạy và như vậy.