Quando a configuração do eXtreme Scale usa a estratégia de colocação de partição fixa, ela dependerá do hash da chave para uma partição inserir, obter, atualizar ou remover o valor. O método hashCode é chamado na chave e ele deverá ser bem definido se uma chave customizada for criada. No entanto, outra opção é usar a interface PartitionableKey. Com a interface PartitionableKey, será possível usar um objeto diferente da chave para efetuar hash de uma partição.
É possível usar a interface PartitionableKey em situações em que houver vários mapas e os dados que você consolidar serão relatados e, assim, deverão ser colocados na mesma partição. WebSphere eXtreme Scale não suporta two-phase commit, portanto, várias transações de mapa não deverão ser confirmadas se incluírem várias partições. Se o PartitionableKey efetuar hash para a mesma partição para as chaves em mapas diferentes no mesmo conjunto de mapas, eles poderão ser consolidados em conjunto.
Também é possível usar a interface PartitionableKey quando grupos de chaves tiverem que ser colocados na mesma partição, mas não necessariamente durante uma única transação. Se as chaves tiverem que ser submetidas a hash com base no local, departamento, tipo de domínio ou algum outro tipo de identificador, as chaves filha poderão receber um PartitionableKey pai.
Por exemplo, os funcionários devem efetuar hash para a mesma partição do seu departamento. Cada chave de funcionário terá um objeto PartitionableKey que pertence ao mapa do departamento. Então, o funcionário e o departamento devem executar hash para a mesma partição.
A interface PartitionableKey fornece um método, chamado ibmGetPartition. O objeto retornado desse método deve implementar o método hashCode. O resultado retornado do uso de um hashCode alternativo será usado para rotear as chaves para uma partição.
package com.ibm.websphere.cjtester;
import java.io.Serializable;
import com.ibm.websphere.objectgrid.plugins.PartitionableKey;
public class RoutableKey implements Serializable, Cloneable, PartitionableKey {
private static final long serialVersionUID = 1L;
// The data that makes up the actual data object key.
public final String realKey;
// The key of the data object you want to use for routing.
// This is typically the key of a parent object.
public final Object keyToRouteWith;
public RoutableKey(String realKey, Object keyToRouteWith) {
super();
this.realKey = realKey;
this.keyToRouteWith = keyToRouteWith;
}
/**
* Return the hashcode of the key we are using for routing.
* If not supplied, eXtreme Scale will use the hashCode of THIS key.
*/
public Object ibmGetPartition() {
return new Integer(keyToRouteWith.hashCode());
}
@Override
public RoutableKey clone() throws CloneNotSupportedException {
return (RoutableKey) super.clone();
}
@Override
public int hashCode () {
final int prime = 31;
int result = 1;
result = prime * result + ((keyToRouteWith == null) ?
0 : keyToRouteWith.hashCode());
result = prime * result + ((realKey == null) ? 0 : realKey.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if ( obj == null ) return false;
if (getClass() != obj.getClass()) return false;
RoutableKey other = (RoutableKey) obj;
if (keyToRouteWith == null) {
if (other.keyToRouteWith != null) return false;
} else if (!keyToRouteWith.equals(other.keyToRouteWith)) return false;
if (realKey == null) {
if (other.realKey != null) return false;
} else if (!realKey.equals(other.realKey)) return false;
return true;
}
}