我正在努力寻找解决方案,希望有人可以提供帮助。
我们有一个 Spring/Hibernate/Wicket/Tomcat Web 应用程序。我们使用 Spring Batch 在后台执行作业。有些每分钟执行一次并检查外部系统中的数据库表以查看是否有新记录。因此,有几个作业(可能有 8 个左右)以某个固定的时间间隔执行。对于其中的一些作业,我们必须进行一些手动查询,以确保不会同时运行第二个作业。
问题是,当 Spring Batch 尝试更新作业执行状态或数据库(SQL Server)中的某些其他框架状态时,我们会间歇性地遇到死锁异常。然后,作业状态将挂起,无论其当时处于什么状态。因此,确保一次只运行一个实例的作业最终永远不会运行,因为似乎有一个作业实例仍在运行。
我正在考虑仅为 Spring Batch JobRepository 迁移到内存中的 hsqldb 数据库,但这可能会带来它自己的一系列问题,所以我至少想看看其他人已经做了什么来解决这个问题。
编辑 我还不确定的一件事是重试逻辑是否会处理这样的事情。我知道它适用于步骤内的用户代码,但我不确定框架在步骤之间执行的数据库活动是否将通过重试逻辑进行处理。如果有人能澄清我将不胜感激。
我将在下面发布我的堆栈跟踪和 spring 配置。我们使用 spring-batch 3.0.7-RELEASE、spring-core 4.2.6.RELEASE。先谢谢您的帮助!
@Configuration
@EnableScheduling //Enables the @Scheduled annotation
@EnableBatchProcessing
public class BatchConfig implements BatchConfigurer
{
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private JobRepository jobRepository;
@Autowired
private DataSource dataSource;
private @Value("${batch.maxPoolSize}") String maxPoolSize;
private @Value("${batch.corePoolSize}") String corePoolSize;
private @Value("${batch.queueCapacity}") String queueCapacity;
@Bean
public JobOperator jobOperator() throws Exception
{
SimpleJobOperator jobOperator = new SimpleJobOperator();
jobOperator.setJobExplorer(getJobExplorer()); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用MockMvcBuilders.standaloneSetup方法为spring mvc rest控制器创建一个非常基本的单元测试.我一直收到404错误.下面我列出我的测试应用程序上下文,我的测试类,我的控制器和完整的堆栈跟踪.任何指导表示赞赏.
@Configuration
public class TestContext
{
@Bean
public Service service()
{
return mock(Service.class);
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={TestContext.class})
@WebAppConfiguration
public class TestUsingWebAppContextSetUp
{
private MockMvc mockMvc;
@Autowired
private Service service;
@Before
public void setUp()
{
mockMvc = MockMvcBuilders.standaloneSetup(MyController.class)
.build();
}
@Test
public void test() throws Exception
{
mockMvc.perform(get("/search?phoneNumber=5551112222"))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE));
}
}
public class MyController
{
@Autowired
private Service service;
@RequestMapping("/search")
public List<SearchResult> search(@RequestParam(value="phoneNumber") String phoneNumber)
{
System.out.println("search called");
Search search = new Search();
search.setPhoneNumber(phoneNumber);
return service.search(search);
}
} …Run Code Online (Sandbox Code Playgroud)