1

次のプログラムを実行しようとしています。Glassfishサーバー3.1.2を使用して、このMDBを実行できるようにしています。それでも、実行できません。

package com.mdb;

import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Connection;
import javax.jms.Session;
import javax.jms.QueueBrowser;
import javax.jms.Message;
import javax.jms.JMSException;
import javax.annotation.Resource;
import java.util.Enumeration;

import javax.ejb.Stateless;
/**
 * The MessageBrowser class inspects a queue and displays the messages it
 * holds.
 */
@Stateless
public class MessageClient {
    @Resource(mappedName = "jms/ConnectionFactory")
    private static ConnectionFactory connectionFactory;
    @Resource(mappedName = "jms/Queue")
    private static Queue queue;

    /**
     * Main method.
     *
     * @param args     the queue used by the example
     */
    public static void main(String[] args) {
        Connection connection = null;

        try {
            System.out.println("1");
            connection = connectionFactory.createConnection();
            System.out.println("2");
            Session session = connection.createSession(
                        false,
                        Session.AUTO_ACKNOWLEDGE);
            QueueBrowser browser = session.createBrowser(queue);
            Enumeration msgs = browser.getEnumeration();

            if (!msgs.hasMoreElements()) {
                System.out.println("No messages in queue");
            } else {
                while (msgs.hasMoreElements()) {
                    Message tempMsg = (Message) msgs.nextElement();
                    System.out.println("Message: " + tempMsg);
                }
            }
        } catch (JMSException e) {
            System.err.println("Exception occurred: " + e.toString());
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                }
            }
        }
    }
}

問題は、それを実行すると次のような例外が発生することです。

Exception in thread "main" java.lang.NullPointerException
    at com.mdb.MessageClient.main(MessageClient.java:35)

ここで何が問題になるのでしょうか?

4

1 に答える 1

1

ビルドしたものは MDB ではありません。キューを参照するステートレス セッション Bean です。

MDB には @MessageDriven アノテーションがあります。メッセージが来るたびに呼び出されます。

それとは別に、「mappedName」属性の代わりに「lookup」属性を使用することもできます。後者は、人々がまだ何も確信が持てず、物事を魔法のように機能させるために一時的なハックが必要だった古代からのものです。

ステートレス Bean 内で静的フィールドと静的 main メソッドを使用することはまったく意味がありません。そのメイン メソッドを介して Bean にアクセスしている場合は、Bean をまったく使用しておらず、分離されたグローバルなメソッドを呼び出しているだけです。どちらかといえば、これが NPE の原因である可能性があります。

修正は本当に簡単ではありません。Java EE と Java SE の間、およびインスタンスと静的メソッドの間で完全に混乱しているようです。

于 2013-02-18T09:33:32.797 に答える