Обратите внимание, что я не эксперт 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