2016-03-26 56 views
1

@Scheduled yöntemini kullanmaya çalıştığımda neden güncellemelerin yapılmadığını anlamak için strugelling yapıyorum.Spring @Transactional yalnızca arayanlar da çalışıyorsa [Transactional]

@Component 
class InternalService { 

    @Autowired 
    private UserService userService; 

    @Autowired 
    private UserRepository userRepository; 

    @Scheduled(fixedRate=1000) 
    public void updateUser(){ 
     User user = userRepository.findOne(1L); 
     userService.updateUser(user); 
    } 
} 

Benim sorun: Bir @Scheduled yöntemi kullanmak

@RestController 
@RequestMapping(value = "/users") 
public class UserController { 

    @Autowired 
    private UserService userService; 
    @Autowired 
    private UserRepository userRepository; 

    @ResponseStatus(HttpStatus.OK) 
    @RequestMapping(value = "/{id}", method = RequestMethod.PUT) 
    public void getAvailableIssuers(@PathVariable("id") String id){ 
     User user = userRepository.findOne(id); 
     userService.updateUser(user); 
    } 
} 

ve bir hizmet: Bu hizmet iki konumdan denir

@Service 
public class UserService { 

    @Transactional 
    public void updateUser(User user){ 
     user.setName("Doe"); 
    } 
} 

:
Bu benim senaryo basitleştirilmesi olduğunu Kullanıcıyı InternalService aracılığıyla güncellemeyi denediğimde, kullanıcı asla güncellenmez; RestController üzerinden iyice ince. Zamanlanan yönteme ilişkin @Transactional ek açıklamasını eklediğimde (readOnly = true ile bile) çalışır.

İlkbaharda yapılan işlemlerle ilgili belgeleri okudum ama hala neden çalışmıyor olduğunu anlamıyorum. Hata ayıklayıcısını kontrol ettim ve userService bir Spring Proxy biçimindedir.

Birisi bana bunun için bir açıklamada yardımcı olabilir mi?

cevap

0

Sorun, işleminizin bu hizmet yöntemiyle kısıtlı olmamasıdır: Her iki durumda da, nesneyi arama yöntemindeki depodan alıyorsunuzdur. İşleminiz tüm veritabanı işlemlerini kapsamalıdır. Denetleyiciniz aslında çalışma neden gelince

, sadece bu bilgilerle kesin diyemem, ama OpenEntityManagerInView kullanarak ve ücretsiz olarak bir işlem sınırı elde ettiğinizi tahmin ediyorum.

+0

Tamam. Mantıklı. İlkbahar önyükleme, varsayılan olarak 'OpenEntityManagerInView' (spring.jpa.open-in-view özelliği) kullanır ve fark oradan gelir. – mvlupan

+0

"Transactional" ile planlanan yöntemin açıklamalı olması mantıklı mıdır yoksa refactor için daha iyi bir fikir olur mu? – mvlupan

+0

@mvlupan Ya geçerli bir yaklaşım olabilir. Kullanım durumunuzun özelliklerine bağlı olacaktır. "Güncelleştirme" gerçekten bu kadar basitse, işlem ilk etapta bu katmanla alakalı görünmüyor, bu yüzden sınırı yukarı taşıyacağım. – chrylis