java - @Scheduled 中运行的作业不会调用 spring 数据 jpa 保存

标签 java spring hibernate jpa spring-data-jpa

我已经安排了一个带有注释@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>

最佳答案

最后我用这种方式解决了这个问题:

  1. 在 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;

  2. 在我的调度程序代码中添加了以下代码:

    @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/

相关文章:

类似于Android Bundle类的java类

在 azure 管道上运行时 Spring @Value FileNotFound

java - 向 CustomUsersCredentials 添加新密码,是好主意还是坏主意?

java - 使用struts在java中配置网站电子邮件

java - 如何在 hibernate 映射文件中为特定数据库指定 SQL 列类型

java - 如何使用 JMX API 获取 tomcat 7 的内存使用情况?

java - Android 联系人使用 ContactsSource 来实现较低的 api 级别,并使用 ContactsAccountType 作为 contacts.xml 中的默认值

java - 如何从 HashMap 的值访问数组的元素? java

java - 将 Java Class<?> 作为剩余模板的主体传递

java - 如何将跨多个表的查询从 JDOQL 移植到 HQL