欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

logistics-6-decidedZone management

发布时间:2025/5/22 编程问答 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 logistics-6-decidedZone management 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘Python工程师标准>>>

业务:
1.decidedZone management_添加decidedZone
2.decidedZone management_定区数据分页多条件查询
3.decidedZone关联客户功能实现

技术点:
远程访问技术:webservice、hessian

decidedZone:并非实际存在,只是业务上存在。一个派送人员可以管理多个分区,这多个分区就组成一个定区。
客户会关联定区,为业务受理、自动分单功能服务。

05:【Hessian远程访问技术入门】

该物流系统需要与CRM系统进行通讯,所以要用到远程访问技术

常用的远程访问技术:
█RMI
   RMI是 Java 首选远程调用协议,非常高效稳定,特别是在数据结构复杂,数据量大的情况下,与其他通讯协议的差距尤为明显。但不能跨语言

█HttpInvoker
   HttpInvoker使用 java 的序列化技术传输对象,与 RMI 在本质上是一致的。从效率上看,两者也相差无几, HttpInvoker 与 RMI 的传输时间基本持平。

█Hessian
   Hessian在传输少量对象时,比RMI 还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较 RMI 要慢 20% 左右。但这只是在数据量特别大,数据结构很复杂的情况下才能体现出来,中等或少量数据时,Hessian并不比RMI慢。 Hessian 的好处是精简高效,可以跨语言使用,而且协议规范公开。 

█Burlap
   采用 xml 格式传输。仅在传输 条数据时速度尚可,通常情况下,它的耗时是 RMI 的 倍。

█ Web Service
   效率低下是众所周知的,平均来看, Web Service 的通讯耗时是 RMI 的 10 倍。 
webService参考博客:点击打开链接

通讯效率测试结果:

     RMI > Httpinvoker >= Hessian >> Burlap >> Web service

这里使用Hessian实现。
理由:1.可以跨平台
            2.效率比WebService高很多


hessian官网:点击打开链接

Hessian开发步骤:

1.导入hessian.jar包
2.新建Dynamic web project工程

  注意:一定要指定target runtime,如果不指定会没有servlet API支持。
  2.5-----javaEE5(Apache Tomcat v6.0)  
  3.0-----javaEE6(Apache Tomcat v7.0)
3.编写hessian的服务端(接口和实现)
首先,提供服务接口

/*** 业务接口* * @author lp* */ public interface HelloService {/*** 业务方法* * @param name* @return*/public String sayHello(String name); } 然后,提供服务接口的实现类
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "hello," + name;} } 最后,将接口发布为Hessian web 服务
<servlet><servlet-name>hello</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class><init-param><!-- Hessian服务 实现类 --><param-name>home-class</param-name><param-value>cn.itcast.service.impl.HelloServiceImpl</param-value></init-param><init-param><!-- Hessian 服务业务接口 --><param-name>home-api</param-name><param-value>cn.itcast.service.HelloService</param-value></init-param></servlet><servlet-mapping><servlet-name>hello</servlet-name><url-pattern>/hello</url-pattern> </servlet-mapping>

通过浏览器即可访问是否发布成功


4.编写hessian客户端
Hessian 客户端如果是相同语言开发,最简单方式,直接将服务器接口复制到客户端 。
如果不是相同语言, 客户端获得一个Map对象 

//使用 HessianProxyFactory 对接口创建代理 就可以了 HessianProxyFactory hessianProxyFactory = new HessianProxyFactory(); HelloService proxy = (HelloService) hessianProxyFactory.create(HelloService.class, "http://localhost:9090/hessianserver/hello"); System.out.println(proxy.sayHello("kitty!"));

06:【编写CRM提供CustomerService业务接口】

( CRM写的有点乱,也不完整,待完善) 说明:
1.使用ssh框架开发的

2.使用自动建表。hibernate.cfg.xml文件配置如下:

<hibernate-configuration> <!-- JDBC基本连接参数 --><session-factory> <!-- 理解为连接池 --><property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property><property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property><property name="hibernate.connection.username">bj0825</property><property name="hibernate.connection.password">bj0825</property><!-- 配置方言 --><property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property><!-- 常见其它配置 --><property name="hibernate.show_sql">true</property> <!-- 控制台上打印SQL --><property name="hibernate.format_sql">true</property> <!-- 控制台输出时,对SQL语句格式化 --><!-- 测试环境 create/ create-drop 正式环境 update validate --><property name="hibernate.hbm2ddl.auto">update</property> <!-- 自动建表 --><property name="hibernate.connection.autocommit">true</property><!-- 使用c3p0连接池 --> <!-- <property name="hibernate.connection.provider_class"> --> <!-- org.hibernate.connection.C3P0ConnectionProvider --> <!-- </property> --><!-- 在核心配置文件中 引用 mapping 映射文件 --><mapping class="cn.itcast.crm.domain.Customer"/> </session-factory> </hibernate-configuration>3. 使用注解方式开发,不用写.hbm文件

4.封装了sessionFactoryUtils工具类,直接运行其中的main方法就进行建表了。
public class HibernateUtils {private static Configuration configuration;private static SessionFactory sessionFactory;static {configuration = new Configuration().configure();sessionFactory = configuration.buildSessionFactory();}public static Session openSession() {return sessionFactory.openSession();}public static void main(String[] args) {openSession();} }

CRM系统的实现
这里假设远程的CRM系统使用ssh实现。

CRM导入了一个javassist包:用来给hibernate做代理用(??????)

<dependency><groupId>javassist</groupId><artifactId>javassist</artifactId><version>3.11.0.GA</version> </dependency>


注意:schema和catalog的含义。

calatog表示的是数据库,针对mysql(mysql的表在数据库下),schema的是名称空间,针对oracle(oracle的表在命名空间下)。
参考:oracle的表空间概念
如果在这里不指定schema,则会在默认空间建表,会报如下的错误提示。

所以应该指定schema。


假设CRM系统的功能已经都实现。
现在要做的仅仅是提供供外部访问的接口。( 疑问:具体开发中到底是开发过程中就已经将接口提供好,还是最后再单独考虑接口问题?)
具体的步骤:
1.提供接口

在CRM系统中,提供一个service接口。
public class CustomerServiceImpl implements CustomerService {public List<Customer> findNoAssociationCustomers() {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();List<Customer> list = session.createQuery("from Customer where decidedZoneId is null").list();transaction.commit();session.close();return list;}public List<Customer> findHasAssociationCustomers(String decidedZoneId) {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();List<Customer> list = session.createQuery("from Customer where decidedZoneId = ?").setParameter(0, decidedZoneId).list();transaction.commit();session.close();return list;}public void assignCustomersToDecidedZone(String[] customerIds, String decidedZoneId) {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();if (customerIds != null) {for (String id : customerIds) {Customer customer = (Customer) session.get(Customer.class, id);customer.setDecidedZoneId(decidedZoneId);}}transaction.commit();session.close();} } 2.提供接口的实现类。
public class CustomerServiceImpl implements CustomerService {public List<Customer> findNoAssociationCustomers() {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();List<Customer> list = session.createQuery("from Customer where decidedZoneId is null").list();transaction.commit();session.close();return list;}public List<Customer> findHasAssociationCustomers(String decidedZoneId) {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();List<Customer> list = session.createQuery("from Customer where decidedZoneId = ?").setParameter(0, decidedZoneId).list();transaction.commit();session.close();return list;}public void assignCustomersToDecidedZone(String[] customerIds, String decidedZoneId) {Session session = HibernateUtils.openSession();Transaction transaction = session.beginTransaction();if (customerIds != null) {for (String id : customerIds) {Customer customer = (Customer) session.get(Customer.class, id);customer.setDecidedZoneId(decidedZoneId);}}transaction.commit();session.close();} } 3.发布为hessian  服务。
在web.xml中配置servlet,发布服务。
<servlet><servlet-name>customerService</servlet-name><servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class><init-param><!-- Hessian服务 实现类 --><param-name>home-class</param-name><param-value>cn.itcast.crm.service.impl.CustomerServiceImpl</param-value></init-param><init-param><!-- Hessian 服务业务接口 --><param-name>home-api</param-name><param-value>cn.itcast.crm.service.CustomerService</param-value></init-param></servlet><servlet-mapping><servlet-name>customerService</servlet-name><url-pattern>/customerService</url-pattern></servlet-mapping>这样,我们就已经发布好了。接下来就可以运行CRM系统了。
我们同样使用maven的tomcat插件来启动。
使用命令:tomcat:run

注意:CRM和物流系统都使用tomcat:run启动,是否会端口冲突呢?
当然不会,因为我们配置的CRM启动使用的是9090端口。而物流系统使用的是tomcat的80端口。

最后,测试一下服务是否发布成功。

07:【编写BOS客户端基于junit远程接口调试】

对方写一个接口,我们写客户端调用时,先不写测试程序将系统调通,再进行开发,这样避免直接使用时出现问题。

注意: 接口基于Hessian 传输对象,必须实现Serializable 接口,以实现网络传输。
测试之前先检测一下是否遗忘了这一点。 


客户端调用服务接口的方法:
最简单的做法就是直接将服务接口拷贝到客户端。
除了拷贝CustomerService,还要拷贝它所依赖的Customer实体类。( 注意:这里并没有拷贝服务实现类)

同时拷贝以上两个,才能保持一致,不一致的话,会将对象解析为一个map( ?不太懂?)

然后,在客户端可以使用  HessianProxyFactory  对接口创建代理。(见官网:点击打开链接)
当然我们通常会 使用spring整合hessian。
参考spring的specification(part IV:integration部分,chapter 17)
参考本地文档:spring jar包的docs文件夹下的pdf
参考在线文档:
见官网: 点击打开链接

applicationContext.xml 配置hessian接口代理 客户端

<!-- 配置 Hessian 客户端 --> <bean id="customerService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"><property name="serviceUrl" value="http://localhost:9090/mavencrm/customerService"/><property name="serviceInterface" value="cn.itcast.crm.service.CustomerService" /> </bean>
接下来,进行接口调试。

测试代码
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class CustomerServiceTest {@Autowiredprivate CustomerService customerService;@Testpublic void testFindNoAssociationCustomers() {List<Customer> customers = customerService.findNoAssociationCustomers();System.out.println(customers);}@Testpublic void testFindHasAssociationCustomers() {List<Customer> customers = customerService.findHasAssociationCustomers("DQ001");System.out.println(customers);}@Testpublic void testAssignCustomersToDecidedZone() {customerService.assignCustomersToDecidedZone(new String[] { "1" }, "DQ002");} }测试结果
1.测试 testFindNoAssociationCustomers()
在数据库中手动插入几条模拟数据

控制台打印结果:
[Customer [id=2, name=李四, telephone=23456, address=北京朝阳, decidedZoneId=null]]
说明测试通过

2.测试testFindHasAssociationCustomers()
插入一条有定区的模拟数据(即定区已经关联了客户)

控制台打印结果:
[Customer [id=3, name=王五, telephone=55555, address=上海浦东, decidedZoneId=DQ001]]
说明测试通过。

3.测试testAssignCustomersToDecidedZone()
测试的是:对未关联定区的张三用户进行关联定区DQ002.
测试结果:关联成功

说明测试通过。

以上三个方法都测试成功,说明接口已经调试通过。
接下来就可以实现物流系统的定区关联客户功能了。

08:【定区关联客户功能实现】

关联客户按钮响应事件
选中第一行数据,点击关联客户,则出现关联客户窗口

左侧列表显示未关联客户列表,右侧列表显示已关联选中定区客户列表 
从图中可以看到定区DQ001已与客户王五关联,而位于李四关联。
当然这些列表数据是在点击最上面的关联客户列表后,进行查询数据库后显示出来的。
点击响应事件代码:
function doAssociations(){// 获得选中数据行 var row = $('#grid').datagrid('getSelected');if(row == null){// 没有选中$.messager.alert('警告','关联客户前,必须选中一条定区数据 ','warning');return}$('#noassociationSelect').html('');$('#associationSelect').html('');// 加载 窗口中两个select 列表数据// 查询未关联$.post("${pageContext.request.contextPath}/decidedzone_findnoassociationCustomers.do" , function(data){$(data).each(function(){var option = $("<option value='"+this.id+"'>"+this.name+"("+this.address+")</option>");$('#noassociationSelect').append(option);});});// 查询已经关联$.post("${pageContext.request.contextPath}/decidedzone_findhasassociationCustomers.do" , {id: row.id},function(data){$(data).each(function(){var option = $("<option value='"+this.id+"'>"+this.name+"("+this.address+")</option>");$('#associationSelect').append(option);});});$('#customerWindow').window('open'); }
列表左右移动功能实现
// 左右移动 $('#toRight').click(function(){$('#associationSelect').append($('#noassociationSelect option:selected')); }); $('#toLeft').click(function(){$('#noassociationSelect').append($('#associationSelect option:selected')); });
关联客户
现在我们想把李四也与定区DQ001进行关联。
选中李四,然后将其添加到右侧的已关联列表中。点击关联客户按钮(下方)后,提交表单,通过在数据库将李四与定区DQ001关联。

数据库中结果:

显然,关联成功了。定区与客户关联的功能也就实现了。


转载于:https://my.oschina.net/javandroid/blog/878208

总结

以上是生活随笔为你收集整理的logistics-6-decidedZone management的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。