实现生产者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
- 实现生产者P2P&subpub兼容模式
- 生产者模式实现总结
- 生产者消费者模式实现
- 生产者消费者模式实现
- 实现生产者-消费者模式
- 生产者消费者模式实现
- LinkedBlockingQueue实现生产者-消费者模式
- Java生产者消费者模式实现
- 生产者消费者模式Java实现
- NSCondition实现生产者消费者模式
- 如何实现生产者消费者模式
- 生产者消费者模式Java实现
- Java实现生产者/消费者模式
- java生产者消费者模式实现
- java实现生产者消费者模式
- BlockingQueue实现生产者、消费者模式
- BlockingQueue实现生产者消费者模式
- 基于BlockingQueue的生产者消费者模式实现
- **Sublime Text 安装配置及使用笔记**
- AsyncTask源码分析
- ActiveMQ事务、异步发送、消息确认概念
- JQuery.extend()详解
- WebService CXF学习:整合Spring框架
- 实现生产者P2P&subpub兼容模式
- VMware Fusion Mac 小技巧 创建共享文件夹 Mac与Win文件
- CodeForces - 701C They Are Everywhere (尺取法)
- [Hadoop]MapReduce中的Partitioner与Combiner
- 单例模式
- linux常用指令整理
- 大写C语言注释
- 集合框架_TreeSet存储自定义对象并遍历练习1
- C#延时程序