在我们的项目中,我们使用Glassfish v3.1.2.2,ConnectionFactory绑定为“jms / ConnectionFactory”,Queue绑定为“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配置中执行此操作?我是否必须使用一些不同的实现,还是不可能实现?
希望有人可以提供帮助。 提前致谢, 丹尼
答案 0 :(得分: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);
}
}