【问题标题】:ClassNotFoundException referencing hornetq specific stuff in JBoss AS 7ClassNotFoundException 在 JBoss AS 7 中引用 hornetq 特定的东西
【发布时间】:2012-01-19 00:41:10
【问题描述】:

我正在尝试在 JBoss AS 7 应用程序中使用 JMS。发布正常消息似乎工作正常,但是当我尝试使用 hornetq 特定功能(排除重复消息)时,会引发异常。 这是代码:

om.setStringProperty(org.hornetq.api.core.Message.HDR_DUPLICATE_DETECTION_ID.toString(), application+rs.getString("stream")+ rs.getInt("site"));

这是堆栈跟踪:

java.lang.ClassNotFoundException: org.hornetq.api.core.Message from [Module "deployment.TestRestEasy.war:main" from Service Module Loader]
org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:361)
org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:333)
org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:310)
org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:103)
sample.Processor.processStreamSite(Processor.java:82)
sample.Processor.processSitesForStream(Processor.java:63)
sample.Processor.process(Processor.java:55)
sample.HelloWorld.process(HelloWorld.java:31)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:140)
org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:255)
org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:220)
org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:209)
org.jboss.resteasy.core.SynchronousDispatcher.getResponse(SynchronousDispatcher.java:519)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:496)
org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:119)
org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208)
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:55)
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:50)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

我相信我已经正确配置了standalone.xml 配置文件,因为标准JMS 代码有效。要访问 HornetQ 的特定功能,我需要做些什么特别的事情吗?

更新: 担心与我正在使用的 RestEasy 东西有关,所以搬到了独立的 Servlet,但仍然有同样的问题。下面的代码和异常

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   try {
    Context ic = new InitialContext();

  QueueConnectionFactory qcf = (QueueConnectionFactory) ic.lookup("java:/ConnectionFactory");
  Queue q = (Queue) ic.lookup("queue/test");

  QueueConnection qc = qcf.createQueueConnection();
  QueueSession qsess = qc.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  QueueSender qsend = qsess.createSender(q);

  ObjectMessage om = qsess.createObjectMessage();
  om.setObject((Serializable)new InboundDirectory("X", "Y", 9));
  om.setStringProperty(org.hornetq.api.core.Message.HDR_DUPLICATE_DETECTION_ID.toString(), "X");
  qsend.send(om);
  System.out.println("X");
  }
  catch (Exception e) {
     e.printStackTrace();
  }
}

这里是个例外:

java.lang.ClassNotFoundException: org.hornetq.api.core.Message from [Module "deployment.TestRestEasy.war:main" from Service Module Loader]
org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:361)
org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:333)
org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:310)
org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:103)
TestServlet.doPost(TestServlet.java:65)
TestServlet.doGet(TestServlet.java:46)
javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

进一步更新: 改用字符串值让它工作,但我认为这不是理想的,属性键不能保证永远是字符串。

om.setStringProperty("_HQ_DUPL_ID", "X:Y:9");

知道正确的方法吗?

更新:感谢@Vadzim 为我指明了正确的方向。对于其他在这个特定问题上苦苦挣扎的人,我将 Manifest.MF 更新如下:

Manifest-Version: 1.0
Class-Path: 
Dependencies: org.hornetq

注意,(我为此苦苦挣扎了一段时间),这个文件的解析非常“脆弱”。 'Class-Path:' 输入行后面的空格是必不可少的。

【问题讨论】:

    标签: jboss jboss7.x classloader hornetq


    【解决方案1】:

    【讨论】:

    • 很棒的答案,谢谢。为我指明了正确的方向,但仍有一些工作要做。
    • 不客气。这些链接提供了很多有用的信息来帮助您进行迁移。无论如何都值得一读。快速回答可能会阻止您这样做。 :)
    【解决方案2】:

    我认为应该将 hornetq-client 暴露给 HOrnetQ 模块。

    也许您应该通过他们的论坛与 AS7 人员交谈.. 或者在 jira.jboss.org 上为 AS7 项目提出问题.. 但我认为您需要先在论坛上交谈。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      相关资源
      最近更新 更多