Domanda

Sto giocando in giro con il href="http://code.google.com/p/disruptor/" rel="noreferrer"> Disruptor quadro

Ecco il mio codice di installazione:

private static final int BUFFER_SIZE = 1024 * 8;
private final ExecutorService  EXECUTOR = Executors.newSingleThreadExecutor();

private void initializeDisruptor() {
    if (disruptor != null)
        return;

    disruptor = 
            new Disruptor<TwitterStatusReceivedEvent>(TwitterStatusReceivedEvent.EVENT_FACTORY, EXECUTOR,
                    new SingleThreadedClaimStrategy(BUFFER_SIZE),
                    new SleepingWaitStrategy());
    disruptor.handleEventsWith(searchTermMatchingHandler)
        .then(appendStatusHandler,updatePriceHandler).then(persistUpdatesHandler);

    this.ringBuffer = disruptor.start();
}

Altrove, pubblico eventi. Ho provato ciascuno dei seguenti due approcci:

Evento Publishing Approccio A:

private void handleStatus(final Status status)
{

    long sequence = ringBuffer.next();
    TwitterStatusReceivedEvent event = ringBuffer.get(sequence);
    event.setStatus(status);
    event.setSearchInstruments(searchInstruments);
    ringBuffer.publish(sequence);
}

In questo scenario, ho trovato il primo EventHandler viene invocata, ma mai nulla al di là di questo.

Evento Publishing Approccio B:

private void handleStatus(final Status status)
{
    disruptor.publishEvent(new EventTranslator<TwitterStatusReceivedEvent>() {

        @Override
        public TwitterStatusReceivedEvent translateTo(
                TwitterStatusReceivedEvent event, long sequence) {
            event.setStatus(status);
            event.setSearchInstruments(searchInstruments);
            return event;
        }
    });
}

In questo scenario, trovo che nessuno dei gestori di eventi ottenere invocato a tutti.

Che cosa sto facendo di sbagliato?

Aggiorna

Ecco il mio EventHandler nella sua interezza. Come dovrei segnalando che l'elaborazione è completa?

public class SearchTermMatchingEventHandler implements EventHandler<TwitterStatusReceivedEvent> {

    @Override
    public void onEvent(TwitterStatusReceivedEvent event, long sequence,
            boolean endOfBatch) throws Exception {
        String statusText = event.getStatus().getText();
        for (Instrument instrument : event.getSearchInstruments())
        {
            if (statusText.contains(instrument.getSearchTerm()))
            {
                event.setMatchedInstrument(instrument);
                break;
            }
        }
    }

}
È stato utile?

Soluzione

Ogni gestore di eventi deve essere eseguito nel proprio thread che l'uscita solito fino a spegnere il disgregatore. Dal momento che si sta utilizzando un singolo esecutore filettato, solo il primo gestore di eventi che accade per l'esecuzione potrà mai funzionare. (I negozi di classe Disruptor ogni gestore in un HashMap in modo da quale gestore si snoda in esecuzione variano a)

Se si passa a un cachedThreadPool si dovrebbe trovare tutto inizia in esecuzione. Non avrete bisogno di fare qualsiasi gestione dei numeri di sequenza perché è tutto gestito dal EventProcessor che i set di classe Disruptor e gestisce per voi. Proprio l'elaborazione di ogni evento che si ottiene è esattamente a destra.

Altri suggerimenti

È necessario assicurarsi che il proprio searchTermMatchingHandler sta aggiornando il suo numero di sequenza dopo che elabora l'evento. I EventHandlers più a valle (appendStatusHandler, updatePriceHandler, persistUpdatesHandler) saranno ispezionando il numero di sequenza searchTermMatchingHandler per vedere quali eventi possono prendere fuori dal buffer circolare.

Ho avuto lo stesso problema, ma era perché ero istanziare il Disruptor utilizzando Primavera (Java config) ed è stato istanziare l'esecutore con lo stesso metodo @Bean come il disgregatore.

I risolto il problema istanziando dell'Executor in un metodo @Bean separata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top