项目需求:java+MATLAB并行开发 在java中调用由MATLAB转成的jar包的代码,需要调用到底层的MATLAB服务。每次只能一个线程调用,当多个线程同时调用MATLAB时,MATLAB会报错。导致整个java服务挂掉。
现在增加线程控制,每次只允许一个线程调用MATLAB代码。
使用ConcurrentHashMap来确保线程数量,在调用的service中定义一个变量用来保存当前调用的请求
java
private final Map<String, Boolean> ongoingRequests = new ConcurrentHashMap<>();
每次有新的请求进入时,判断是否已经存在相同的请求 存在则返回报错信息"服务器繁忙,请稍后重试"
java
String requestKey = req.toKey();
System.out.println("-------"+ongoingRequests.size());
synchronized (ongoingRequests) {
if (ongoingRequests.size() > LineEnum.LINE_THREE.getLineNumber() || ongoingRequests.containsKey(requestKey)) {
return new AbnormalResultDTO(ERROR_SERVICE_BUSY.getCode_default(), ERROR_SERVICE_BUSY.getComment());
}
// 都是matlab代码调用
if (req.getOrbitType() == HALO_PLOT.getOrbitCode() || req.getOrbitType() == MOON_EARTH.getOrbitCode() || req.getOrbitType() == EARTH_MOON.getOrbitCode()){
ongoingRequests.put(requestKey, true);
}
}
try {
OrbitPeriodVo result = algorithmService.getOrbitPeriodData(req);
return Objects.isNull(result) ?
new AbnormalResultDTO(ERROR_RESULT_MESSAGE.getCode_default(), ERROR_RESULT_MESSAGE.getName_default()) :
new NormalResultDTO<>(result);
} finally {
synchronized (ongoingRequests) {
ongoingRequests.remove(requestKey);
}
}