运行简单的MDB应用程序时出错

时间:2013-02-18 08:30:39

标签: ejb glassfish-3

我正在尝试运行以下程序。我正在使用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)

这可能是什么问题?

1 个答案:

答案 0 :(得分:1)

您构建的不是MDB。它是一个浏览队列的无状态会话bean。

MDB具有@MessageDriven注释。只要有消息进入就会调用它。

除此之外,您可能希望使用“lookup”属性而不是“mappedName”属性。后者来自一个古老的时代,当时人们还不确定任何东西,需要一个暂时的黑客来让事情神奇地起作用。

在无状态bean中使用静态字段和静态main方法毫无意义。如果您通过该main方法访问bean,那么您根本就不使用bean,而只是调用一个类似于全局的孤立方法。如果有的话,这可能是您的NPE的来源。

修复并不简单。您似乎在Java EE和Java SE之间以及实例和静态方法之间完全混淆。