これは非常に奇妙な動作です。NoSuchMethodException
(コンパイルライブラリとランタイムライブラリのバージョンが一致しなかったため)があり、コンテナがそれを飲み込んだため、キャッチする機会がありませんでした。このコードを見てください:
@MessageDriven(...)
public class NotificationReceiver implements MessageListener {
@Override
public void onMessage(Message message) {
try {
String textMessage = ((TextMessage) message).getText();
logger.debug("NOTIFICATION RECEIVED: " + textMessage);
...
String string = rootNode.get("id").asText();
logger.debug("ID: " + string);
} catch (Throwable e) {
logger.debug("ERROR", e);
}
}
このコードは、JSON形式のテキストメッセージを聞くことを目的としていますが、受信するたびにポイントIDを取得することはありません。
DEBUG [p: thread-pool-1; w: 12] NotificationReceiver - NOTIFICATION RECEIVED: {"name":"X","id":"123"}
この時点以降、ログを受信しませんでした...
後で、このコードを@Asynchronous
メソッド内の別のステートレスEJBに移動し、MDBから呼び出しました。それから私は例外を受け取りました:
DEBUG [Ejb-Async-Thread-10] NotificationReceiverAsync - NOTIFICATION RECEIVED: {"name":"X","id":"123"}
DEBUG [Ejb-Async-Thread-10] NotificationReceiverAsync - ERROR java.lang.NoSuchMethodError: org.codehaus.jackson.JsonNode.asText()Ljava/lang/String;
MDBにいる間、例外を受け取らなかったのはなぜですか?
アプリケーションサーバー:Glassfish 3.1.1