JavaMailでGMailをPOP3

今まで普通にPOP3でメールにアクセスしていたアプリがあるのだけど、それをGMailに変更しなきゃならなくなった。そのような場合は、今まで

Session session = Session.getDefaultInstance(System.getProperties(), null);
Store store = session.getStore("pop3");
store.connect(server, -1, username, password);

みたいなコードだったものを

Properties pop3Props = new Properties();
pop3Props.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false");
pop3Props.setProperty("mail.pop3.port", "995");
pop3Props.setProperty("mail.pop3.socketFactory.port", "995");
URLName url = new URLName("pop3", "pop.gmail.com", 995, "", username, password);
Session session = Session.getInstance(pop3Props, null);
Store store = new POP3SSLStore(session, url);
store.connect();

という感じに変えたら、動くようになった。という感じでメモ…。

DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE

FindBugs に

private Integer activeThreadCount = 0;
...
synchronized (activeThreadCount) {
activeThreadCount++;
}

みたいに書いていたら、DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE と怒られた。はて、何だろと思ったら、activeThreadCount = 0 が内部的には activeThreadCount = Integer.valueOf(0) になり、Integer.valueOf(0) は -128~127 でキャッシュを利用するから、synchronized の対象が意図しない、共有されるオブジェクトになるためみたい(つまり、新規に作った固有のオブジェクトという感じじゃない)。というわけで、ロックしたかったら、それようのロックオブジェクトを作るべしということみたい。なるほどね。