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

时间:2014-01-30 15:17:03

标签: java glassfish jms

我一直在使用GlassFish服务器处理项目以使用我的java代码连接JMS服务。 我已经创建了connectionFactory,queue和Topic,如下所述。

1. jms/GlassFishBookConnectionFactory connectionfactory
2. jms/GlassFishBookQueue queue
3. jms/GlassFishBookTopic

这是我为上述连接连接到JMS服务的java代码。我一直在按照给定网址的步骤来处理它。 http://www.packtpub.com/article/setting-glassfish-jms-and-working-message-queues 我刚开始研究JMS服务。我不是很完美。我已经下载了java.jms jar文件并将其解压缩。

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)

2 个答案:

答案 0 :(得分:2)

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

引用您已关联的文章:

  

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

     

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

appclient -client jmsptpproducer.jar

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

答案 1 :(得分:0)

使用name而不是mappedName。 name是JNDI名称,mappedName是产品特定名称。请参阅API doc

@Resource(名称= “JMS / GlassFishBookConnectionFactory”)
public static ConnectionFactory connectionFactory;