1 回答

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
最終我放棄了轉(zhuǎn)換消息類型,如果它在轉(zhuǎn)換中掛起我直接讓for循環(huán)跳過并繼續(xù),這樣一些消息就被省略了。我認(rèn)為這無關(guān)緊要,因?yàn)槲野l(fā)現(xiàn)只有垃圾郵件才能使程序掛起。下面是代碼
for (int n = message.length; i < n; i++)
{
Log25.write("IMAPaccess", "getMessages", "start convert");
MimeMessage msg = (MimeMessage)message[i];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
// MJN1 has some SPAM email cannot be converted, so use thread to do the conversion
final Runnable stuffToDo = new Thread() {
@Override
public void run() {
try {
Log25.write("IMAPaccess", "run", "write to MimeMessage");
msg.writeTo(bos);
Log25.write("IMAPaccess", "run", "wrote to MimeMessage");
} catch (IOException | MessagingException e) {
Log25.write("IMAPaccess", "run", (new StringBuilder()).append("error = ").append(e.getMessage()).toString());
}
}
};
final ExecutorService executor = Executors.newSingleThreadExecutor();
final Future future = executor.submit(stuffToDo);
executor.shutdown(); // This does not cancel the already-scheduled task.
// start the conversion and if the process hangs, the loop should skip and continue
try {
future.get(1, TimeUnit.SECONDS);
}
catch (InterruptedException ie) {
Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(ie.getMessage()).toString());
continue;
}
catch (ExecutionException ee) {
Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(ee.getMessage()).toString());
continue;
}
catch (TimeoutException te) {
Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(te.getMessage()).toString());
continue;
}
catch(Exception e) {
Log25.write("IMAPaccess", "getMessages", (new StringBuilder()).append("error = ").append(e.getMessage()).toString());
continue;
}
if (!executor.isTerminated())
executor.shutdownNow();
bos.close();
我使用線程和執(zhí)行程序來使掛起循環(huán)繼續(xù),這不是一件容易的事。
添加回答
舉報(bào)