2013-07-22 44 views
4

這裏是我的電子郵件服務如何在春季實現異步電子郵件服務

@Service("mailService") 
public class EmailService 
{ 

@Autowired 
private MailSender mailSender; 

@Async 
public void sendMail(String to, String subject, String body) { 
    SimpleMailMessage message = new SimpleMailMessage(); 
    message.setTo(to); 
    message.setSubject(subject); 
    message.setText(body); 
    mailSender.send(message); 

} 

@Async 
public void sendPreConfiguredMail(String to,SimpleMailMessage configuredMessage) { 
    SimpleMailMessage mailMessage = new SimpleMailMessage(configuredMessage); 
    mailMessage.setTo(to); 
    mailSender.send(mailMessage); 
} 

}

而且我用JavaMailSenderImpl實現MailSender

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
    <property name="host" value="smtp.gmail.com"/> 
    <property name="port" value="25"/> 
    <property name="username" value="xxx"/> 
    <property name="password" value="xxx"/> 
    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.transport.protocol">smtp</prop> 
      <prop key="mail.smtp.auth">true</prop> 
      <prop key="mail.smtp.starttls.enable">true</prop> 
      <prop key="mail.debug">true</prop> 
     </props> 
    </property> 
</bean> 

讓春天認識@Async

<mvc:annotation-driven /> 

<bean id="executorService" class="java.util.concurrent.Executors" 
    factory-method="newFixedThreadPool"> 
    <constructor-arg value="10" /> 
</bean> 

<task:executor id="threadPoolTaskExecutor" pool-size="10" /> 

<task:annotation-driven executor="executorService" /> 

<context:component-scan base-package="com.bistyle.lifelog" /> 

但據說,@Async不能在服務方法中工作,對不對?

我該怎麼做才能實現它?

+2

是什麼讓你的事情「但據說,@ @ Async'不能在服務方法中工作,對不對? - 它應該工作。 (如果你不使用真正的AspectJ,那麼你需要從其他bean調用'@ Async'annotated方法,但這是一個不同的主題) – Ralph

+1

我的配置中是否有任何問題?在我的測試中,瀏覽器會一直等到電子郵件發出。另外有人告訴我,這是因爲@Async在服務方法中不起作用。你怎麼看? –

+0

我在Service方法中使用了@ @ Asyn,並且它可以工作。 - 「我的配置有問題嗎?」也許:你有第二個彈簧配置文件嗎? – Ralph

回答

0

嘗試更換:

<bean id="executorService" class="java.util.concurrent.Executors" 
factory-method="newFixedThreadPool"> 
<constructor-arg value="10" /> 
</bean> 

<task:executor id="threadPoolTaskExecutor" pool-size="10" /> 

<task:annotation-driven executor="executorService" /> 

<task:executor id="executorService" pool-size="10" /> 

<task:annotation-driven executor="executorService" /> 

它的工作對我來說相當不錯

0

@Async適用於所有@Component小號。我也遇到了像你一樣的問題。客戶端仍在等待直到電子郵件發送過程結束(不是以異步方式運行)。由於this後,

... 我從同一類內調用的方法。我相信這與Spring的代理機制有關。

現在我分開同@Service@Async方法。這符合我的問題。