Изменение конфигурации активации темы с чтением MDB во время развертывания - PullRequest
1 голос
/ 01 февраля 2011

Я чувствую, что это должно быть легко. Просто 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' для темы. Возможно, возникла проблема при создании подписки из-за ее использования другим получателем сообщений. Убедитесь, что все потребители сообщений, использующие эту подписку, закрыты, прежде чем пытаться создать новую подписку с тем же именем. Пожалуйста, смотрите связанное исключение для получения дополнительной информации. Вызывается: 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 Ответ

0 голосов
/ 02 февраля 2011

Вместо любого решения для развертывания я написал конфигурацию 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>
...