2012-08-02 22 views
5

इस प्रकार Spring's documentation के लिए रास्ता TaskExecutor का उपयोग करने के अनुसार किया जाता है के रूप में:मैं एक स्प्रिंग टास्क एक्स्सेक्टर निर्मित थ्रेड कैसे स्वत: कर सकता हूं?

import org.springframework.core.task.TaskExecutor; 

public class TaskExecutorExample { 

    private class MessagePrinterTask implements Runnable { 

    private String message; 

    public MessagePrinterTask(String message) { 
     this.message = message; 
    } 

    public void run() { 
     System.out.println(message); 
    } 

    } 

    private TaskExecutor taskExecutor; 

    public TaskExecutorExample(TaskExecutor taskExecutor) { 
    this.taskExecutor = taskExecutor; 
    } 

    public void printMessages() { 
    for(int i = 0; i < 25; i++) { 
     taskExecutor.execute(new MessagePrinterTask("Message" + i)); 
    } 
    } 
} 

हालांकि, अगर MessagePrinterTask निर्भरता वे वसंत द्वारा विन्यस्त किया जा नहीं करेंगे क्योंकि हम वसंत के संदर्भ के बाहर हमारे सेम instantiating कर रहे हैं (कम से कम है कि autowired है मैं इसे कैसे समझता हूं) भले ही वसंत वास्तविक धागा निर्माण प्रदान करे। अगर संदेश प्रिंटरटास्क को स्वायत्त निर्भरताएं थीं तो हम उन्हें वसंत कैसे प्राप्त कर सकते हैं? मैं कोई लाभ नहीं हुआ निम्नलिखित संशोधित उदाहरण की कोशिश की (और हाँ, autowiring ठीक से सक्षम है):

एक:

import org.springframework.core.task.TaskExecutor; 

public class TaskExecutorExample { 

    @Component 
    private class MessagePrinterTask implements Runnable { 

    @Autowired 
    private autoWiredDependency; 

    public void run() { 
     autoWiredDependency.doNotThrowNullPointerExceptionPlease(); 
    } 

    } 

    private TaskExecutor taskExecutor; 

    public TaskExecutorExample(TaskExecutor taskExecutor) { 
    this.taskExecutor = taskExecutor; 
    } 

    public void printMessages() { 
    for(int i = 0; i < 25; i++) { 
     taskExecutor.execute(new MessagePrinterTask()); 
    } 
    } 
} 

उत्तर

11

दो तरीके मुझे लगता है कि आप इस के बारे में जा सकते हैं कि कर रहे हैं।

class MessagePrinterTask implements Runnable { 
    public MessagePrinterTask(ADependency aDependency){ 
     this.aDependency = aDependency; 
    } 


    private ADependency aDependency; 

    public void run() { 
     aDependency.doNotThrowNullPointerExceptionPlease(); 
    } 
} 

और अपने TaskExectorExample में जो सिंगलटन हो सकता है:

import org.springframework.core.task.TaskExecutor; 

public class TaskExecutorExample { 

    @Autowired private ADependency aDependency; 

    @Autowired 
    public TaskExecutorExample(TaskExecutor taskExecutor) { 
    this.taskExecutor = taskExecutor; 
    } 

    public void printMessages() { 
    for(int i = 0; i < 25; i++) { 
     taskExecutor.execute(new MessagePrinterTask(this.aDependency)); 
    } 
    } 
} 

ख इस तरह से - कार्य के लिए उनकी निर्भरता प्रदान करें। अपने MesasgePrinterTask पर @Configurable एनोटेशन का उपयोग करना, इस MessagePrinterTask में निर्भरता में इंजेक्षन जाएगा, भले ही यह एक स्प्रिंग कंटेनर के बाहर instantiated है - हालांकि @Configurable का उपयोग करने में कुछ कैच देखते हैं (AspectJ की आवश्यकता है):

@Configurable 
class MessagePrinterTask implements Runnable { 
+0

त्वरित उत्तर बिजू के लिए धन्यवाद। सुझाव ए। मैं वर्तमान में कर रहा हूं लेकिन यह थोड़ा परेशान है क्योंकि मुझे एक वर्ग में एक कन्स्ट्रक्टर प्लस ऑटोवायर निर्भरता बनाए रखना है जो उनका उपयोग नहीं कर सकता है। मैंने सुझाव बी देखा है। लेकिन मुझे यकीन नहीं है कि यह कार्य पूरा करने के लिए सबसे अधिक वसंत-तरीका है या नहीं। हालांकि धन्यवाद! – Jorge

+0

अब मैं @ कॉन्फिगर करने योग्य का उपयोग कर रहा हूं क्योंकि यह विकल्प ए को धड़कता है। मेरा आवेदन बहुत सारे थ्रेड को तुरंत चालू नहीं करता है, इसलिए यह पर्याप्त है। – Jorge

1

आप भी कर सकते हैं @Async एनोटेशन का उपयोग करें।

public class TaskExecutorExample { 

    @Autowired 
    private MessagePrinterTask task; 

    public void printMessages() { 
     for(int i = 0; i < 25; i++) { 
      task.printMessage(); 
     } 
    } 
} 

@Component 
public class MessagePrinterTask implements Runnable { 

    @Autowired 
    private String message; 

    @Async 
    public void printMessage() { 
     System.out.println(message); 
    } 

} 

printMessage के लिए कोई भी कॉल() में अतुल्यकालिक एक डिफ़ॉल्ट निष्पादक का उपयोग कर, जो आप अपने स्प्रिंग एक्सएमएल config में निम्नलिखित का उपयोग कर कॉन्फ़िगर कर सकते हैं निष्पादित किया जाएगा।

<task:annotation-driven executor="myExecutor"/> 
<task:executor id="myExecutor" pool-size="5" /> 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^