Ошибка развертывания MDB с несколькими именами очереди в OpeneJB

StackOverflow https://stackoverflow.com/questions/4056150

Вопрос

Появилась следующая ошибка в запуске 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 (по крайней мере, казалось), но теперь он дает нам ошибку выше (хотя ошибка, кажется, не предотвращает развертывание MDBS, но мониторинг JMX имеет решающее значение для нас).

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

Это было полезно?

Решение

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

На стороне 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 на самом деле дает вам оба очереди, это активацияConfig, который это сделает.

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

@MessageDriven(
    activationConfig = {
        @ActivationConfigProperty(
           propertyName = "destination", 
           propertyValue = "InboundXMLQueueHandlerST,InboundXMLQueueHandlerMT")})
public class InboundXMLQueueHandler implements MessageListener {
...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top