Изменение конфигурации активации темы с чтением MDB во время развертывания

Я чувствую, что это должно быть легко. Просто RTM и вперед. Но я не могу найти нужную мне информацию.

Q: Могу ли я изменить значение @ActivationConfigProperty во время развертывания без необходимости писать какие-либо XML?


Более детально

У меня есть MDB, который использует @MessageDriven аннотаций. В этом ряду @ActivationConfigProperty аннотации для его настройки.

@MessageDriven(mappedName = "jms/TestJeremyTopic ", activationConfig = {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
        @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
        @ActivationConfigProperty(propertyName = "clientId", propertyValue = "TopicReaderBeanClientId"),
        @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "TopicReaderBeanSubscriptionName")
})
public class TopicReaderBean implements MessageListener { // ...

Мне нужно развернуть этот MDB несколько раз, каждый раз обращаясь к другой теме.

Во время развертывания (WebSphere 7 ND) я могу настроить отдельный TopicListenerPort (Способ сопоставления различных тем в WebSphere) для каждого EAR. Однако, когда я пытаюсь запустить второй экземпляр, происходит сбой с ошибкой:

WMSG0019E: Невозможно запустить прослушиватель MDB TopicReaderBean, JMSDestination jms/MMiSInLonTopic: com.ibm.msg.client.jms.DetailedIllegalStateException: JMSWMQ0026: Не удалось подписаться на тему "MMIS_LON_IN" с помощью MQS. Возможно, возникла проблема при создании подписки из-за ее использования другим получателем сообщений. Убедитесь, что все потребители сообщений, использующие эту подписку, закрыты, прежде чем пытаться создать новую подписку под тем же именем. Пожалуйста, смотрите связанное исключение для получения дополнительной информации. Причина: com.ibm.mq.MQException: JMSCMQ0001: сбой вызова WebSphere MQ с кодом 2' ('MQCC_FAILED') причины'2429' ('MQRC_SUBSCRIPTION_IN_USE').

Когда я смотрю в MQ Explorer, я вижу название подписки JMS:GGWKNNG5:gmm_poc_06:TopicReaderBeanSubscriptionName Это состав из "JMS", имени QueueManager, идентификатора фабрики соединений с темой и ActivationConfigProperty "subscriptionName". Второе подключение не удается из-за конфликта на этом имени подписки. Мне нужно различать имена подписок, используемые разными экземплярами MDB.

Хотя я мог бы создать новую фабрику соединений тем для каждого компонента, это было бы много работы и не имеет особого смысла.

Что имеет смысл, так это иметь другое имя подписки для одного компонента. Однако это свойство встроено в аннотацию, и я не вижу нигде в WebSphere, который позволил бы мне переопределить его.

Итак, я могу переопределить это свойство без необходимости писать дескриптор развертывания XML? И если мне нужно написать какой-нибудь XML, как мне переопределить это свойство?

1 ответ

Решение

Вместо любого решения во время развертывания я написал ejb-jar.xml Конфиг, который я могу изменить во время сборки. Это гласит:

<?xml version="1.0"?>
 <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd"
      version="3.1">
    <enterprise-beans>

        <message-driven id="MySpecialMDB">
            <display-name>MySpecialMDB</display-name>
            <ejb-name>TopicReaderBean</ejb-name>
            <ejb-class>my.TopicReaderBean</ejb-class>
            <transaction-type>Container</transaction-type>
            <message-destination-type>javax.jms.Topic</message-destination-type>
            <activation-config>
                <activation-config-property>
                    <activation-config-property-name>destinationType</activation-config-property-name>
                    <activation-config-property-value>javax.jms.Topic</activation-config-property-value>
                </activation-config-property>
                <activation-config-property>
                    <activation-config-property-name>subscriptionDurability</activation-config-property-name>
                    <activation-config-property-value>Durable</activation-config-property-value>
                </activation-config-property>
                <activation-config-property>
                    <activation-config-property-name>subscriptionName</activation-config-property-name>
                    <activation-config-property-value>${subscriptionName}</activation-config-property-value>
                </activation-config-property>
            </activation-config>
        </message-driven>

    </enterprise-beans>
</ejb-jar>
Другие вопросы по тегам