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;
}
评论:
提交