java老系统的功能重构

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<String> 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, [<<"guest">>]},改成{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<String> 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<String> rst= new ArrayList(dealList);
    dealList.clear();
    return rst;
}

文/程忠 浏览次数:0次   2020-09-29 14:33:28

相关阅读


评论: