Che cos'è un oggetto attivo?
Nella programmazione e ingegneria informatica, un oggetto attivo è un tipo di modello di progettazione che può essere utilizzato per garantire che alcuni servizi siano sempre disponibili in un sistema multi-thread o simultaneo. Un oggetto attivo è un oggetto che implementa un meccanismo in modo che possa ricevere ed elaborare input da oggetti esterni senza forzare gli oggetti esterni ad attendere il completamento dell'esecuzione. Questo meccanismo consente inoltre a molti oggetti che potrebbero essere in esecuzione contemporaneamente di utilizzare oggetti attivi senza la possibilità di lunghi tempi di blocco in cui i processi simultanei devono arrestarsi e attendere l'accesso. Questo molto spesso si ottiene avvolgendo gli oggetti attivi in un'interfaccia accessibile al pubblico, chiamata proxy, e quindi implementando un tipo di sistema di coda all'interno degli oggetti in modo che i messaggi vengano archiviati per l'elaborazione successiva. Ciò crea un modello di progettazione in cui gli oggetti inviano messaggi agli oggetti attivi e quindi continuano la loro elaborazione fino a quando l'oggetto attivo non elabora il messaggio e in seguito informa gli oggetti chiamanti dei risultati in modo che possano aggiornare i loro stati di conseguenza.
Al di fuori di un modello di progettazione di oggetti attivi, un oggetto normale potrebbe essere chiamato oggetto passivo. In un semplice esempio di programma, un oggetto passivo potrebbe fungere da inoltro del server di chat, in cui gli oggetti remoti contattano l'oggetto passivo per trasmettere un messaggio a tutti gli altri sul server. Ogni volta che l'oggetto server passivo riceve un messaggio di chat da un oggetto remoto, deve gestire immediatamente la richiesta e quindi inviare immediatamente l'output, il tutto mentre l'oggetto remoto interrompe la propria esecuzione fino al completamento del processo, un effetto noto come blocco. La creazione di thread diversi all'interno del programma può risolvere il problema del blocco dell'esecuzione ma quindi avvia problemi con la sincronizzazione.
In un modello di progettazione di oggetti attivi, lo stesso oggetto server nell'esempio sopra sarebbe in esecuzione nel proprio thread separato dagli altri oggetti. Sarebbe inoltre racchiuso in un tipo di interfaccia nota come proxy che è anche in esecuzione in un thread separato, a volte il thread di esecuzione del programma principale. Quando un oggetto remoto desidera che l'oggetto server invii un messaggio di chat, contatta l'oggetto proxy, gli passa tutte le informazioni richieste e quindi ritorna al suo normale stato di esecuzione invece di attendere.
L'interfaccia proxy quindi converte le informazioni dall'oggetto remoto in un messaggio che passa a una coda per l'elaborazione dell'oggetto attivo. A questo punto, sia l'interfaccia proxy che l'oggetto remoto sono liberi di continuare l'esecuzione e non sono bloccati. Nel frattempo, l'oggetto attivo lavora per mantenere vuota la coda, elaborando ogni messaggio in arrivo. Se l'oggetto chiamante richiede che alcune informazioni vengano restituite dall'oggetto attivo, è possibile utilizzare una struttura di richiamata per informare l'oggetto remoto di eventuali cambiamenti di stato.