为什么连接到JMS服务的java代码没有编译?

为什么连接到JMS服务的java代码没有编译?,java,glassfish,jms,Java,Glassfish,Jms,我一直在使用GlassFish服务器进行项目工作,以使用java代码连接JMS服务。 我已经创建了connectionFactory、队列和主题,如下所述 1. jms/GlassFishBookConnectionFactory connectionfactory 2. jms/GlassFishBookQueue queue 3. jms/GlassFishBookTopic 下面是我的java代码,用于连接到上述连接的JMS服务。我一直在按照给定url的步骤进行操作。 我刚刚开始研究JM

我一直在使用GlassFish服务器进行项目工作,以使用java代码连接JMS服务。 我已经创建了connectionFactory、队列和主题,如下所述

1. jms/GlassFishBookConnectionFactory connectionfactory
2. jms/GlassFishBookQueue queue
3. jms/GlassFishBookTopic
下面是我的java代码,用于连接到上述连接的JMS服务。我一直在按照给定url的步骤进行操作。 我刚刚开始研究JMS服务。我在这方面做得并不完美。我已经下载了java.jmsjar文件并将其解压缩

package net.ensode.glassfishbook;

import javax.annotation.Resource;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.*;

public class MessageSender
{
  @Resource(mappedName = "jms/GlassFishBookConnectionFactory")
  private static ConnectionFactory connectionFactory;
  @Resource(mappedName = "jms/GlassFishBookQueue")
  private static Queue queue;

  public void produceMessages()
  {
    MessageProducer messageProducer;
    TextMessage textMessage;
    try
    {
      Connection connection = connectionFactory.createConnection();
      Session session = connection.createSession(false,
        Session.AUTO_ACKNOWLEDGE);
      messageProducer = session.createProducer(queue);
      textMessage = session.createTextMessage();

      textMessage.setText("Testing, 1, 2, 3. Can you hear me?");
      System.out.println("Sending the following message: "
        + textMessage.getText());
      messageProducer.send(textMessage);

      textMessage.setText("Do you copy?");
      System.out.println("Sending the following message: "
        + textMessage.getText());
      messageProducer.send(textMessage);

      textMessage.setText("Good bye!");
      System.out.println("Sending the following message: "
        + textMessage.getText());
      messageProducer.send(textMessage);

      messageProducer.close();
      session.close();
      connection.close();
    }
    catch (JMSException e)
    {
      e.printStackTrace();
    }
  }
  public static void main(String[] args)
  {
    new MessageSender().produceMessages();
  }
}
目前我编译这段代码的时候。我得到的错误如下

Exception in thread "main" java.lang.NullPointerException
    at net.ensode.glassfishbook.MessageSender.produceMessages(MessageSender.java:26)
    at net.ensode.glassfishbook.MessageSender.main(MessageSender.java:58)

显然,资源并没有注入到类中,因为您将其作为独立应用程序运行

引用您链接的文章:

在深入研究该代码的细节之前,提醒读者可能已经注意到该类是一个独立的Java应用程序,因为它包含一个main方法。由于该类是独立的,因此它在应用程序服务器外部执行。尽管如此,我们可以看到一些资源被注入到它中,特别是连接工厂和队列。我们之所以可以将资源注入到这段代码中,即使它在应用程序服务器之外运行,也是因为GlassFish包含一个名为appclient的实用程序

此实用程序允许我们“包装”一个可执行JAR文件,并允许它访问应用服务器资源。要执行前面的代码,假设它打包在一个名为jmsptpproducer.JAR的可执行JAR文件中,我们将在命令行中键入以下命令:

appclient -client jmsptpproducer.jar

尝试按上述方式运行应用程序。

使用名称而不是mappedName。name是JNDI名称,mappedName是特定于产品的名称。见

@资源(name=“jms/GlassFishBookConnectionFactory”)

公共静态连接工厂连接工厂

嗯,这不是编译错误,而是运行时错误。代码编译了,但您有一个NullpointerException-很可能是因为您在容器外运行代码…您的标题有误,代码编译了,但在使用
NPE
运行时失败。您的代码中哪一行是26?@A4L我如何才能使其可行。我刚刚开始一起编写java和JMS。它的解决方案是什么。@Robinhood从我在文章中了解到的是,glassfish附带了一个工具,您可以使用它来运行您的独立应用程序,就像它在glassfish应用程序容器中运行一样。您需要将应用程序/类导出到jar文件,然后使用该工具运行应用程序。请参阅我在回答中引用的文章内容。一般来说,只需将jar添加到
jmsptproducer
,这样就可以使用
java-jar jmsptproducer.jar
调用它?但是,另一个类将如何使用生产者?