我已经安排了一个带有注释@Scheduled
的作业,它应该处理数据并使用 spring data jpa 将其保存到数据库。 save
方法被调用,没有任何异常,但没有插入数据库。在同一个带注释的方法中,我调用了 findAll
方法,该方法运行良好并获取了数据。可能是什么原因?
@Repository
public interface PossibleOfferLinkRepository extends PagingAndSortingRepository<PossibleOfferLink, Long> {
}
@Configuration
@ComponentScan
@EnableAutoConfiguration
@Import({Scheduler.class})
@EntityScan(basePackages="model_package")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@EnableScheduling
@ConditionalOnProperty(value= "property_name")
public class Scheduler {
...
@Scheduled(fixedRate=100000)
public void scheduleCrawlerJob() throws MalformedURLException {
Iterable<PossibleOfferLink> links = repo.findAll();
PossibleOfferLink link = repo.save(new PossibleOfferLink(new URL("...")));
}
}
专家
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.182</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>org.easytesting</groupId>
<artifactId>fest-assert</artifactId>
<version>${easytesting.version}</version>
</dependency>
</dependencies>
最佳答案
最后我用这种方式解决了这个问题:
在 Application 类中添加了
@EnableTransactionManagement
并且还添加了PlatformTransactionManager
Bean。检查下面的代码:@Autowired private EntityManagerFactory entityManagerFactory; @Bean public PlatformTransactionManager transactionManager() { return new JpaTransactionManager(entityManagerFactory); }
这是导入:
导入org.springframework.orm.jpa.JpaTransactionManager; 导入 org.springframework.scheduling.annotation.EnableScheduling; 导入 org.springframework.transaction.PlatformTransactionManager; 导入 org.springframework.transaction.annotation.EnableTransactionManagement;
在我的调度程序代码中添加了以下代码:
@Scheduled(fixedRate = 60 *10*1000) @Transactional(propagation=Propagation.REQUIRES_NEW) public void reportCurrentTime() { doDatabaseTransaction(); }
这是导入:
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
希望这能解决您的问题:)
关于java - @Scheduled 中运行的作业不会调用 spring 数据 jpa 保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26625793/