@Configuration
@DependsOn(value="cachingConnectionFactory")
public class JmsTemplateConfiguration {
@Value("${wechat.sendmessage.queue}")
private String queueName;
@Value("${wechat.sendmessage.topic}")
private String topicName;
@Value("${spring.jms.pub-sub-domain}")
private boolean isPubSubDomain;
/**
* 定義點(diǎn)對(duì)點(diǎn)隊(duì)列
* @return
*/
@Bean
public Queue queue() {
return new ActiveMQQueue(queueName);
}
/**
* 定義一個(gè)主題
* @return
*/
@Bean
public Topic topic() {
return new ActiveMQTopic(topicName);
}
private final ObjectProvider<DestinationResolver> destinationResolver;
private final ObjectProvider<MessageConverter> messageConverter;
private final CachingConnectionFactory cachingConnectionFactory;
@Autowired
public JmsTemplateConfiguration(ObjectProvider<DestinationResolver> destinationResolver,
ObjectProvider<MessageConverter> messageConverter,
CachingConnectionFactory cachingConnectionFactory) {
this.destinationResolver = destinationResolver;
this.messageConverter = messageConverter;
this.cachingConnectionFactory = cachingConnectionFactory;
}
/**
* 配置隊(duì)列生產(chǎn)者的JmsTemplate
* @return JmsTemplate
*/
@Bean(name="jmsQueueTemplate")
public JmsTemplate jmsQueueTemplate() {
//設(shè)置創(chuàng)建連接的工廠
//JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
//優(yōu)化連接工廠,這里應(yīng)用緩存池 連接工廠就即可
JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
//設(shè)置默認(rèn)消費(fèi)topic
//jmsTemplate.setDefaultDestination(topic());
//設(shè)置P2P隊(duì)列消息類型
jmsTemplate.setPubSubDomain(isPubSubDomain);
DestinationResolver destinationResolver = (DestinationResolver) this.destinationResolver.getIfUnique();
if (destinationResolver != null) {
jmsTemplate.setDestinationResolver(destinationResolver);
}
MessageConverter messageConverter = (MessageConverter) this.messageConverter.getIfUnique();
if (messageConverter != null) {
jmsTemplate.setMessageConverter(messageConverter);
}
//deliveryMode, priority, timeToLive 的開關(guān),要生效,必須配置為true,默認(rèn)false
jmsTemplate.setExplicitQosEnabled(true);
//DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久
//定義持久化后節(jié)點(diǎn)掛掉以后,重啟可以繼續(xù)消費(fèi).
jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
//默認(rèn)不開啟事務(wù)
System.out.println("默認(rèn)是否開啟事務(wù):"+jmsTemplate.isSessionTransacted());
//如果不啟用事務(wù),則會(huì)導(dǎo)致XA事務(wù)失效;
//作為生產(chǎn)者如果需要支持事務(wù),則需要配置SessionTransacted為true
//jmsTemplate.setSessionTransacted(true);
//消息的應(yīng)答方式,需要手動(dòng)確認(rèn),此時(shí)SessionTransacted必須被設(shè)置為false,且為Session.CLIENT_ACKNOWLEDGE模式
//Session.AUTO_ACKNOWLEDGE 消息自動(dòng)簽收
//Session.CLIENT_ACKNOWLEDGE 客戶端調(diào)用acknowledge方法手動(dòng)簽收
//Session.DUPS_OK_ACKNOWLEDGE 不必必須簽收,消息可能會(huì)重復(fù)發(fā)送
jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return jmsTemplate;
}
/**
* 配置發(fā)布訂閱生產(chǎn)者的JmsTemplate
* @return JmsTemplate
*/
@Bean(name="jmsTopicTemplate")
public JmsTemplate jmsTopicTemplate() {
//設(shè)置創(chuàng)建連接的工廠
//JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
//優(yōu)化連接工廠,這里應(yīng)用緩存池 連接工廠就即可
JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
//設(shè)置默認(rèn)消費(fèi)topic
//jmsTemplate.setDefaultDestination(topic());
//設(shè)置發(fā)布訂閱消息類型
jmsTemplate.setPubSubDomain(isPubSubDomain);
//deliveryMode, priority, timeToLive 的開關(guān),要生效,必須配置為true,默認(rèn)false
jmsTemplate.setExplicitQosEnabled(true);
//DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久
jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
//默認(rèn)不開啟事務(wù)
System.out.println("是否開啟事務(wù)"+jmsTemplate.isSessionTransacted());
//如果session帶有事務(wù),并且事務(wù)成功提交,則消息被自動(dòng)簽收。如果事務(wù)回滾,則消息會(huì)被再次傳送。
//jmsTemplate.setSessionTransacted(true);
//不帶事務(wù)的session的簽收方式,取決于session的配置。
//默認(rèn)消息確認(rèn)方式為1,即AUTO_ACKNOWLEDGE
System.out.println("是否消息確認(rèn)方式"+jmsTemplate.getSessionAcknowledgeMode());
//消息的應(yīng)答方式,需要手動(dòng)確認(rèn),此時(shí)SessionTransacted必須被設(shè)置為false,且為Session.CLIENT_ACKNOWLEDGE模式
//Session.AUTO_ACKNOWLEDGE 消息自動(dòng)簽收
//Session.CLIENT_ACKNOWLEDGE 客戶端調(diào)用acknowledge方法手動(dòng)簽收
//Session.DUPS_OK_ACKNOWLEDGE 不必必須簽收,消息可能會(huì)重復(fù)發(fā)送
jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return jmsTemplate;
}
}