Изменение настроек JMS с помощью Glassfish и Spring

В нашем проекте мы используем Glassfish v3.1.2.2 с фабрикой соединений, связанной как «jms/ConnectionFactory», и очередью, связанной как «jms/Queue». Оба создаются в административной консоли Glassfish:

Конфигурация Spring реализована следующим образом:

@Bean
public JndiTemplate jndiTemplate() {
    JndiTemplate jndiTemplate = new JndiTemplate();
    Properties props = new Properties();
    props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
    props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
    props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
    props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
    props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
    jndiTemplate.setEnvironment(props);

    return jndiTemplate;
}


@Bean
public JndiObjectFactoryBean connectionFactory() {
    JndiObjectFactoryBean connectionFactory = new JndiObjectFactoryBean();
    connectionFactory.setJndiTemplate(jndiTemplate());
    connectionFactory.setJndiName("jms/ConnectionFactory");

    return connectionFactory;
}

@Bean
public TransactionAwareConnectionFactoryProxy connectionFactoryProxy() {
    return new TransactionAwareConnectionFactoryProxy((ConnectionFactory) connectionFactory().getObject());
}

@Bean
public JndiObjectFactoryBean destination() {
    JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
    jndiObjectFactoryBean.setJndiTemplate(jndiTemplate());
    jndiObjectFactoryBean.setJndiName("jms/Queue");
    return jndiObjectFactoryBean;
}

@Bean
public JmsTemplate jmsTemplate() {
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setConnectionFactory((ConnectionFactory) connectionFactory().getObject());
    jmsTemplate.setDefaultDestination((Destination) destination().getObject());
    return jmsTemplate;
}

@Bean
public DefaultMessageListenerContainer simpleMessageListenerContainer() {
    DefaultMessageListenerContainer listenerContainer = new DefaultMessageListenerContainer();
    listenerContainer.setConnectionFactory(connectionFactoryProxy());
    listenerContainer.setDestination((Destination) destination().getObject());
    listenerContainer.setMessageListener(messageDispatcher);
    listenerContainer.setSessionTransacted(true);
    listenerContainer.setTransactionManager(jtaTransactionManager());
    return listenerContainer;
}

Пока все работает нормально, сообщение будет отправлено и получено из очереди без каких-либо проблем. Откат сообщений с RuntimeException тоже работает.

Проблема в том, как изменить некоторые фундаментальные настройки, такие как RedeliveryAttempts или RedeliveryInterval из спецификации активации. Я не могу найти решение, чтобы изменить это с помощью Spring только с помощью MDB. Есть ли способ сделать это в консоли администратора Glassfishs или в конфигурации Spring? Пришлось ли мне использовать какую-то другую реализацию или это вообще невозможно?

Надеюсь, кто-нибудь может помочь. Заранее спасибо, Дэнни


person danny    schedule 25.10.2013    source источник


Ответы (1)


Путем проб и ошибок я нашел следующее, которое работает на Glassfish 4.

@Bean
public JmsTemplate jmsTemplate() {
    JmsTemplate jmsTemplate = new JmsTemplate();
    jmsTemplate.setPubSubDomain(true);  //may be necessary if using topic
    jmsTemplate.setDefaultDestinationName("topicname");
    jmsTemplate.setConnectionFactory(connectionFactory());
    return jmsTemplate;
}

@Bean
public ConnectionFactory connectionFactory() {
    try {
        JndiObjectFactoryBean jndiFactory = new JndiObjectFactoryBean();
        jndiFactory.setJndiName("jms/ConnectionFactory");
        jndiFactory.setResourceRef(true);  //adds java:comp/env/ prefix
        jndiFactory.afterPropertiesSet();  //very important, actually causes the object to be loaded

        return (ConnectionFactory) jndiFactory.getObject();

    } catch (IllegalArgumentException | NamingException e) {
        throw new RuntimeException(e);
    }
}
person Jim    schedule 17.07.2014