【问题标题】:Why the java code for connecting to JMS service is not compiling?为什么连接 JMS 服务的 java 代码没有编译?
【发布时间】:2014-02-22 23:34:20
【问题描述】:

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

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

这是我连接到上述连接的 JMS 服务的 java 代码。我一直在按照给定的 url 的步骤来处理它。 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)

【问题讨论】:

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

标签: java glassfish jms


【解决方案1】:

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

引用您链接的文章:

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

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

appclient -client jmsptpproducer.jar

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

【讨论】:

  • 一般来说,只要在jmsptpproducer添加jar,就可以用java -jar jmsptpproducer.jar调用?但是,其他类将如何使用生产者?
【解决方案2】:

使用名称而不是映射名称。 name 是 JNDI 名称, mappedName 是产品特定名称。见API doc

@Resource(name="jms/GlassFishBookConnectionFactory")
公共静态 ConnectionFactory connectionFactory;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2019-12-28
    • 2020-11-06
    相关资源
    最近更新 更多