我有一个在多个线程中执行的方法。该方法执行一个操作,然后将结果写入数据块报告中。
public LinkedHashMap doSomething(){
// do something
....
extentReporObj.writeToReport(testName,result,..);
}
上面的方法是在实现可调用的类的调用方法内部调用的
我遇到的问题是多个线程同时试图在报告中写入,并且抛出ConcurrentModificationException。
我已经使writeToReport方法同步
public synchronized void writeToReport(String testName, String url, String request, String response, String resultStatus) {
setTest(testName);
test.log(LogStatus.INFO, testName + " Test Start");
test.log(LogStatus.INFO, "API URL :: " + url);
if (request != null)
test.log(LogStatus.INFO, "API Request :: " + request);
if (resultStatus.equalsIgnoreCase("pass"))
test.log(LogStatus.PASS, "Status :: Pass");
else
test.log(LogStatus.FAIL, "Status :: Fail");
if (null != response)
test.log(LogStatus.INFO, "API Response :: " + response);
test.log(LogStatus.INFO, testName + " Test End");
extent.endTest(test);
}
另一件事是,由于testName是一个全局变量,它在extent.endTest(test(;行,这给了我ExtentTestInterruptedException异常。
我搜索了很多,但他们都说同步方法,但在我的情况下不起作用。
就像下面一样,
public ThreadLocal<ExtentReports> extent = new ThreadLocal<>();
@BeforeSuite
public synchronized void setUp() throws IOException {
extent.set(new ExtentReports());
extent.get().attachReporter(htmlReporter);
}