zoukankan      html  css  js  c++  java
  • 项目一:在线下单(补充) activeMQ使用(重点) 重构客户注册功能,发短信功能分离

    课程计划

    1、在线下单(补充)

    2activeMQ使用(重点)

    n 简介和安装

    n activeMQ入门案例

    n spring整合activeMQ应用

    3、重构客户注册功能,发短信功能分离

    n bos_fore项目客户注册作为短信消息生产者

    创建bos_sms短信平台消费消息并发送短信

     

     

     

     

    在线下单

     

    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将数据导入到分区表中。

     

     

     

     

     

     

     

    Apache activeMQ消息队列(重点

    Message Queue:消息队列。

    1.1 简介和安装

     

    JMS:Jave Message Service   java消息服务

    ActiveMQ:实现JMS规范

     

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

     

    使用较多的消息队列有ActiveMQRabbitMQKafkaMetaMQ

    官网:http://activemq.apache.org/

     

     

    注意:jdk的安装目录不要有空格!!!!!!!!!!

    进入bin目录启动服务。

    http://localhost:8161/admin/queues.jsp

    http端口8161web页面访问端口

    Tcp端口连接服务端口:61616

     

    1.1.1 配置生产者

     

    第一步创建maven工程导入springactiveMQ的坐标

    <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总结

     

    重构客户注册功能,发短信功能分离

    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配置文件中注册监听器

     

  • 相关阅读:
    异常问题处理记录(转载篇)
    linux服务器出现大量连接:sshd: root@notty
    第4章 Python运算符
    第2章 python基础知识
    第1章 python环境搭建
    Tomcat漏洞升级
    第3章 数据类型、运算符和表达式
    第2章 C语言基础知识
    第1章 概述
    第1章 企业管理概论
  • 原文地址:https://www.cnblogs.com/shan1393/p/9250683.html
Copyright © 2011-2022 走看看