2010-10-29 2 views
2

Следующая ошибка появилась при запуске Tomcat/OpenEJB после обновления до OpenEJB 3.1.3:Ошибки развертывания MDB с несколькими именами очередей в OpenEJB

ERROR - Unable to register MBean 
java.lang.IllegalStateException: javax.management.MalformedObjectNameException: Invalid character ',' in key part of property 
    at org.apache.openejb.monitoring.ObjectNameBuilder.build(ObjectNameBuilder.java:59) 
    at org.apache.openejb.core.mdb.MdbContainer.deploy(MdbContainer.java:169) 
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:599) 
    at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:450) 
    at org.apache.openejb.assembler.classic.Assembler.buildContainerSystem(Assembler.java:368) 
    at org.apache.openejb.assembler.classic.Assembler.build(Assembler.java:280) 
    at org.apache.openejb.OpenEJB$Instance.<init>(OpenEJB.java:125) 
    at org.apache.openejb.OpenEJB$Instance.<init>(OpenEJB.java:60) 
    at org.apache.openejb.OpenEJB.init(OpenEJB.java:271) 
    at org.apache.openejb.OpenEJB.init(OpenEJB.java:250) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.openejb.loader.OpenEJBInstance.init(OpenEJBInstance.java:36) 
    at org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:71) 
    at org.apache.openejb.client.LocalInitialContextFactory.init(LocalInitialContextFactory.java:53) 
    at org.apache.openejb.client.LocalInitialContextFactory.getInitialContext(LocalInitialContextFactory.java:42) 
    ... 
    <proprietary stack trace skipped> 
    ... 
Caused by: javax.management.MalformedObjectNameException: Invalid character ',' in key part of property 
    at javax.management.ObjectName.construct(ObjectName.java:535) 
    at javax.management.ObjectName.<init>(ObjectName.java:1403) 
    at org.apache.openejb.monitoring.ObjectNameBuilder.build(ObjectNameBuilder.java:57) 
    ... 70 more 
INFO - Created Ejb(deployment-id=InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT, ejb-name=InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT, container=My MDB Container) 

В следующем MDB вызывает эту ошибку:

@MessageDriven(name="InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT") 
public class InboundXMLQueueHandler implements MessageListener { 
... 

потому что после смены на

@MessageDriven(name="InboundXMLQueueHandlerST") 
public class InboundXMLQueueHandler implements MessageListener { 
... 

ошибка исчезла.

Как вы можете видеть, мы определяем двух слушателей с использованием имен очереди и разделенных запятыми имен в аннотациях. Это безупречно работало с 3.1.2 (по крайней мере, казалось), но теперь оно дает нам ошибку выше (хотя ошибка, похоже, не мешает развертыванию MDB, но мониторинг JMX имеет для нас решающее значение).

Я не могу найти какой-либо пример использования @MessageDriven аннотации с несколькими очередями (один класс MDB, несколько разделенных запятыми имен очередей). Это неправильный способ сделать это? Является ли это документированной функцией? Что изменилось в 3.1.3, чтобы JMX больше не мог регистрировать MDB?

ответ

1

Хм, у нас не было поддержки JMX в 3.1.2. Я лично никогда не пробовал подключать MDB до двух очередей - вроде удивился, что сработал. Это ActiveMQ, который выполняет фактическое «подключение к очереди» (стандартное задание JMS-коннектора), мы просто передаем метаданные.

На стороне OpenEJB единственное волшебство, которое мы делаем, состоит в том, чтобы заполнить ваши настройки destination и destinationType через @ActivationConfigProperty, если вы этого еще не сделали. Мы установим destination на ваше имя бина, если это не заполняется, и мы установим destinationType в javax.jms.Queue, если это не заполняется.

Таким образом, ваш боб выше будет существенно выглядеть следующим образом, если все было установлено явно.

@MessageDriven(
    name="InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT", 
    activationConfig = { 
     @ActivationConfigProperty(
      propertyName = "destinationType", 
      propertyValue = "javax.jms.Queue"), 
     @ActivationConfigProperty(
      propertyName = "destination", 
      propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")}) 
public class InboundXMLQueueHandler implements MessageListener { 
... 

Если предположить, что на самом деле ActiveMQ давал вам как очереди, это activationConfig, что бы это сделать.

Возможно, самое простое, что нужно попробовать - явно указать имя получателя и просто удалить имя компонента.

@MessageDriven(
    activationConfig = { 
     @ActivationConfigProperty(
      propertyName = "destination", 
      propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")}) 
public class InboundXMLQueueHandler implements MessageListener { 
... 
+0

Вы правы - нет поддержки JMX в 3.1.2 - мы используем поддержку ActiveMQ в обоих. – topchef

+0

Отлично. Это все равно будет работать нормально. Кроме того, в кодовой базе 3.1.3 есть хорошие ссылочные позиции для вас. В основном учитывайте и длительность ваших onMessage раз. На следующей неделе мы, скорее всего, запустим 3.1.4, поэтому обязательно сообщите мне, если есть что-то, что мы можем добавить для вас. –

Смежные вопросы