Java Spring@Async注释不';不要创建新线程
我已经阅读了所有关于Java Spring@Async注释不';不要创建新线程,java,spring,Java,Spring,我已经阅读了所有关于@Async问题的帖子,但即使我的代码完全正确,它似乎也不起作用 我使用以下方法作为弹簧的实施指南: 这是我的RestController类,带有@Autowired类声明 @RestController public class RTCEntitiesRESTController { @Autowired private RTCEntitiesProcessor rtcEntitiesProcessor; @RequestMapping(valu
@Async
问题的帖子,但即使我的代码完全正确,它似乎也不起作用
我使用以下方法作为弹簧的实施指南:
这是我的RestController类,带有@Autowired
类声明
@RestController
public class RTCEntitiesRESTController {
@Autowired
private RTCEntitiesProcessor rtcEntitiesProcessor;
@RequestMapping(value = "/refresh", method = RequestMethod.POST)
public void refreshEntities() {
rtcEntitiesProcessor.getStatus().start();
}
@RequestMapping(value = "/status", method = RequestMethod.GET)
public @ResponseBody
AbstractState getStatus() {
return rtcEntitiesProcessor.getStatus();
}
}
public class Ready extends AbstractState {
private static final Logger LOGGER = LogManager.getLogger(Ready.class);
@Override
@Scheduled(fixedDelay = 600000)
public void start() {
context.setStatus(new InProgress());
LOGGER.info("Starting process");
LOGGER.info(Thread.currentThread().getName());
context.processData();
}
@Override
public String getStatus() {
return "ready";
}
}
这是@组件
类
@Component
public class RTCEntitiesProcessor {
private static final Logger LOGGER = LogManager.getLogger(RTCEntitiesProcessor.class);
private RTCEntitiesController entitiesController;
private List<RTCRoleDefinition> roleDefinitions;
private List<RTCUser> users;
private AbstractState status;
@Value("${rtcServer.timeBetweenExecutionsInMinutes}")
private long timeBetweenExecutions;
public RTCEntitiesProcessor(RTCEntitiesController entitiesController) {
this.entitiesController = entitiesController;
this.roleDefinitions = new ArrayList<RTCRoleDefinition>();
this.users = new ArrayList<RTCUser>();
status = new Ready();
}
@PostConstruct
public void passContext() {
status.setContext(this);
}
@Async
public void processData() {
try {
getNewEntities();
LOGGER.info(Thread.currentThread().getName());
Thread.sleep(10000);
status.block();
} catch (Exception e) {
LOGGER.info("Error while processing entities", e);
status.fail();
}
}
private void getNewEntities() throws InterruptedException {
List<RTCRoleDefinition> newRoleDefinitions = new ArrayList<RTCRoleDefinition>();
List<RTCUser> newUsers = new ArrayList<RTCUser>();
for (RTCProjectArea projectArea : entitiesController.getProjectAreas()) {
projectArea.addAreas(entitiesController.getTeamAreas(projectArea));
processArea(projectArea, null);
newRoleDefinitions.addAll(projectArea.getRoles());
newUsers = mergeUsers(newUsers, projectArea.getMembers());
for (RTCTeamArea rtcTeamArea : projectArea.getAreas()) {
newRoleDefinitions.addAll(rtcTeamArea.getRoles());
newUsers = mergeUsers(newUsers, rtcTeamArea.getMembers());
}
}
this.roleDefinitions = newRoleDefinitions;
this.users = newUsers;
}
请特别注意这样一个事实,
@Async
注释如果被this
调用,则无法工作。因此,请尝试在您的Ready
类中自动连接RTCEntitiesProcessor
。为此,您应该将准备好
作为@组件
要了解您可以在中阅读更多内容,您可以更具体地说明您的代码“拒绝工作”的原因吗?在
Ready
类中,context
从何而来?日志可以帮助我们了解这一点如何适用于问题?此public void passContext(){status.setContext(this);}
setup context处于就绪状态时未调用该方法调用。在该状态之后,调用set context的方法context.processData()
@Andrey谢谢!!我通过给Read类一个对RTCEntitiesProcessor bean的引用来解决这个问题,然后给RTCEntitiesProcessor一个Ready bean的实例(带有惰性注释),现在它可以工作了。
@SpringBootApplication
@EnableAsync
@EnableScheduling
public class MainController {
private static final Logger LOGGER = LogManager.getLogger(MainController.class);
@Value("${rtcServer.username}")
private String username;
@Value("${rtcServer.password}")
private String password;
@Value("${rtcServer.uri}")
private String serverURI;
public static void main(String[] args) {
LOGGER.info("Running Spring Boot Application");
SpringApplication.run(MainController.class, args);
}
@Bean
public RTCHttpClient getClient() {
return new RTCHttpClient(username, password, serverURI);
}
}