Как создать пул подключений / только один раз для стороннего приложения? - PullRequest
1 голос
/ 19 марта 2019

Я использую JAVA / Spring MVC и мне нужно создать пул соединений для интеграции сторонних приложений в мое приложение, потому что, когда я пытаюсь подключить его несколько раз, моя система приложений и серверов использует 100% ОЗУ.

здесь у меня проблема, когда пользователи начинают нажимать определенный метод (callGenerationService()) несколько раз, моя память кучи (пространство ОЗУ) увеличивается и становится 100%, и приложение будет работать медленно, потому что оно подключает стороннее приложение несколькораз?здесь мне нужно создать connection только один раз и получить его несколько раз.где мое соединение, например,

public class ClickToCallServiceImpl implements ClickToCallServiceInterface {
Client client = null;
@Override
public ClickToCall callGenerationService(ClickToCall clickToCall) {
     client = new Client();
     client.connect("127.0.0.1", 8021 , "password", 10); //Every time Connection Connect.
     client.setEventSubscriptions("plain", "all");
     // client.sendSyncApiCommand("",""); //here i run command on every hit like.
    client.sendSyncApiCommand(clickToCall.command1, clickToCall.command2);
    client.close();
}
}

, а здесь ClickToCall - это класс @Component Bean / POJO с установщиками и получателями переменных.

Есть, какмы создаем connection (either pool or only once connect) для вышеуказанного соединения, где я подключаюсь только один раз и нажимаю clickToCall.Command1 and clickToCall.Command2 несколько раз и используем меньше оперативной памяти?Заранее спасибо.

1 Ответ

1 голос
/ 19 марта 2019

Обратите внимание, что я не эксперт freeswitch esl, поэтому вы должны правильно проверить код. Во всяком случае, это то, что я бы сделал.

Сначала я создаю Фабрику для Клиента

public class FreeSwitchEslClientFactory extends BasePooledObjectFactory<Client> {

    @Override
    public Client create() throws Exception {
        //Create and connect: NOTE I'M NOT AN EXPERT OF ESL FREESWITCH SO YOU MUST CHECK IT PROPERLY
        Client client = new Client();
        client.connect("127.0.0.1", 8021 , "password", 10);
        client.setEventSubscriptions("plain", "all");
        return client;
    }

    @Override
    public PooledObject<Client> wrap(Client obj) {

        return new DefaultPooledObject<Client>(obj);
    }
}

Затем я создаю общий GenericObjectPool:

@Configuration
@ComponentScan(basePackages= {"it.olgna.spring.pool"})
public class CommonPoolConfig {

    @Bean("clientPool")
    public GenericObjectPool<Client> clientPool(){
        GenericObjectPool<Client> result = new GenericObjectPool<Client>(new FreeSwitchEslClientFactory());
        //Pool config e.g. max pool dimension
        result.setMaxTotal(20);
        return result;
    }
}

Наконец, я использую созданный пул, чтобы получить Client obj:

@Component
public class FreeSwitchEslCommandSender {

    @Autowired
    @Qualifier("clientPool")
    private GenericObjectPool<Client> pool;

    public void sendCommand(String command, String param) throws Exception{
        Client client = null;
        try {
            client = pool.borrowObject();
            client.sendSyncApiCommand(command, param);
        } finally {
            if( client != null ) {
                client.close();
            }
            pool.returnObject(client);
        }
    }
}

Я не проверял (и потому что не могу) это, но оно должно работать. В любом случае я прошу вас правильно проверить конфигурацию. Я не знаю, нормально ли всегда создавать объект Client и подключаться или лучше подключаться, когда вы хотите отправить команду

Надеюсь, это может быть полезно

РЕДАКТИРОВАТЬ ИНФОРМАЦИЮ

Извините, я сделал ошибку рано. Вы должны вернуть клиента в пул Я обновил свой класс FreeSwitchEslCommandSender

Angelo

...