2015-05-07 31 views
8

çağrılırken hemen geri dönmez Denetleyicileri (@EnableWebMvc), services (@service ve @ComponentScan) yapılandırmak için yaylı ek açıklamalar kullanıyorum. Hizmetlerimden birinde @Async ile açıklamalı bir yöntem var ve ayrıca benim config sınıfımda @EnableAsync ekledim. MVC denetleyicisinden biri @Async ile açıklamalı servis yöntemini çağırdığında, denetleyicinin, hizmet yönteminin tamamlanmasını beklemeden hemen dönmesini beklerim. Bununla değil. Hizmet yönteminde kesme noktasını ayarladığımda, aslında ayrı bir iş parçacığı içinde çalışmakta olduğunu görüyorum; yani, stacktrace aşağıda yapılandırdığım gibi SimpleAsyncTaskExecutor'ı kullandığını gösteriyor. İşte Spring MVC denetleyicisi, @Async yöntemi

benim yapılandırma sınıfında açıklama

@Configuration 
@EnableWebMvc 
@EnableScheduling 
@ComponentScan(basePackages = "com.mypackage") 
@EnableAsync 
public class WebApplicationConfig extends WebMvcConfigurerAdapter implements AsyncConfigurer { 
... 
... 
@Override 
    public Executor getAsyncExecutor() { 
     SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("SimpleExecutor-"); 
     executor.setConcurrencyLimit(props.getIntegerProperty(SysProps.EMAIL_SENDER_CONCURRENT_THREAD_LIMIT)); 
     return executor; 
    } 

benziyor Ve işte benim MVC denetleyicisi yöntemi

@Autowired 
    private EmailService emailService; 
    @ResponseStatus(value = HttpStatus.CREATED) 
    @RequestMapping(value = "/asset/{assetId}/slideshare/email", method = RequestMethod.POST, produces = JSON_UTF8) 
    @ResponseBody 
    @ApiResponseObject 
    public Link createAndEmailSlideShareLink(@PathVariable final String assetId, 
              @RequestParam(value = "email") final String email, 
              @RequestParam(value = "message", required = false) final String message, 
              final HttpServletRequest request) { 
    Link link = linkService.createLink() 
    emailService.sendSlideShareAssetEmail(user,link... 
    return link; 
} 

benziyor Ve servis yöntem bu

@Async 
public void sendSlideShareAssetEmail(User user, String email, String msg, String link, Asset asset) { 
benziyor olmasıdır

MVC denetleyicisi neden hemen geri dönmüyor?

+0

Denetleyici sınıfını gönderin. Dönüş değeri nedir? – chrylis

+0

@chrylis Yayını denetleyici sınıfındaki kodla güncelledim. Lütfen kontrol ediniz –

+0

Denetleyici yönteminin içeriğini aslında göndermediniz. – chrylis

cevap

0

Tahminim, EmailService Bean ürününüzün iki farklı bağlamda yer almasıdır.

Bu answer from Ryan Stewart bu sorunu/çözümü daha ayrıntılı olarak açıklar.

Kullanılmakta olan başka yapılandırmalarınız var mı? Web.xml'inizde tanımlanmış bir * -servlet.xml veya başka bir sunucu var mı? Bu, EmailService'inizi root içeriğine getirebilir mi?

ContextLoaderListener veya ServletContextListener tanımlı var mı? Belki de bileşenler taramasına ek olarak EmailService'i de alıyorlar.

Tüm kaynak ağacınızı bileşen tarama yolu olarak eklemek şüpheli görünüyor. E-posta Hizmetinizi dışarıda bırakmak ve hala bir SimpleAsyncTaskExecutor içinde çalışıp çalışmadığını görmek için bileşen taramanızda kullandığınız yolları kısıtlamayı deneyin. Eğer sizden daha farklı bir bağlamdan getirildiğini biliyorsunuz. Diğer bağlamı bulduktan sonra, onu dışarıda tutabilecek ve bileşen-taramaya veya EnableAsync'e diğer bağlamda ekleyebilmelisiniz.

+0

Çözümün kısa bir açıklamasını sağlayabilir misiniz? Aksi halde bu sadece bir yorum ve bir cevap değil. –