@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?
Tamam. Mantıklı. İlkbahar önyükleme, varsayılan olarak 'OpenEntityManagerInView' (spring.jpa.open-in-view özelliği) kullanır ve fark oradan gelir. – mvlupan
"Transactional" ile planlanan yöntemin açıklamalı olması mantıklı mıdır yoksa refactor için daha iyi bir fikir olur mu? – mvlupan
@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