2011-02-06 4 views
14

논리적 인 종속성이있는 작업을 관리하고 동시에 실행하기위한 프레임 워크가 Java로 존재하는지 여부는 제 질문입니다.작업 관리를위한 Java 프레임 워크

내 작업은 다음과 같습니다 : 저는 많은 독립 작업 (A, B, C, D ...라고 가정 해 봅시다)을 명령으로 구현했습니다 (명령 패턴과 유사). 나는이 모든 작업을 받아 들일 수있는 평범한 집행자를 갖고 싶다. 작업이 서로 종속 될 수 있습니다 (예를 들어, C를 실행할 수 없습니다. A를 실행하기 전에). 동기식 또는 비동기식.

예를 들어 작업 A와 B가 CPU를 많이 사용하고 C가 메모리 소비가 많으면 A와 C를 실행하는 것과 같이 스케줄러 실행에 영향을주는 사용자 지정 방법을 사용하고 싶습니다. (A java.util.concurrent + annotation 기반 제약/규칙에 대해 생각하고있다.) 누군가가 나를 가리킬 수 있다면 나는 궁금해했다. 내 필요에 맞는 프로젝트. 미리 미리 감사드립니다.

+0

포크/가입을 확인 했습니까? –

+0

작업 결과가 서로 재사용되는지 아닌지 궁금합니다. 미리 정의 된 시퀀스를 사용하는 독립적 인 작업 단위 인 경우 일정 및 사용자 지정 경험적 ​​방법은 아주 간단한 사용자 지정 스레드 풀 실행 프로그램으로 해결할 수 있습니다. –

+0

예, java.util.concurrent의 Executor Services를 사용하려고 생각하고 있습니다. 작업은 서로의 결과를 재사용한다는 측면에서 독립적 인 것처럼 보입니다. Viktor Klang이 친절하게도 제안한 것처럼 포크/조인을 살펴보아야합니다. –

답변

7

귀하의 요구 사항을 충족시킬 수있는 작업을 관리하기위한 프레임 워크가 있다고 생각하지 않습니다. Command 패턴을 사용하여 올바른 경로에 있습니다. 단순화 된 동시성 모델을 위해 Akka framework을 살펴볼 수 있습니다.

액터 모델은 다른 아주 간단한 높은 수준의 동시성 모델은 다음과 같습니다 : Akka는 액터 모델을 기반으로 배우 는 한 번에 두 개 이상의 메시지 에 응답 할 수 없습니다 (메시지 사서함으로 대기하고 있습니다) 개의 메시지 만 보내고 개의 변수는 공유하지 않습니다. 한 메시지는 ( 항상 얼랑의 사실이지만, 이 속성 보장의 수단없이 언어로 규칙이어야한다) 어떤 기타를위한 필요없이, 모든 는 스레드 안전을 불변의 데이터 구조는 그대로 기구. 이것은 과 매우 비슷합니다. 웹에서 찾을 수 있습니다. 개발 MVC 프레임 워크. http://metaphysicaldeveloper.wordpress.com/2010/12/16/high-level-concurrency-with-jruby-and-akka-actors/

Akka는 스칼라로 작성되었지만 깨끗한 Java API를 제공합니다.

2

이 목적으로 ant을 사용할 수 있는지 검토해 보시기 바랍니다. ant은 널리 사용되는 빌드 도구로 알려져 있지만 다양한 작업을 실행하는 XML 제어 엔진입니다. 나는 그 깃발 fork=true 정확하게 당신이 필요로하는 것 : 작업을 동시에 실행한다고 생각합니다. 다른 java 응용 프로그램에서 java 응용 프로그램 ant을 실행할 수 있습니다. 그저 main 메서드를 호출하십시오. 이 경우 ant API를 사용하여 작업을 래핑 할 수 있습니다. 즉, Ant 태스크로 구현할 수 있습니다.

나는이 접근 방식을 시도한 적이 없지만 제대로 작동해야한다고 생각합니다. 나는 몇 년 전에 그것을 생각하고 너의 것과 비슷한 문제에 대한 가능한 해결책으로 내 경영자에게 제안했다.

+0

네,이 옵션에 대해서도 생각해보십시오. 그것은 내 요구에 맞는 것처럼 보이지만 그 방식대로 :)이 문제를 해결하기위한 잘못된 도구처럼 보입니다. 작업은 이미 작성되었습니다 (큰 프로덕션 준비 코드의 일부). 그래서 개미를 소개하는 것은 과잉과 같은 소리가납니다. 조언을 주셔서 감사합니다! –

+0

언급하지 마십시오. 개미가 잘못된 도구라고 말할 때 부분적으로 동의합니다. 나는 여기에 개미를 사용하는 것이 학대라고 생각한다. 하지만 때로는 API 남용이 유용 할 수 있다고 생각합니다. 나는 이것에 관한 기사를 썼다 : http://java.dzone.com/articles/useful-abuse – AlexR

0

프레임 워크가 dexecutor은 (면책 조항 : 나는 주인이다)이라는 목적을 위해 특별히 있습니다

Dexecutor가 신뢰할 수있는 방법에 의존/독립 작업을 실행하기 위해 매우 경량 프레임 워크입니다,이 작업을 수행하기가를 제공합니다 최소한의 API.

  • 그래프의 노드를 추가 할 수있는 API를 위해 노드를 실행하기
  • 다른 (addDependency는 addIndependent는 addAsDependentOnAllLeafNodes는 addAsDependencyToAllInitialNodes 나중에 두 처음 두 하이브리드 버전이다). 여기

    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); 
    

    종속성 그래프 enter image description here

    작업 1,12,11 이러한 작업의 한 번, 병렬로 실행됩니다 구축 할 것입니다 방법 : 여기

가장 간단한 예입니다 종속 작업 완료, 예를 들어 작업 1 완료, 작업 2 및 3은 작업 12, 작업 13 완료 등등과 유사하게 실행됩니다.