2011-12-02 5 views
1

모든 파트를 Taskexecutor에 연결하는 방법을 이해하는 데 어려움이 있습니다. 내가 만든 작업은 BidProposalTask입니다. (Runnable를 구현하는 클래스) 작업 constructor에는 하나 개의 인수를 가지고 있으며, DB 접근에 대한 Autowiring은 필요 등Spring의 Taskexecutor에서 runnable 클래스에 인수 전달

나는 실행 프로그램 클래스에 대한이 코드를 함께했다

:

public class ExecuteBidProposalTask { 

    private TaskExecutor taskExecutor; 
    private BidProposalTask bidProposalTask; 

    public ExecuteBidProposalTask(TaskExecutor taskExecutor, 
     BidProposalTask bidProposalTask) { 
    super(); 
    this.taskExecutor = taskExecutor; 
    this.bidProposalTask = bidProposalTask; 
    } 

    public void start() { 
    taskExecutor.execute(bidProposalTask); 
    } 

} 

다음과 같은 XML 컨텍스트 구성 : 나는 봄의 설명서에서 본대로

<bean id="taskExecutor" 
    class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="10" /> 
    <property name="queueCapacity" value="25" /> 
</bean> 

, 나는이 된 TaskExecutor 빈을 생성하지만, 문제는 BidProposalTask도 주입 할 필요가 있다는 것입니다. 그것은 싱글 톤이 아니며, 나는 생성자에 대해 다른 인수를 가진 프로젝트에서 반복해서 그것을 생성해야합니다.

기본적으로 질문은 non-singleton bean을 autowire하는 방법입니다. autowire도 작동합니다. 당신은 (기본적으로 콩에 애플리케이션 컨텍스트를 주입) 당신의 ExecuteBidProposalTask 클래스 ApplicationContextAware를 만들 수

답변

4

이 설명하는 것은 매우 복잡하다, 그래서 당신이 내 질문을 이해 바랍니다 .... 그런 다음 컨텍스트 파일에 BidProposalTask ​​Bean을 선언하고 scope="prototype"을 만들 수 있습니다. 그런 다음 ExecuteBidProposalTask에있는 start 메소드에서 다음을 수행 할 수 있습니다. context.getBean("bidProposalTask"); 그리고이를 실행 프로그램에 전달하십시오. 범위를 프로토 타입으로 선언 했으므로 콩 (bean)을 요청할 때 새 인스턴스 (싱글 톤이 아닌)가 생성되고 반환됩니다.

+0

그게 재미있을 것 같은데, 혹시 그런 주사에 대한 링크 또는 예가 있습니까? – stdcall

+0

꽤 쉽습니다. ExecuteBidProposalTask를 ApplicationContextAware (http://blog.imaginea.com/making-a-spring-bean-applicationcontext-aware/ 참조)로 구현하면 문자 그대로 appContext.getBean ("bidProposalTask"); bean이'과 같이 정의된다면 항상 새로운 인스턴스를 얻을 수 있습니다. – Chris

+0

예,하지만 bidProposalTask의 각 인스턴스에 가변 인수를 제공하려면 어떻게해야합니까? – stdcall