2009-12-23 11 views
17

Inizierò un piccolo progetto Java (GWT in realtà) nel prossimo futuro e sono nella fase di "raccolta di informazioni".Libreria Light Message Bus

D: Esiste una libreria di bus messaggi leggera scritta in Java?

I miei requisiti sono leggeri troppo :-)

  1. asincrone (senza bisogno di sincronizzazione)
  2. multicast e point-to-point
  3. alcun messaggio rigorosa ordinare
  4. messaggio "busta" idealmente "posseduto" da Message Bus (cioè in termini di gestione del ciclo di vita)
  5. consegna localizzata (cioè non inter-processo né inter-nodo)

Aggiornamento: Sembra che GWT ora supporti uno "event bus" integrato.

+0

Puoi guardare qui https://github.com/javaplugs/minibus è un bus di eventi estremamente leggero e semplice. – rumatoest

risposta

10

Dai un'occhiata allo eventbus.

(Collegamento fisso, grazie a jldupont per segnalarlo).

+1

È inoltre possibile effettuare il checkout all'indirizzo https://github.com/bennidi/mbassador.È molto leggero, veloce e utilizza riferimenti deboli. – bennidi

+0

@bennidi: dovresti postarla come una nuova risposta invece di usare un commento –

0

Non sono sicuro se è davvero leggero. Ma corrisponde al resto della tua descrizione: ActiveMQ

+0

@reinier: so delle soluzioni basate su AMQP: (1) non leggero (ovviamente è relativo ;-) (2) non proprio applicabile per un Progetto basato su GWT. – jldupont

+0

@jldupont: ah giusto ... tutto deve essere eseguito nello stesso processo nel browser giusto? Sì, in tal caso ignora questa idea; ^) – Toad

+0

@reinier: quindi eliminalo poichè probabilmente otterrai alcuni voti negativi ad un certo punto (non da me). – jldupont

0

Forse potresti provare una soluzione basata su jabber (XMPP). Che dire di openfire?

+0

@marcospereira: sei serio? non è perché non sottovaluto (spesso) che si può abusare qui! – jldupont

+0

jldupont: sì, sono serio. E non riesco a capire perché consideri il mio commento come un abuso. Se pensi che sia una soluzione sbagliata, metti alcuni argomenti sul tavolo. ;-) – marcospereira

+0

in realtà xmpp è abbastanza bello, ma forse ha troppo overhead – Leo

4

Se si utilizza già Spring, una comoda funzionalità di Spring è l'interfaccia ApplicationEventMulticaster, che è un'API molto semplice per la pubblicazione e la sottoscrizione di eventi generati dall'applicazione. Le implementazioni utilizzano il framework TaskExecutor, il che significa che possono essere sincronizzati o asincroni come desiderato. Inoltre, ogni ApplicationContext ha un metodo publishEvent, quindi è comicamente facile impostarlo per le classi gestite in Primavera.

Quindi sì, se già usi Spring, non c'è bisogno di un'altra utility per farlo, è già integrata.

+2

+1: molte grazie. Non userò Spring ma apprezzo sempre una buona informazione. – jldupont

9

So che questa è una vecchia questione, ma penso che una soluzione più moderna è quella di utilizzare Guava's Event Bus (concesso non sono sicuro se funzionerà per GWT, ma sia il titolo e tag non dire GWT).

In realtà ho una RabbitMQ simple message container personalizzata che creerà automaticamente i binding della coda e sui messaggi ricevuti verrà quindi inviata a Guava EventBus. È incredibilmente elegante e si adatta perfettamente.

È possibile utilizzare facilmente il framework DI per registrare gli abbonati. Per Spring, creo BeanPostProcessor che registrerà automaticamente i bean con @Subscribe.

Di seguito è la molla BeanPostProcessor:

package com.snaphop.spring; 

import java.lang.reflect.Method; 

import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.config.BeanPostProcessor; 
import org.springframework.stereotype.Component; 

import com.google.common.eventbus.EventBus; 
import com.google.common.eventbus.Subscribe; 

@Component 
public class EventBusBeanPostProcessor implements BeanPostProcessor { 

    private EventBus eventBus; 

    @Override 
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { 
     if (isApplicable(bean)) { 
      eventBus.register(bean); 
     } 
     return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { 
     return bean; 
    } 

    protected boolean isApplicable(Object bean) { 
     for(Method m : bean.getClass().getMethods()) { 
      if (m.isAnnotationPresent(Subscribe.class)) 
       return true; 
     } 
     return false; 
    } 

    @Autowired 
    public void setEventBus(EventBus eventBus) { 
     this.eventBus = eventBus; 
    } 

} 

Sono sicuro che è banale per fare qualcosa di simile in Guice.

+0

Ho provato a utilizzare il bus di eventi di google guavas e sono rimasto bloccato perché utilizza forti riferimenti agli ascoltatori. Volevo usarlo in un ambiente primaverile e inserire tutti i fagioli in esso utilizzando un post processore. Questo non funzionerà con guava. Ho creato la mia soluzione che è ospitata su github https://github.com/bennidi/mbassador. È abbastanza stabile ora (utilizzato in produzione per sei mesi) ed è più veloce del google bus. Offre anche più funzionalità ma è altrettanto facile da usare. – bennidi

+0

Ho realizzato la mia implementazione allo stesso modo, ma principalmente perché Guava utilizza JULI e non mi piace che abbia catturato l'eccezione. Dovrò controllare il tuo ... Ho anche notato che Guava utilizza una raccolta di Classe che può potenzialmente portare a perdite di permgen. –

+1

Cosa intendi per collezione di Classe potrebbe portare a perdite di permgen? Inoltre, apprezzerei molto il feedback su MBassador. Se manca una funzionalità che richiedi, puoi presentare un problema su github. – bennidi