实现生产者P2P&subpub兼容模式

来源:互联网 发布:python爬虫设置代理ip 编辑:程序博客网 时间:2024/06/04 00:49
在《实现应用内分布式事务管理(生产者)》章节其实已经对JmsTemplate进行了重新注册,在源码JmsAutoConfiguration可以看到如下代码设置:
jmsTemplate.setPubSubDomain(this.properties.isPubSubDomain());
其主要设置我们的jmsTemplate是队列还是发布订阅类型消息,isPubSubDomain可以在application.preperties中配置spring.jms.pub-sub-domain,默认其为false即我队列模式。

本章概要:
1、定义两个jmsTemplate,一个队列一个订阅发布类型;
2、定义两个JmsMessagingTemplate,一个队列一个订阅发布类型;
3、分布式事务验证;

定义两个jmsTemplate

package com.shf.activemq.config;import javax.jms.DeliveryMode;import org.springframework.beans.factory.ObjectProvider;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.autoconfigure.jms.JmsProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.jms.core.JmsTemplate;import org.springframework.jms.support.converter.MessageConverter;import org.springframework.jms.support.destination.DestinationResolver;/** * 自定义JmsTemplate,支持事务 * @author song * */@Configurationpublic class JmsTemplateConfiguration {private final JmsProperties properties;private final ObjectProvider<DestinationResolver> destinationResolver;private final ObjectProvider<MessageConverter> messageConverter;public JmsTemplateConfiguration(JmsProperties properties,ObjectProvider<DestinationResolver> destinationResolver,ObjectProvider<MessageConverter> messageConverter) {this.properties = properties;this.destinationResolver = destinationResolver;this.messageConverter = messageConverter;}/** * 配置队列生产者的JmsTemplate * @param connectionFactory * @return */@Bean(name="jmsQueueTemplate")@Primarypublic JmsTemplate jmsQueueTemplate(ConnectionFactory connectionFactory) {//设置创建连接的工厂JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);//设置P2P队列消息类型jmsTemplate.setPubSubDomain(false);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,默认falsejmsTemplate.setExplicitQosEnabled(true);//DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);//默认不开启事务System.out.println("默认是否开启事务:"+jmsTemplate.isSessionTransacted());//如果不启用事务,则会导致XA事务失效;//作为生产者如果需要支持事务,则需要配置SessionTransacted为truejmsTemplate.setSessionTransacted(true);return jmsTemplate;}/** * 配置发布订阅生产者的JmsTemplate * @param connectionFactory * @return */@Bean(name="jmsTopicTemplate")public JmsTemplate jmsTopicTemplate(ConnectionFactory connectionFactory) {//设置创建连接的工厂JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);//设置发布订阅消息类型jmsTemplate.setPubSubDomain(true);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,默认falsejmsTemplate.setExplicitQosEnabled(true);//DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);//默认不开启事务System.out.println("默认是否开启事务:"+jmsTemplate.isSessionTransacted());//如果不启用事务,则会导致XA事务失效;//作为生产者如果需要支持事务,则需要配置SessionTransacted为truejmsTemplate.setSessionTransacted(true);return jmsTemplate;}}
定义两个JmsMessagingTemplate

package com.shf.activemq.config;import javax.jms.Queue;import javax.jms.Topic;import org.apache.activemq.command.ActiveMQQueue;import org.apache.activemq.command.ActiveMQTopic;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.jms.core.JmsMessagingTemplate;import org.springframework.jms.core.JmsTemplate;@Configurationpublic class JmsMessageConfiguration {@Autowired@Qualifier(value="jmsQueueTemplate")private JmsTemplate jmsQueueTemplate;@Autowired@Qualifier(value="jmsTopicTemplate")private JmsTemplate jmsTopicTemplate;/** * 定义点对点队列 * @return */@Beanpublic Queue queue() {return new ActiveMQQueue("my.queue");}/** * 定义一个主题 * @return */@Bean    public Topic topic() {       return new ActiveMQTopic("my.topic");    }/** * 创建处理队列消息模板 * @return */@Bean(name="jmsQueueMessagingTemplate")public JmsMessagingTemplate jmsQueueMessagingTemplate() {return new JmsMessagingTemplate(jmsQueueTemplate);}/** * 创建处理发布订阅消息模板 * @return */@Bean(name="jmsTopicMessagingTemplate")public JmsMessagingTemplate jmsTopicMessagingTemplate() {return new JmsMessagingTemplate(jmsTopicTemplate);}}

分布式事务验证

package com.shf.activemq.producer;import javax.jms.Queue;import javax.jms.Topic;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.jms.core.JmsMessagingTemplate;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;@Servicepublic class SendService {@Autowiredprivate Queue queue;@Autowired@Qualifier(value="jmsQueueMessagingTemplate")private JmsMessagingTemplate jmsQueueMessagingTemplate;@Autowiredprivate Topic topic;@Autowired@Qualifier(value="jmsTopicMessagingTemplate")private JmsMessagingTemplate jmsTopicMessagingTemplate;@Transactional(propagation=Propagation.REQUIRED,rollbackFor=ArithmeticException.class)public void send(){//发送队列消息jmsQueueMessagingTemplate.convertAndSend(this.queue, "生产者辛苦生产的点对点消息成果");System.out.println("生产者:辛苦生产的点对点消息成果");//发送发布订阅消息jmsTopicMessagingTemplate.convertAndSend(this.topic, "生产者辛苦生产的发布订阅消息成果");System.out.println("生产者:辛苦生产的发布订阅消息成果");System.out.println(1/0);}}

总结:通过单元测试和定时任务均进行了测试验证,队列消息&发布订阅消息&MySQL能够同时很好的实现分布式事务的管理。





0 0
原创粉丝点击