ClassNotFoundException, ссылающийся на специфический материал hornetq в JBoss AS 7 - PullRequest
3 голосов
/ 13 декабря 2011

Я пытаюсь использовать JMS в приложении JBoss AS 7. Публикация обычных сообщений, кажется, работает нормально, однако, когда я пытаюсь использовать специальные функции 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, поэтому перешел в автономный сервлет, но все еще имел проблему. Код и исключение ниже

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)

Дальнейшее обновление: Получил это, используя вместо этого значение String, но я не думаю, что это идеально, ключ свойства не гарантирует, что строка навсегда.

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

Есть идеи, как это сделать?

Обновление: спасибо @Vadzim за указание в правильном направлении. Для всех, кто борется с этой конкретной проблемой, я обновил Manifest.MF следующим образом:

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

Обратите внимание, (как я некоторое время боролся с этим), синтаксический анализ этого файла очень 'хрупок'. Пробел после строки входа «Class-Path:» имеет важное значение.

Ответы [ 2 ]

4 голосов
/ 13 декабря 2011

Модель загрузки классов изменена в JBoss 7. Она скрывает много вещей, которые явно не объявлены.

Вы должны ознакомиться с этими ссылками:

https://docs.jboss.org/author/display/AS7/Developer+Guide#DeveloperGuide-HowtoresolveClassNotFoundExceptionsandNoCLassDefFoundErrors

https://docs.jboss.org/author/display/AS7/Class+Loading+in+AS7

1 голос
/ 13 декабря 2011

Я считаю, что hornetq-клиент должен быть доступен для модуля HOrnetQ.

Возможно, вам следует поговорить с парнями из AS7 через их форум ... или, возможно, поднять вопрос на jira.jboss.org для проекта AS7... но я считаю, что вы должны сначала поговорить на форумах.

...