【问题标题】:Change JMS settings with Glassfish and Spring使用 Glassfish 和 Spring 更改 JMS 设置
【发布时间】:2013-11-04 11:42:25
【问题描述】:

在我们的项目中,我们使用 Glassfish v3.1.2.2,ConnectionFactory 绑定为“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。我找不到任何解决方案来仅使用 MDB 使用 Spring 来更改它。有没有办法在 Glassfishs 管理控制台或 Spring 配置中执行此操作?我必须使用一些不同的实现还是不可能?

希望任何人都可以提供帮助。 提前致谢, 丹尼

【问题讨论】:

    标签: spring glassfish jms spring-jms openmq


    【解决方案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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-07
      • 2011-05-02
      • 2012-08-03
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多