java系统重构大作业_java老系统的功能重构

本文讲述了在重构Java老系统时遇到的问题及解决方案,如缺少源码、测试困难和旧框架技术。针对老版本rabbitMQ的优化,通过查看jar源码并继承老类来添加新功能,同时分享了如何在CentOS7上安装RabbitMQ3.5.6的详细步骤,并对比了两种不同消费数据方式的效率差异。
摘要由CSDN通过智能技术生成

java老系统的功能重构

对于老系统出了问题,要优化或修复是很困难的,主要这几方面原因。

1.代码老,可能有的没有源码,只有jar包.

2.测试困难,得重新梳理逻辑,找到测试方法

3.使用框架技术老,最好搭相同的框架。框架的不同版本,用法不一样。

比如我就遇到了,一个老版本rabbitMQ的相关的队列需优化。

问题1的解决方法是用idea打开,可看到大多数jar的源码。在理解源码后,可以用继承老类的方式来添加新方法。

这里有个问题,可能老类很多属性是private的,这样就无法在新类里使用。那么在新类的用一个构造函数,先用super构造父类,再把想要的对象在本类里赋值一下,如下:

public class NewCls extends OldCls {

private static Log log= LogFactory.getLog(NewCls.class);

private static List dealList=new CopyOnWriteArrayList<>();

private String queueName;

private QServerResources qServerResources;

public NewCls(String queueName, String qInfo, String pwd) {

super(queueName, qInfo, pwd);

this.queueName=queueName;

this.qServerResources = QServerResources.getInstance();

}

}

2.测试困难问题,可以分拆原程序,然后各自写单元测试。确认输入与输出数据,减少错误发生。

3.框架老的问题,就是搭一套老的,比如我是这么搭rabbitMQ3.5.6的。

先百度一下相关版本安装教程,如果有那么很幸运。

centos7 64位下安装RabbitMQ3.5.6的步骤:

wget https://www.rabbitmq.com/releases/erlang/erlang-18.1-1.el6.x86_64.rpm

sudo yum install ncurses-compat-libs

sudo rpm -ivh erlang-18.1-1.el6.x86_64.rpm

sudo rpm -Uvh http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.6/rabbitmq-server-3.5.6-1.noarch.rpm

sudo rabbitmq-plugins enable rabbitmq_management

cd /etc/rabbitmq

cp /usr/share/doc/rabbitmq-server-3.5.6/rabbitmq.config.example /etc/rabbitmq/

cat /usr/share/doc/rabbitmq-server-3.5.6/rabbitmq.config.example

sudo cp /usr/share/doc/rabbitmq-server-3.5.6/rabbitmq.config.example /etc/rabbitmq/

mv rabbitmq.config.example rabbitmq.config

sudo mv rabbitmq.config.example rabbitmq.config

sudo vi /etc/rabbitmq/rabbitmq.config

将 %% {loopback_users, [<>]},改成{loopback_users, []}

注意,这个版本可以这么改。目前最新的版本3.8.?已经不管用了。

sudo service rabbitmq-server start

以上命令,几乎没什么阻碍。

4.记录一下rabbitmq两种接收数据效率的巨大差别

Consumer consumer = new DefaultConsumer(channel) {

@Override

public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,

byte[] body) throws IOException {

String message = new String(body, "UTF-8");

dealList.add(message);

}

};

String consumerTag=String.valueOf(Calendar.getInstance().getTimeInMillis());

channel.basicConsume(this.queueName, true, consumerTag,consumer);

//消费500豪秒,多线程的

Thread.sleep(500);

//用这个方法可中止多线程消费

channel.basicCancel(consumerTag);

这种方法太慢,每次只取一个,下次重新建立连接。生产环境,快的时侯10多秒取2000条,慢的时候需几分钟取2000条。用上面basicConsume方法,每秒1千多条。

GetResponse response = channel.basicGet(this.queueName, false);

老队列改成baseConsume报错的一种情况:

private List receiveData(Channel channel) throws IOException, InterruptedException {

//如果是老队列就不要这句话,否则会报错

//channel.queueDeclare(this.queueName, false, false, false, null);

// DefaultConsumer类实现了Consumer接口,通过传入一个频道,

// 告诉服务器我们需要那个频道的消息,如果频道中有消息,就会执行回调函数handleDelivery

Consumer consumer = new DefaultConsumer(channel) {

@Override

public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,

byte[] body) throws IOException {

String message = new String(body, "UTF-8");

dealList.add(message);

}

};

//log.info("before:"+channel.getDefaultConsumer());

String consumerTag=String.valueOf(Calendar.getInstance().getTimeInMillis());

channel.basicConsume(this.queueName, true, consumerTag,consumer);

Thread.sleep(500);

channel.basicCancel(consumerTag);

List rst= new ArrayList(dealList);

dealList.clear();

return rst;

}

评论:

0067025ff7b875db9517e34b2877e02f.png

提交

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
/* * 原始需求背景: * 网宿CDN要按月收取客户的服务费用,根据流量的大小、 * 服务的类型等,收取不同的费用,收费规则如下: * web应用:1000元/M * 流媒体应用:1000元/M*0.7 * 下载应用:1000元/M*0.5 * 月末打印报表时,要罗列每个用户每个频道的费用、客户总费用, * 还要打印该客户的重要性指数,重要性指数=网页流/100+下载流量/600; * * 需求变更场景: * 系统已经开发出来了,接下来,运维部门现在希望对系统做一点修改, * 首先,他们希望能够输出xml,这样可以被其它系统读取和处理,但是, * 这段代码根本不可能在输出xml的代码中复用report()的任何行为,唯一 * 可以做的就是重写一个xmlReport(),大量重复report()中的行为,当然, * 现在这个修改还不费劲,拷贝一份report()直接修改就是了。 * 不久,成本中心又要求修改计费规则,于是我们必须同时修改xmlReport() * 和report(),并确保其一致性,当后续还要修改的时候,复制-黏贴的问题就 * 浮现出来了,这造成了潜在的威胁。 * 再后来,客服部门希望修改服务类型和用户重要性指数的计算规则, * 但还没决定怎么改,他们设想了几种方案,这些方案会影响用户的计费规则, * 程序必须再次同时修改xmlReport()和report(),随着各种规则变得越来越复杂, * 适当的修改点越 来越难找,不犯错误的机会越来越少。 * 现在,我们运用所学的OO原则和方法开始进行改写吧。 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值