Przeprowadzam badania na GenericObjectPool
, umieszczając Cipher
w puli, aby można było ponownie użyć.Tworzenie obiektów w GenericObjectPool
GenericObjectPool<Cipher> pool;
CipherFactory factory = new CipherFactory();
this.pool = new GenericObjectPool<Cipher>(factory);
pool.setMaxTotal(10);
pool.setBlockWhenExhausted(true);
pool.setMaxWaitMillis(30 * 1000);
CipherFactory
public class CipherFactory extends BasePooledObjectFactory<Cipher> {
private boolean running = false;
@Override
public Cipher create() throws Exception {
return Cipher.getInstance("DESede/CBC/NoPadding");
}
@Override
public PooledObject<Cipher> wrap(Cipher arg0) {
return new DefaultPooledObject<Cipher>(arg0);
}
@Override
public boolean validateObject(PooledObject<Cipher> p) {
//Ensures that the instance is safe to be returned by the pool
return true;
}
@Override
public void destroyObject(PooledObject<Cipher> p) {
//Destroys an instance no longer needed by the pool.
System.out.println("destroying");
}
@Override
public void activateObject(PooledObject<Cipher> p) throws Exception { //Reinitialize an instance to be returned by the pool
setRunning(true);
}
@Override
public void passivateObject(PooledObject<Cipher> p) throws Exception { // reset the object after the object returns to the pool
setRunning(false);
}
public void setRunning(boolean running) {
this.running = running;
}
//
}
ten sposób zaimplementować ObjectPool
w moim przykładu klasy
public Key a(byte[] afyte) throws Exception {
Cipher cipher = null;
cipher = pool.borrowObject(); //get the object from the pool
try {
System.out.println("****************** After borrow ****************");
printPool();
cipher.init(Cipher.DECRYPT_MODE, mkkey, algParamSpec);
byte[] de = cipher.doFinal(afyte);
SecretKey mk = new SecretKeySpec(de, "DESede");
return mk;
} catch (Exception e) {
pool.invalidateObject(cipher);
cipher = null;
} finally {
if (null != cipher) {
pool.returnObject(cipher);
System.out.println("****************** After return ****************");
printPool();
}
}
return (Key) cipher;
}
printPool
public void printPool() {
System.out.println("Pool for cipher with instances DESede/CBC/NoPadding");
System.out.println("Active [" + pool.getNumActive() + "]"); //Return the number of instances currently borrowed from this pool
System.out.println("Idle [" + pool.getNumIdle() + "]"); //The number of instances currently idle in this pool
System.out.println("Total Created [" + pool.getCreatedCount() + "]");
}
Czy jestem na dobrej drodze? Czy można zwiększyć rozmiar basenu?
Edit
Odpowiedź z @http działa dobrze dla mnie. Ale jeśli mam inną metodę encryptECB(Key key, byte[] b)
, jak mam pisać?
Każda pomoc zostanie doceniona!
Pula może mieć maksymalnie 10, więc jeśli nie zwrócisz ich do puli, ten błąd jest oczekiwany? A jeśli chcesz utworzyć więcej, jeśli pula się kończy, wydaje się, że w ogóle nie potrzebujesz basenu, możesz po prostu tworzyć je, gdy potrzebujesz więcej. – tima
Czy jestem na dobrej drodze? – Tony
Nie, jeśli chcesz nadal korzystać z puli. Pula powinna mieć ograniczoną liczbę zasobów, na przykład w tym przypadku została utworzona 10.Oznacza to, że nie możesz przekroczyć 10, a jeśli wszystkie są zajęte, musisz poczekać, aż stanie się dostępny, zanim zażądasz. Z drugiej strony, jeśli nie chcesz czekać, oznacza to, że nie możesz mieć limitu i dlatego nie potrzebujesz puli. – tima