在部署时更改主题读取MDB的激活配置

我觉得这应该很容易。 只是RTM然后去。 但我找不到我需要的信息。

问:我可以在部署时更改@ActivationConfigProperty的值而无需编写任何XML吗?


更多详情

我有一个使用@MessageDriven注释的MDB。 其中包含许多配置它的@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),我能够为每个EAR配置不同的TopicListenerPort (WebSphere的映射到不同主题的方式)。 但是,当我尝试启动第二个实例时,它失败并显示错误:

WMSG0019E:无法启动MDB侦听器TopicReaderBean,JMSDestination jms / MMiSInLonTopic:com.ibm.msg.client.jms.DetailedIllegalStateException:JMSWMQ0026:无法使用MQSUB订阅主题“MMIS_LON_IN”。 由于其被另一个消息使用者使用,因此可能存在创建订阅的问题。 在尝试使用相同名称创建新订阅之前,请确保使用此订阅的任何消息使用者都已关闭。 有关详细信息,请参阅链接的例外。 引发者:com.ibm.mq.MQException:JMSCMQ0001:WebSphere MQ调用失败,compcode为’2’(’MQCC_FAILED’),原因为’2429’(’MQRC_SUBSCRIPTION_IN_USE’)。

当我查看MQ Explorer时,我可以看到订阅名称是JMS:GGWKNNG5:gmm_poc_06:TopicReaderBeanSubscriptionName这是“JMS”,QueueManager名称,主题连接工厂ID和ActivationConfigProperty“subscriptionName”的组合。 第二个连接因此订阅名称发生冲突而失败。 我需要区分不同MDB实例使用的订阅名称。

虽然我可以为每个bean创建一个新的主题连接工厂,但这将是一项很多工作并且没有多大意义。

有意义的是每个bean有一个不同的订阅名称。 但是,这个属性被添加到注释中,我无法在WebSphere中看到允许我覆盖它的任何地方。

那么,我可以覆盖此属性而无需编写XML部署描述符吗? 如果我确实需要编写一些XML,我该如何覆盖其中的属性?

代替任何部署时解决方案,我编写了一个ejb-jar.xml配置,我可以在构建时修改它。 它如下:

     MySpecialMDB TopicReaderBean my.TopicReaderBean Container javax.jms.Topic   destinationType javax.jms.Topic   subscriptionDurability Durable   subscriptionName ${subscriptionName}