Plug-in ObjectTransformer

Le plug-in ObjectTransformer permet de sérialiser, désérialiser et copier des objets du cache afin d'améliorer les performances.

Deprecated feature L'interface ObjectTransformer a été remplacée par les plug-in DataSerializer que vous pouvez utiliser pour stocker efficacement les données arbitraires dans WebSphere eXtreme Scale pour que les API de produit existantes puissent interagir efficacement avec vos données.

Si vous constatez des problèmes de performances dans l'utilisation des processeurs, ajoutez à chaque mappe un plug-in ObjectTransformer. Sans ce plug-in ObjectTransformer, jusqu'à 60-70 % du temps processeur sera consacré à la sérialisation et à la copie des entrées.

Utilité

Le plug-in ObjectTransformer permet à vos applications de fournir des méthodes personnalisées pour les opérations suivantes :
  • sérialisation ou désérialisation de la clé d'une entrée
  • sérialisation ou désérialisation de la valeur d'une entrée
  • copie de la clé ou de la valeur d'une entrée

Si aucun plug-in ObjectTransformer n'est fourni, vous devrez savoir sérialiser vous-mêmes les clés et les valeurs car l'ObjectGrid utilise une séquence de sérialisation/désérialisation pour copier les objets. Cette méthode est onéreuse ; c'est pourquoi il convient d'utiliser un plug-in ObjectTransformer lorsque les performances sont en jeu. La copie ne se produit que lorsqu'une application recherche pour la première fois un objet dans une transaction. Vous pouvez éviter la copie en donnant au mode copy de la mappe la valeur NO_COPY ou réduisant la copie en donnant à ce mode la valeur COPY_ON_READ. Optimisez l'opération de copie lorsque l'application a besoin d'en effectuer une en fournissant une méthode personnalisée de copie dans ce plug-in. Ce plug-in peut faire tomber le temps système consacré à la copie de 65−70 % à 2-3 % du temps processeur total.

La première fois, les implémentations par défaut des méthodes copyKey et copyValue tentent d'utiliser la méthode clone si cette méthode est fournie. Si aucune implémentation de clone n'est fournie, par défaut, l'implémentation passe à la sérialisation.

La sérialisation des objets est également utilisée directement lorsque eXtreme Scale s'exécute en mode réparti. LogSequence utilise le plug-in ObjectTransformer pour sérialiser les clés et les valeurs avant de transmettre les modifications aux homologues présents dans l'ObjectGrid. Vous devez prendre un certain nombre de précautions lorsque vous fournissez une méthode personnalisée de sérialisation au lieu d'utiliser la sérialisation pré-intégrée du kit de développement Java. La vérification des versions d'objets est en effet un problème complexe et vous risquez de rencontrer des problèmes de compatibilité de versions si vos méthodes personnalisées ne sont pas conçues pour gérer cette vérification.

La liste qui suit décrit comment eXtreme Scale s'y prend pour sérialiser les clés et les valeurs :
  • Si un plug-in ObjectTransformer personnalisé est écrit et connecté, eXtreme Scale appelle les méthodes présentes dans l'interface ObjectTransformer pour sérialiser les clés et les valeurs et pour obtenir des copies de ces clés et de ces valeurs.
  • S'il n'est pas fait usage d'un plug-in ObjectTransformer personnalisé, eXtreme Scale sérialise et désérialise les valeurs conformément à la méthode par défaut. Si c'est le Plug-in par défaut qui est utilisé, chaque objet est implémenté comme externalisable ou comme sérialisable.
    • Si l'objet prend en charge l'interface Externalizable, c'est la méthode writeExternal qui est appelée. Les objets implémentés comme externalisables donnent de meilleures performances.
    • Si l'objet ne prend pas en charge l'interface Externalizable et qu'il implémente l'interface Serializable, il est enregistré à l'aide de la méthode ObjectOutputStream.

Utiliser l'interface ObjectTransformer

Un objet ObjectTransformer doit implémenter l'interface ObjectTransformer et se conformer aux conventions communes des plug-in ObjectGrid.

Comme toujours, deux approches sont possibles pour ajouter un objet ObjectTransformer à la configuration BackingMap : la configuration par programmation et la configuration XML.

Configuration par programmation du plug-in ObjectTransformer

Le fragment de code suivant crée l'objet ObjectTransformer personnalisé et l'ajoute à une BackingMap :
ObjectGridManager objectGridManager = ObjectGridManagerFactory.getObjectGridManager();
ObjectGrid myGrid = objectGridManager.createObjectGrid("myGrid", false);
BackingMap backingMap = myGrid.getMap("myMap");
MyObjectTransformer myObjectTransformer = new MyObjectTransformer();
backingMap.setObjectTransformer(myObjectTransformer);

Configuration par XML du plug-in ObjectTransformer

Supposons que le nom de la classe de l'implémentation d'ObjectTransformer soit com.company.org.MyObjectTransformer. Cette classe implémente l'interface ObjectTransformer. Le code XML suivant permet de configurer une implémentation d'ObjectTransformer :
<?xml version="1.0" encoding="UTF-8"?>
<objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://ibm.com/ws/objectgrid/config ../objectGrid.xsd"
    xmlns="http://ibm.com/ws/objectgrid/config">
    <objectGrids>
        <objectGrid name="myGrid">
	    <backingMap name="myMap" pluginCollectionRef="myMap" />
        </objectGrid>
    </objectGrids>

    <backingMapPluginCollections>
	<backingMapPluginCollection id="myMap">
	     <bean id="ObjectTransformer" className="com.company.org.MyObjectTransformer" />
	</backingMapPluginCollection>
    </backingMapPluginCollections>
</objectGridConfig>

Scénarios d'utilisation d'ObjectTransformer

Vous pouvez utiliser le plug-in ObjectTransformer dans les situations suivantes :
  • objet non sérialisable
  • objet sérialisable mais nécessité d'améliorer les performances de la sérialisation
  • copie de clés ou de valeurs
Dans l'exemple qui suit, l'ObjectGrid sert à stocker la classe Stock :
/**
* Objet Stock pour la démo ObjectGrid
*
*
*/
public class Stock implements Cloneable {
    String ticket;
    double price;
    String company;
    String description;
    int serialNumber;
    long lastTransactionTime;
    /**
    * @return retourne la description.
    */
    public String getDescription() {
        return description;
    }
    /**
    * @param description La description à définir.
    */
    public void setDescription(String description) {
        this.description = description;
    }
    /**
    * @return Retourne le lastTransactionTime.
    */
    public long getLastTransactionTime() {
        return lastTransactionTime;
    }
    /**
    * @param lastTransactionTime Le lastTransactionTime à définir.
    */
    public void setLastTransactionTime(long lastTransactionTime) {
        this.lastTransactionTime = lastTransactionTime;
    }
    /**
    * @return Retourne le prix.
    */
    public double getPrice() {
        return price;
    }
    /**
    * @param price Le prix à définir.
    */
    public void setPrice(double price) {
        this.price = price;
    }
    /**
    * @return Retourne le serialNumber.
    */
    public int getSerialNumber() {
        return serialNumber;
    }
    /**
    * @param serialNumber Le serialNumber à définir.
    */
    public void setSerialNumber(int serialNumber) {
        this.serialNumber = serialNumber;
    }
    /**
    * @return Retourne le ticket.
    */
    public String getTicket() {
        return ticket;
    }
    /**
    * @param ticket Le ticket à définir.
    */
    public void setTicket(String ticket) {
        this.ticket = ticket;
    }
    /**
    * @return Retourne la Company.
    */
    public String getCompany() {
        return company;
    }
    /**
    * @param company La Company à définir.
    */
    public void setCompany(String company) {
        this.company = company;
    }
    //clone
    public Object clone() throws CloneNotSupportedException
    {
        return super.clone();
    }
}

Vous pouvez écrire une classe ObjectTransformer personnalisée pour la classe Stock :

/**
* Implémentation personnalisée d'ObjectGrid ObjectTransformer pour l'objet Stock
*
*/
public class MyStockObjectTransformer implements ObjectTransformer {
/* (non−Javadoc)
* @see
* com.ibm.websphere.objectgrid.plugins.ObjectTransformer#serializeKey
* (java.lang.Object,
* java.io.ObjectOutputStream)
*/
public void serializeKey(Object key, ObjectOutputStream stream) throws IOException {
    String ticket= (String) key;
    stream.writeUTF(ticket);
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#serializeValue(java.lang.Object,
java.io.ObjectOutputStream)
*/
public void serializeValue(Object value, ObjectOutputStream stream) throws IOException {
    Stock stock= (Stock) value;
    stream.writeUTF(stock.getTicket());
    stream.writeUTF(stock.getCompany());
    stream.writeUTF(stock.getDescription());
    stream.writeDouble(stock.getPrice());
    stream.writeLong(stock.getLastTransactionTime());
    stream.writeInt(stock.getSerialNumber());
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#inflateKey(java.io.ObjectInputStream)
*/
public Object inflateKey(ObjectInputStream stream) throws IOException, ClassNotFoundException {
    String ticket=stream.readUTF();
    return ticket;
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#inflateValue(java.io.ObjectInputStream)
*/

public Object inflateValue(ObjectInputStream stream) throws IOException,	ClassNotFoundException {
    Stock stock=new Stock();
    stock.setTicket(stream.readUTF());
    stock.setCompany(stream.readUTF());
    stock.setDescription(stream.readUTF());
    stock.setPrice(stream.readDouble());
    stock.setLastTransactionTime(stream.readLong());
    stock.setSerialNumber(stream.readInt());
    return stock;
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#copyValue(java.lang.Object)
*/
public Object copyValue(Object value) {
    Stock stock = (Stock) value;
    try {
        return stock.clone();
    }
    catch (CloneNotSupportedException e)
    {
        // affichage du message d'exception     }
}

/* (non−Javadoc)
* @see com.ibm.websphere.objectgrid.plugins.
ObjectTransformer#copyKey(java.lang.Object)
*/
public Object copyKey(Object key) {
    String ticket=(String) key;
    String ticketCopy= new String (ticket);
    return ticketCopy;
}
}
Vous pouvez alors connecter cette classe personnalisée MyStockObjectTransformer dans la BackingMap :
ObjectGridManager ogf=ObjectGridManagerFactory.getObjectGridManager();
ObjectGrid og = ogf.getObjectGrid("NYSE");
BackingMap bm = og.defineMap("NYSEStocks");
MyStockObjectTransformer ot = new MyStockObjectTransformer();
bm.setObjectTransformer(ot);