Funzione di blocco per la sincronizzazione della linea di assemblaggio
Come opzione, è possibile sincronizzare le linee di montaggio a livello di Dispatcher 10 utilizzando un meccanismo di blocco.
Il Dispatcher 10 fornisce un blocco alle linee di montaggio, che devono acquisirlo prima di eseguire codice che richiede la sincronizzazione. Il blocco deve essere rilasciato dopo l'esecuzione del codice. Utilizzando il blocco, le linee di assemblaggio possono ottenere la sincronizzazione tra le linee di assemblaggio acquisendo e rilasciando il blocco.
- schema.dsmlÈ necessario modificare questo file se si desidera includere l'attributo LockName nel modulo di servizio. Ad esempio:
- Sezione Definizioni degli attributi
<!-- ******************************************************** --> <!-- erLdapLockName --> <!-- ******************************************************** --> <attribute-type single-value = "true" > <name>erLdapLockName</name> <description>Lock name for AL synchronization</description> <object-identifier>1.3.6.1.4.1.6054.3.139.2.31</object-identifier> <syntax>1.3.6.1.4.1.1466.115.121.1.15</syntax> </attribute-type> - Sezione della classe RMI Service
<attribute ref = "erLdapLockName" required = "false" />
- Sezione Definizioni degli attributi
- service.def
Per ogni operazione del file service.def , aggiungere un parametro del dispatcher. Ad esempio:
<dispatcherParameter name="LockName" source= "erLdapLockName"> <default>$(SO!erservicename)</default> </dispatcherParameter>L'attributo source di dispatcherParameter sarebbe necessario solo se il valore di LockName è preso dal modulo di servizio. Se il campo non è presente nel modulo di servizio, viene assunto il valore predefinito. Il nome dispatcherParameter deve essere sempre LockName.
Questo esempio imposta il valore predefinito del nome del blocco come uguale al nome del servizio. Tuttavia, è possibile modificarne il valore in base alle proprie esigenze.
Ad esempio, si potrebbe assegnare un nome predefinito o aggiungere un campo nel modulo di servizio, dove il nome del blocco può essere impostato e il valore predefinito punta a quel campo. Il distributore utilizza il valore del parametro LockName per creare il blocco. Il blocco viene creato prima dell'avvio della linea di montaggio, se non esiste già un blocco con lo stesso nome.
var myALCfg = task.getConfigClone(); //Get AL config object.
var myALSettings = myALCfg.getSettings(); //Get AL settings object from AL config.
var LockName = myALSettingsgetStringParameter("LockName");
task.logmsg("Lock name is"+LockName);
var lock = java.lang.System.getProperties().get(LockName);
var timeout = 240; //The maximum time that AL should wait to acquire the lock.
if ( lock.tryLock(timeout, java.util.concurrent.TimeUnit.SECONDS) )
{
/*
Critical Section
*/
}
else
{
task.logmsg("Failed to acquire lock");
}if (lock!=null)
{
lock.unlock(); //Releases the lock
}È possibile aggiungere questa specifica nello stesso gancio o in qualsiasi altro gancio. Tuttavia, è necessario rilasciare il blocco nei punti appropriati, anche nei percorsi di errore, se necessario. In caso contrario, si può verificare un evento IllegalMonitorStateException .