项目一:在线下单(补充) activeMQ使用(重点) 重构客户注册功能,发短信功能分离
1 课程计划
1、在线下单(补充)
2、activeMQ使用(重点)
n 简介和安装
n activeMQ入门案例
n spring整合activeMQ应用
3、重构客户注册功能,发短信功能分离
n bos_fore项目客户注册作为短信消息生产者
n 创建bos_sms短信平台消费消息并发送短信
1 在线下单
1.1 策略二:根据客户取件地址解析完成自动分单


//查询寄件人所在区域,查询该区域下分区记录
Set<SubArea> subareas = sendArea.getSubareas();
for (SubArea subArea : subareas) {
//确定寄件人详细地址所属分区
String sendAddress = order.getSendAddress(); //寄件人详细地址
if(sendAddress.contains(subArea.getKeyWords())||sendAddress.contains(subArea.getAssistKeyWords())){
//分区-定区:多对一
FixedArea fixedArea = subArea.getFixedArea();
if(fixedArea!=null){
//定区-快递员:多对多
Set<Courier> couriers = fixedArea.getCouriers();
if(couriers.isEmpty()){
//TODO 简化操作 判断上班时间 取件任务数量
for (Courier courier : couriers) {
//完成自动分单-1、产生快递员工单 2、发送取件短信
WorkBill workBill = new WorkBill();
workBill.setAttachbilltimes(0);//追单次数
workBill.setBuildtime(new Date());//工单时间
workBill.setCourier(courier); //工单关联快递员
workBill.setOrder(order); //工单关联订单
workBill.setPickstate("待取件");
workBill.setRemark(order.getRemark());
workBill.setType("新单");
workBillDao.save(workBill);
Map<String, Object> map = new HashMap<>();
map.put("customerAddress", order.getSendAddress());
map.put("customerName", order.getSendName());
map.put("customerTelephone", order.getSendMobile());
map.put("customerRemark", order.getSendMobileMsg());
//发送短信
Boolean flag = AliSmsUtil.sendMessage(courier.getTelephone(), "SMS_121136520", map);
workBill.setSmsNumber(flag.toString());
//自动分单
order.setOrderType("自动分单");
order.setStatus("待取件");
order.setCourier(courier); //订单关联快递员
return;
}
}
}
}
}
//人工分单
order.setOrderType("人工分单");
1.2 测试
将资料中分区数据通过POI将数据导入到分区表中。



2 Apache activeMQ消息队列(重点)
Message Queue:消息队列。
1.1 简介和安装

JMS:Jave Message Service java消息服务
ActiveMQ:实现JMS规范
消息队列中间件是分布式系统中的重要组件,主要解决应用耦合,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性的架构

使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,MetaMQ等
官网:http://activemq.apache.org/
注意:jdk的安装目录不要有空格!!!!!!!!!!
进入bin目录启动服务。
http://localhost:8161/admin/queues.jsp
http端口8161:web页面访问端口
Tcp端口连接服务端口:61616

1.1.1 配置生产者

第一步:创建maven工程,导入spring和activeMQ的坐标
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>4.2</version>
</dependency>
</dependencies>
第二步:提供spring配置文件(配置生产者相关)引入amq,jms名称空间
xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:jms="http://www.springframework.org/schema/jms"
http://www.springframework.org/schema/jms
http://www.springframework.org/schema/jms/spring-jms.xsd
http://activemq.apache.org/schema/core
http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd
配置连接工厂(缓存session工厂),配置模板对象
<!-- 将发送消息对象创建 -->
<context:component-scan base-package="cn.itcast"></context:component-scan>
<!-- 配置连接工厂:避免报错名称空间问题:通过此配置产生ActiveMQConnectionFactory -->
<!-- <amq:connectionFactory id="amqConnectionFactory"
userName="admin"
password="admin"
brokerURL="tcp://localhost:61616">
</amq:connectionFactory> -->
<!-- 通过配置bean标签将ActiveMQConnectionFactory对象产生 -->
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- 通过代码new,通过有参构造注入 -->
<constructor-arg index="0" value="admin"></constructor-arg>
<constructor-arg index="1" value="admin"></constructor-arg>
<constructor-arg index="2" value="tcp://localhost:61616"></constructor-arg>
</bean>
<!-- 为了提交效率:提供缓存Session的工厂 -->
<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- 注入连接工厂 -->
<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
<!-- 设置缓存session个数 -->
<property name="sessionCacheSize" value="100"></property>
</bean>
<!-- 配置spring整合activeMQ:提供模板对象:可以发送队列形式(点对点)消息,也可以发送发布订阅形式 -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 注入连接工厂 -->
<property name="connectionFactory" ref="cachingConnectionFactory"></property>
<!-- 指定消息类型:默认队列形式 -->
<property name="pubSubDomain" value="false"></property>
</bean>
<bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="cachingConnectionFactory"></property>
<!-- 指定消息类型:默认队列形式 -->
<property name="pubSubDomain" value="true"></property>
</bean>
第四步:编写单元测试方法,在类中注入模板对象JmsTemplate。通过此对象发送消息到队列

1.1.2 配置消费者
将生产者工程拷贝一份:

第一步:开发一个类,监听消息队列

第二步:配置spring 配置文件,注册监听器
<!-- 将发送消息对象创建 -->
<context:component-scan base-package="cn.itcast"></context:component-scan>
<!-- 配置连接工厂:避免报错名称空间问题:通过此配置产生ActiveMQConnectionFactory -->
<!-- <amq:connectionFactory id="amqConnectionFactory"
userName="admin"
password="admin"
brokerURL="tcp://localhost:61616">
</amq:connectionFactory> -->
<!-- 通过配置bean标签将ActiveMQConnectionFactory对象产生 -->
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- 通过代码new,通过有参构造注入 -->
<constructor-arg index="0" value="admin"></constructor-arg>
<constructor-arg index="1" value="admin"></constructor-arg>
<constructor-arg index="2" value="tcp://localhost:61616"></constructor-arg>
</bean>
<!-- 为了提交效率:提供缓存Session的工程 -->
<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- 注入连接工厂 -->
<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
<!-- 设置缓存session个数 -->
<property name="sessionCacheSize" value="100"></property>
</bean>
<!-- 配置消费者监听器 -->
<!-- 配置消费者 start:采用监听器方式,监听队列中消息
acknowledge:自动应答,消费完消息通知生产者
destination-type:消息类型:topic/queue
container-class:监听消息listener对象
-->
<jms:listener-container
acknowledge="auto" destination-type="queue" connection-factory="cachingConnectionFactory">
<!-- 监听哪个队列 -->
<jms:listener destination="spring_queue" ref="jmsMessageListener"/>
</jms:listener-container>
测试代码:

1.1 mq总结

2 重构客户注册功能,发短信功能分离
1.1 bos_fore项目客户注册作为短信消息生产者

第一步:导入activeMQ相关的坐标:注意添加xBean-spring依赖在common_parent项目中
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>4.2</version>
</dependency>

第二步:在前台系统的spring配置文件中配置activeMQ相关的对象
<!-- 配置连接工厂 -->
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<constructor-arg index="0" value="admin"></constructor-arg>
<constructor-arg index="1" value="admin"></constructor-arg>
<constructor-arg index="2" value="tcp://localhost:61616"></constructor-arg>
</bean>
<!-- 配置spring提供缓存连接工厂:提高效率 -->
<bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
<property name="sessionCacheSize" value="100"></property>
</bean>
<!-- 配置生产者 start spring 提供模板对象,通过模板对象向activeMQ服务器写入消息(1、队列形式queue 2、主题模式topic) -->
<bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"></property>
<!-- 指定写入消息模式 -->
<property name="pubSubDomain" value="false"></property>
</bean>
第三步:使用注解方式将模板对象注入给Action,直接发送消息


1.2 创建bos_sms短信系统消费消息并发送短信
发短信业务逻辑放在短信系统中。

第一步:创建工程

第二步:spring环境配置web.xml,注册spring的监听器

第三步:提供spring配置文件,配置activeMQ的连接工厂
<!-- 将发送消息对象创建 -->
<context:component-scan base-package="cn.itcast"></context:component-scan>
<!-- 配置连接工厂:避免报错名称空间问题:通过此配置产生ActiveMQConnectionFactory -->
<!-- <amq:connectionFactory id="amqConnectionFactory"
userName="admin"
password="admin"
brokerURL="tcp://localhost:61616">
</amq:connectionFactory> -->
<!-- 通过配置bean标签将ActiveMQConnectionFactory对象产生 -->
<bean id="amqConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<!-- 通过代码new,通过有参构造注入 -->
<constructor-arg index="0" value="admin"></constructor-arg>
<constructor-arg index="1" value="admin"></constructor-arg>
<constructor-arg index="2" value="tcp://localhost:61616"></constructor-arg>
</bean>
<!-- 为了提交效率:提供缓存Session的工程 -->
<bean id="cachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
<!-- 注入连接工厂 -->
<property name="targetConnectionFactory" ref="amqConnectionFactory"></property>
<!-- 设置缓存session个数 -->
<property name="sessionCacheSize" value="10"></property>
</bean>
<!-- 配置消费者监听器 -->
<!-- 配置消费者 start:采用监听器方式,监听队列中消息
acknowledge:自动应答,消费完消息通知生产者
destination-type:消息类型:topic/queue
container-class:监听消息listener对象
-->
<jms:listener-container
acknowledge="auto" destination-type="queue" connection-factory="cachingConnectionFactory">
<!-- 监听哪个队列 -->
<jms:listener destination="sms_message" ref=" smsListener"/>
</jms:listener-container>
第四步:开发一个监听器类,用于监听队列中的消息

第五步:在spring配置文件中注册监听器

项目一:在线下单(补充) activeMQ使用(重点) 重构客户注册功能,发短信功能分离的更多相关文章
- 客户注册功能,发短信功能分离 通过ActiveMQ实现
客户注册功能,发短信功能分离 通过ActiveMQ 配置链接工厂, 配置session缓存工厂(引入链接工厂) 2.配置模板对象JmsTemplate 引入缓存工厂 指定消息模式(队列,发布和订 ...
- 重构客户注册-基于ActiveMQ实现短信验证码生产者
重构目标:将bos_fore项目中的CustomerAction作为短信消息生产者,将消息发给ActiveMQ,创建一个单独的SMS项目,作为短信息的消费者,从ActiveMQ获取短信消息,调用第三方 ...
- 项目一:第九天 1、前台客户登录 2、Jquery citypicker省市区三级联动插件 4、业务受理(在线下单)
1. 前台客户登录 2. Jquery citypicker省市区三级联动插件 3. 百度地图介绍 4. 业务受理(在线下单) 1 实现前台系统登录功能 1.1 Md5加密 admin(明文)---- ...
- Android短信过滤项目中的观察者模式
观察者模式: 观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 观察者模式提供了一种对象设计, 让主题和观察者之间松耦合.主题只知道观察者实现了某个接 ...
- 【SSH网上商城项目实战26】完成订单支付后的短信发送功能
转自: https://blog.csdn.net/eson_15/article/details/51475431 上一节我们使用了Java mail完成了给买家发送邮件的功能,还遗留一个功能,就 ...
- 经管资源库项目总结----在线预览office文件的实现与总结
依旧是这个经管的项目.在线预览作为资源和文档管理系统的一个很酷的并且是如此重要的功能,是必须要实现的.然后百度一下office在线预览,看起来so eazy啊,各种博客各种demo,一下子就做出效果来 ...
- JavaWeb项目:在线评测系统
此项目为本人的Java大作业. 项目文件和相关资源已上传到本人的GitHub 一.项目概况 1.1设计内容 一个在线评测系统,分用户和管理员两种身份.用户能够通过注册登录,参加比赛,最后实时得到比赛结 ...
- 常用快递API及快递在线下单API分享
1.常用快递API 支持顺丰.EMS.申通.圆通.韵达.汇通.中通.天天.德邦.全峰等主流快递公司. 文档地址:https://www.juhe.cn/docs/api/id/43 1.1常用快递查询 ...
- flowable+tomcat部署flowable项目,在线画流程图
参考: flowable+tomcat部署flowable项目,在线画流程图
随机推荐
- java之 Timer 类的简单使用案例
(如果您看到本文章务必看结尾!) 第一次用Timer类,记录一下个人理解. 场景:做苹果内容结果验证时,根据苹果支付凭证去苹果官方服务器验证是否支付成功.但因为苹果服务器比较慢,第 ...
- Leetcode 904. Fruit Into Baskets
sliding window(滑动窗口)算法 class Solution(object): def totalFruit(self, tree): """ :type ...
- 【JVM】java的内存泄露问题
一.GC可回收的对象 二:什么是内存泄露--->Java的一个最显著的优势是内存管理.你只需要简单的创建对象而不需要负责释放空间,因为Java的垃圾回收器会负责内存的回收.然而,情况并不是这样简 ...
- vmem驱动设备
vmem是内存多字符设备.包含vfs的open.read.write.ioctl.poll.fasync和release函数,device文件的读写. virtual_mem.c #include & ...
- Tomcat设计模式分析(转) 2
Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析 这个分为两个部分的系列文章研究了 Apache Tomcat 服务器的系统架构以及其运用的很多经典设计模式.第 1 部分 分析了 Tom ...
- 横向排列两个多个div盒子的方法(CSS浮动清除float-clear/inline)/办法
最近在做一个div css切割,昨晚发现了长期以来一直无记录下来的问题!关于兼容IE跟FF的float属性.趁现在还清醒赶紧记下笔记先:一.并排在一行的两个div样式有这种情况:ie或者ff下对于子d ...
- GMchess Linux下的中国象棋游戏
gmchess,一款Linux下的中国象棋程序
- div+css制作带箭头提示框效果图(原创文章)
一直都在看站友们的作品,今天也来给大家分享一个小的效果,第一次发还有点小紧张呢,语言表达能力不是很好,还请见谅…^ 先来个简单点的吧,上效果图 刚开始在网上看到效果图的时候感觉好神奇,当我试着写出来的 ...
- Oracle之into
), NVL() INTO SALE_ID, STORE_ID FROM SALEFROMSTORE WHERE ORDERID = IN_ORDER_ID; 这里要注意,into的时候是一个sele ...
- HTML5通信
跨文档消息传输 HTML5中提供了在网页文档之间互相接收与发送信息的功能.使用这个功能只要获取到网页所在窗口对象的实例,无论是否同源都可以实现跨域通信.经常用于不同frame之间的通信. 当我们想要接 ...