Ошибка развертывания MDB с несколькими именами очередей в OpenEJB - PullRequest
2 голосов
/ 30 октября 2010

Следующая ошибка появилась при запуске Tomcat / OpenEJB после обновления до OpenEJB 3.1.3:

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 Ответ

1 голос
/ 30 октября 2010

Хм, у нас не было поддержки 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 фактически предоставлял вам обе очереди, это - ActivConfig, который сделает это.

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

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