2014-08-19 4 views
0

У меня есть приложение, построенное на WebLogic 11b (10.3.4) с использованием MDB. Я пытаюсь преобразовать их в Spring MDP. Вот MDB в вопрос:Преобразование WebBlog MDB в Spring Message-Driven POJO

@MessageDriven(activationConfig = { 
     @ActivationConfigProperty(propertyName = "ejbName", propertyValue = "RecipientEventRouterBean"), 
     @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), 
     @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), 
     @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable") }) 
public class RecipientEventRouterBean extends TraxMessageRouter { 

    @Resource 
    private int appInstance; 

    @Resource 
    private String appName; 

    @Resource(mappedName = "jms/TraxErrorQ") 
    private Queue errorQueue; 

    @Resource(name = "TraxCF") 
    private ConnectionFactory errorQueueConnectionFactory; 

    @EJB 
    private Logger loggingService; 

    @Resource 
    private int maxJMSXDeliveryCount; 

    @Resource 
    private boolean validate; 

    @EJB 
    protected RecipientRegistrationService recService; 

    @Override 
    @PostConstruct 
    public void init() { 

     if (appName == null) { 
      throw new EJBException("appName is null"); 
     } 

     try { 
      super.traxFactory = TraxFactory.getInstance(Application.fromValue(appName)); 
      super.processor = new ObjectFactory().createApplicationInstance(); 
      super.processor.setName(appName); 
      super.processor.setInstance(this.appInstance); 
      super.errorQueueConnectionFactory = this.errorQueueConnectionFactory; 
      super.errorQueue = this.errorQueue; 
      super.maxJMSXDeliveryCount = this.maxJMSXDeliveryCount; 
      super.validate = this.validate; 
      super.loggingService = this.loggingService; 
     } catch (Exception e) { 
      throw new EJBException(e); 
     } 

     super.init(); 
    } 

    @Override 
    protected TraxMessageService getTraxMessageService() { 

     return recService; 
    } 

} 

Родитель MDB, TraxMessageRouter, реализует интерфейс MessageListener.

Я создал бобы MDP в JMS-applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

    <!-- Spring JMS Destination Resolver --> 
    <bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver"> 
     <property name="cache" value="true" /> 
    </bean> 


    <!-- Spring JMS Queue Connection Factory leveraging a single connection --> 
    <!-- SingleConnectionFactory will return the same Connection on all createConnection calls and ignore calls to close --> 
    <bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="jms/TraxCF" /> 
    </bean> 

    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
     <property name="connectionFactory" ref="connectionFactory" /> 
     <property name="destinationResolver" ref="jmsDestinationResolver" /> 
    </bean> 

    <bean id="jmsSender" class="com.mycompany.web.service.jms.JMSSender"> 
     <property name="jmsTemplate" ref="jmsTemplate" /> 
    </bean> 

    <bean id="jmsReceiver" class="com.mycompany.web.service.jms.JMSReceiver"> 
     <property name="jmsTemplate" ref="jmsTemplate" /> 
    </bean> 

    <bean id="jmsQueue" class="javax.jms.Topic" /> 

    <!-- this is the Message Driven POJO (MDP) --> 
    <bean id="messageListener" class="com.mycompany.messaging.RecipientEventRouterBean" /> 

    <!-- and this is the message listener container --> 
    <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
     <property name="connectionFactory" ref="connectionFactory"/> 
     <property name="destination" ref="jmsQueue"/> 
     <property name="messageListener" ref="messageListener" /> 
    </bean> 
</beans> 

Как преобразовать аннотацию @MessageDriven в правильный синтаксис Spring? Могу я просто прокомментировать это сейчас?

У меня есть еще несколько EventRouterBeans. Все ли они получают объявления bean в jms-ApplicationContext.xml или я могу добавить родительский TraxMessageRouter в xml?

Какие еще изменения в конфигурационных файлах необходимо выполнить? Есть ли хорошее руководство по переходу от МБР к МДП? Есть ли хорошее руководство по переходу от EJB 3 к Spring?

ответ

1

Это почти похоже на меня. Вот несколько советов:

  • Да, вы можете удалить @MessageDriven аннотацию, как вы настроили контейнер уже
  • Ваш боб jmsQueue является неправильным. Когда вы используете weblogic, вам нужно либо найти очередь, используя JNDI (например, вы сделали для фабрики соединений), либо вы должны указать имя (jndi) очереди, используя свойство destinationName (которое принимает String, а не javax.jms.Destination)

Вам нужно одно объявление для каждого слушателя сообщения, которое вы хотите развернуть. Возможно, вы должны пойти по пути пространства имен xml, чтобы поделиться этими настройками?

<jms:listener-container connectionFactory="connectionFactory" 
         destinationResolver="jmsDestinationResolver"> 
    <jms:listener ... /> 
    <jms:listener ... /> 
</jms:listener-container> 

Это создаст два слушателя контейнеров (т.е. один контейнер в jms:listener входа).

Обратите внимание также, что Spring 4.1 будет предлагать лучший декларативный подход, где вы можете просто комментировать метод любого управляемого Spring компонента. Проверьте this blog post для получения дополнительной информации. 4.1.0.RC2 выпущен, поэтому вы можете попробовать его сейчас.

+0

Поскольку в аннотированной версии MDB используется функция subscriptionDurability = "Durable", должен ли атрибут атрибут destination-type = "durableTopic"? –

+1

Это правильно. Вам необходимо передать то, что вы сконфигурировали с помощью аннотации EE, в конфигурацию Spring. –

Смежные вопросы