繁体   English   中英

为什么用于连接JMS服务的Java代码未编译?

[英]Why the java code for connecting to JMS service is not compiling?

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

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

这是我的Java代码,可以通过上述连接连接到JMS服务。 我一直在按照给定的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)

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

引用您链接的文章:

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

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

 appclient -client jmsptpproducer.jar 

尝试如上所述运行该应用程序。

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

@Resource(名称= “JMS / GlassFishBookConnectionFactory”)
公共静态ConnectionFactory connectionFactory;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM