@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;
/**
* 定義點對點隊列
* @return
*/
@Bean
public Queue queue() {
return new ActiveMQQueue(queueName);
}
/**
* 定義一個主題
* @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;
}
/**
* 配置隊列生產者的JmsTemplate
* @return JmsTemplate
*/
@Bean(name="jmsQueueTemplate")
public JmsTemplate jmsQueueTemplate() {
//設置創建連接的工廠
//JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
//優化連接工廠,這里應用緩存池 連接工廠就即可
JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
//設置默認消費topic
//jmsTemplate.setDefaultDestination(topic());
//設置P2P隊列消息類型
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 的開關,要生效,必須配置為true,默認false
jmsTemplate.setExplicitQosEnabled(true);
//DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久
//定義持久化后節點掛掉以后,重啟可以繼續消費.
jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
//默認不開啟事務
System.out.println("默認是否開啟事務:"+jmsTemplate.isSessionTransacted());
//如果不啟用事務,則會導致XA事務失效;
//作為生產者如果需要支持事務,則需要配置SessionTransacted為true
//jmsTemplate.setSessionTransacted(true);
//消息的應答方式,需要手動確認,此時SessionTransacted必須被設置為false,且為Session.CLIENT_ACKNOWLEDGE模式
//Session.AUTO_ACKNOWLEDGE 消息自動簽收
//Session.CLIENT_ACKNOWLEDGE 客戶端調用acknowledge方法手動簽收
//Session.DUPS_OK_ACKNOWLEDGE 不必必須簽收,消息可能會重復發送
jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return jmsTemplate;
}
/**
* 配置發布訂閱生產者的JmsTemplate
* @return JmsTemplate
*/
@Bean(name="jmsTopicTemplate")
public JmsTemplate jmsTopicTemplate() {
//設置創建連接的工廠
//JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
//優化連接工廠,這里應用緩存池 連接工廠就即可
JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
//設置默認消費topic
//jmsTemplate.setDefaultDestination(topic());
//設置發布訂閱消息類型
jmsTemplate.setPubSubDomain(isPubSubDomain);
//deliveryMode, priority, timeToLive 的開關,要生效,必須配置為true,默認false
jmsTemplate.setExplicitQosEnabled(true);
//DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久
jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);
//默認不開啟事務
System.out.println("是否開啟事務"+jmsTemplate.isSessionTransacted());
//如果session帶有事務,并且事務成功提交,則消息被自動簽收。如果事務回滾,則消息會被再次傳送。
//jmsTemplate.setSessionTransacted(true);
//不帶事務的session的簽收方式,取決于session的配置。
//默認消息確認方式為1,即AUTO_ACKNOWLEDGE
System.out.println("是否消息確認方式"+jmsTemplate.getSessionAcknowledgeMode());
//消息的應答方式,需要手動確認,此時SessionTransacted必須被設置為false,且為Session.CLIENT_ACKNOWLEDGE模式
//Session.AUTO_ACKNOWLEDGE 消息自動簽收
//Session.CLIENT_ACKNOWLEDGE 客戶端調用acknowledge方法手動簽收
//Session.DUPS_OK_ACKNOWLEDGE 不必必須簽收,消息可能會重復發送
jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return jmsTemplate;
}
}