public void setSessionContext(javax.ejb.SessionContext ctx) { mySessionCtx = ctx; try { // cache various references. InitialContext ic = new InitialContext(); bookHome = (PartitionManager)ic.lookup(PartitionManager.JNDI_NAME); } catch (Exception e) { throw new EJBException(e); } }Fare riferimento ai programmatori di esempio per ulteriori esempi di utilizzo.
Questo metodo ha tre firme, ognuno delle quali utilizzata per creare un'istanza PartitionDefinition che rappresenta una partizione dell'applicazione. Questo metodo è sovraccarico e pertanto è necessario scegliere il metodo appropriato in base al comportamento desiderato.
PartitionDefinition createPartitionDefinition(String partitionName)
PartitionDefinition createPartitionDefinition(String partitionName,
String partitionClass,
PartitionScope scope)
PartitionDefinition createPartitionDefinition(String partitionName,
String partitionClass,
PartitionScope scope,
Map attributemap)
Il primo valore inserito nell'API put() dell'associazione è la chiave del gestore HA, il secondo sarà il valore del gestore HA per tale coppia di chiavi.
public PartitionDefinition[] getPartitions() { String names = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; PartitionDefinition[] rc = new PartitionDefinition[names.length()]; for(int i = 0; i < names.length(); ++i) { Map testMap = new HashMap(); testMap.put(“custom-attrib", "samplevalue"); testMap.put("activateOn", Integer.toString(i%3)); // have 3 servers, balance at start rc[i] = ivRuntime.createPartitionDefinition(names.substring(i, i + 1), "MapExamle", PartitionScope.K_NODE, testMap); testMap = null; } logger.trace(RASITraceEvent.TYPE_LEVEL1, this, "getPartitions", "Returning partitions", rc); return rc; }
In questo caso, viene creata un'associazione che ha un attributo della chiave del gestore HA impostato sullo stesso valore per tutte le partizioni(custom-attrib) e un secondo attributo denominato is named activateOn che ha un valore di stringa pari a 0-2. Questo esempio è stato utilizzato insieme al supporto delle politiche per creare una politica per ogni valore di avvio e richiedere quindi che la politica del server preferito sia univoca per ogni terza partizione. Fare riferimento alla sezione sulle politiche per maggiori dettagli su questo approccio.
String[] getPartitions()
Questo metodo può essere richiamato per ottenere il nome dell'applicazione determinata dall'amministratore in fase di distribuzione. Questa stringa può essere utilizzata con il nome della partizione per verificare che sia univoca nel cluster (il nome dell'applicazione distribuita deve essere sempre univoco in un cluster WebSphere).
String getApplicationName()
Se questa viene utilizzata durante la creazione di una partizione, è preferibile distribuire l'applicazione J2EE con partizione con un nome minimo in termini di lunghezza di stringa, come ad esempio il nome utilizzato nel runtime del gestore HA.È molto comune l'utilizzo di questo nome nei riferimenti alla partizione della versione che hanno la stessa applicazione J2EE con partizione nello stesso cluster, semplicemente installata con un nome differente, e ogni partizione, ad esempio PartitionA può essere invece chiamata Appv2r2.PartitionA. Pertanto, nel cluster l'utente può avere le partizioni Appv2r1.PartitionA e Appv2r2.PartitionAh attive contemporaneamente. L'applicazione indirizza la richiesta alla versione con cui è più compatibile. Questo è soltanto uno dei vari approcci al problema.
void addPartition(PartitionDefinition name)
Se un membro del cluster aggiunge una partizione allora questa viene aggiunta automaticamente in maniera asincrona a tutti i membri del cluster. Utilizzando la politica dell'ambito cluster predefinita la partizione verrà attivata sul membro del cluster ricevendo la richiesta nonostante non sia garantito il funzionamento. Inoltre, l'attivazione di una partizione su un cluster è una funzione distribuita pertanto è possibile che si verifichi un ritardo tra l'ora in cui viene restituita l'API e l'attivazione reale della partizione. I programmatori dovrebbero tenere conto di tale ritardo.
Questa API viene dimostrata nell'esempio WPFKeyBasedPartition.
Questo metodo consente a un'applicazione di rimuovere una partizione in maniera dinamica. Se la partizione è attiva su un membro del cluster, allora viene anche disattivata. La partizione viene rimossa da tutti i membri del cluster online.
void removePartition(String name)
La disattivazione di una partizione su un cluster è una funzione distribuita pertanto è possibile che si verifichi un ritardo tra l'ora in cui viene restituita l'API e la disattivazione reale della partizione. I programmatori dovrebbero tenere conto di tale ritardo.Per gli scenari in cui è più probabile che si verifichi un errore temporaneo piuttosto che un errore permanente, il programmatore dovrebbe utilizzare l'API disablePartition(). In questo caso, il meccanismo della politica può essere utilizzato per determinare se la partizione non deve essere riavviata o se deve essere riavviata su un altro membro del cluster, se ne esiste la possibilità.
Questo metodo disabilita dinamicamente una partizione. Il richiamo di questo metodo disabilita la partizione su tutti i membri correnti del cluster. Ciò è possibile mediante il comando wpfadmin.
void removePartition(String name)
Quando il metodo viene richiamato, la partizione entra in uno stato disattivato oppure viene immediatamente attivata su un altro membro del cluster capace di ospitare la partizione. La partizione viene disattivata in base alle impostazioni della politica corrente ma per impostazione predefinita viene attivata su un altro membro del cluster, se disponibile. Se la partizione non viene riattivata automaticamente, il comando wpfadmin può essere utilizzato per abilitare il membro una volta che l'amministratore può esaminare i log e determinare le operazioni che devono essere effettuate prima di riabilitare la partizione.partitionUnloadEvent(...) non viene richiamato in quanto l'applicazione richiama questo metodo ed elimina quante più informazioni prima di questo richiamo.
Questo metodo viene richiamato dall'applicazione per indicare un problema con una partizione attiva. Ciò provoca una reazione del gestore HA in base al valore del parametro di gravità. Questo metodo è riservato per un uso futuro e non è implementato in questo momento. Fare riferimento a disablePartition() per intraprendere un'azione correttiva.
Questo metodo viene richiamato da un'applicazione per riportare che una transazione è stata completata con un determinato tempo di riposta per una partizione specifica. Esso viene di solito utilizzato quando l'applicazione utilizza un metodo asincrono ricevere le richieste di lavoro in opposizione delle richieste IIOP sincrone.
void reportTransactionComplete(String partitionName, long responseTime_ms)
Questo risultato dell'API è memorizzato e trasferito alla funzione di controllo delle prestazioni WPF. Tale funzione tiene traccia dei singoli risultati sull'intero cluster. Questo servizio viene discusso in più sezioni di questo manuale e i relativi esempi sono riportati nella sezione Introduzione.Questa API viene dimostrata nell'esempio WPFKeyBasedPartitionSample.
void setHttpPartitionManager(HttpPartitionManagerInterface manager)
Il PMI WPF contiene una statistica, responseTime, che viene utilizzata per misurare il tempo di risposta delle transazioni e il numero di transazioni eseguite per conto di una determinata partizione. Il tempo di risposta è raccolto dalle applicazioni utente. Le applicazioni utente aggiornano le statistiche PMI richiamando il metodo reportTransactionComplete dell'interfaccia com.ibm.websphere.wpf.PartitionManager.
/** * Tale firma deve essere chiamata per informare il runtime quando una transaz./operaz. * viene completata sulla partizione. Viene utilizzata per registrare quante * transazioni al secondo vengono eseguite per partizione. * @param partitionName il nome della partizione. * @param responseTime_ms il tempo di risposta per la transazione. * @throws IllegalStateException Se l'applicazione della chiamata non ha una partizione handler bean */ void reportTransactionComplete(String partitionName, long responseTime_ms)
È possibile richiamare PartitionManager.reportTransactionComplete nel bean PSSB (partition stateless session bean). La procedura ottimale consiste nel calcolo da parte degli utenti del tempo di transazione di una transazione e utilizzare quindi questa API per riportare tale tempo. Di seguito è riportato un esempio. Il metodo buy è un metodo per simulare la transazione nel bean WPFKeyBasedPartition nell'applicazione WPFKeyBasedPartitionSample.
/** * Un metodo buy. Questo metodo non effettua alcuna operazione oltre a riportare il completamento * della transazione. La transazione ha un valore casuale compreso tra 0 ms e 1000 ms. * * @param partitionName * @return the partition name */ public String buy(String partitionName) { String serverName = AdminServiceFactory.getAdminService().getNodeName() +"/"+AdminServiceFactory.getAdminService().getProcessName(); ivManager.reportTransactionComplete(partitionName, (long) (1000 * Math.random())); logger.trace( RASITraceEvent.TYPE_LEVEL1, this, "buy", "The method called at " + serverName + "." + partitionName); return "partiton=" + partitionName + ",server=" + serverName; }
La prima volta che viene richiamato il metodo PartitionManager.reportTransactionComplete per una determinata partizione su un server delle applicazioni, viene creato un modulo PMI per questa partizione raggruppato in base al nome dell'applicazione e al nome EJB della sessione. Ad esempio, se il nome dell'applicazione è app1 e il nome EJB di sessione è session1, allora il modulo PMI sarà raggruppato in base a app1#session1. Ciò verrà descritto successivamente nella sezione relativa al percorso PMI.
Le statistiche di responseTime sono progettate per calcolare alcuni fattori statistici, ad esempio il tempo di risposta medio, il tempo di risposta minimo, il tempo di risposta massimo e la somma dei quadrati dei tempi di risposta. Gli utenti possono accedere a tali dati interrogando i dati PMI mediante il comando wpfadmin, il comando wsadmin o MBean.