2017-08-08 3 views
2

Ich muss ein Thema und einen dauerhaften Abonnenten für ActiveMQ erstellen, ist mein Problem, dass ich nicht weiß, wo das angeben. Ich bin in der Lage, das Thema zu erstellen und die Nachrichten zu konsumieren, aber wenn ich den Abonnenten ausschalte, weiter Nachrichten sende und den Abonnenten wieder einschalte, wird er sie nicht lesen.Erstellen von dauerhaften Thema und Abonnenten Spring Boot jms mit ActiveMQ

Dies ist, was ich bisher:

die Nachricht gesendet:

JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class); 
    jmsTemplate.setPubSubDomain(true); 
    jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT); 
    jmsTemplate.setDeliveryPersistent(true); 
    jmsTemplate.convertAndSend("venta.topic",venta); 

die Nachricht empfangen:

@JmsListener(destination = "venta.topic",id = "comercial",subscription = "venta.topic") 
public void receiveMessage(Venta venta) { 
    logger.log(Level.INFO, "RECEIVED : {0}",venta);  
    repository.save(venta); 
} 

ich this article gelesen habe, und ich verstehe, dass ich erstellen müssen der dauerhafte Abonnent.

Ich habe auch gelesen, die spring docs

Und ich denke, es hat etwas mit der DefaultJmsListenerContainerFactory zu tun (was ich umgesetzt habe nicht ich die Standardkonfiguration verwende), die Dokumentation zeigt:

@Bean 
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { 
    DefaultJmsListenerContainerFactory factory = 
      new DefaultJmsListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory()); 
    factory.setDestinationResolver(destinationResolver()); 
    factory.setConcurrency("3-10"); 
    return factory; 
} 

Aber ich kann nicht scheinen, wo die dauerhafte Sitzung zu erstellen. Sowohl mein Produzent als auch mein Abonnent sind mit einer eigenständigen activemq-Binärdatei verbunden.

Ich hoffe, Sie können mir helfen, danke im Voraus.

Antwort

3

Da die bisherigen Antworten darauf hingewiesen, war es notwendig, die Client-ID und das dauerhafte Abonnement auf dem Werk zu setzen:

@Bean 
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { 
    DefaultJmsListenerContainerFactory factory = 
      new DefaultJmsListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory()); 
    factory.setDestinationResolver(destinationResolver()); 
    factory.setConcurrency("3-10"); 
    factory.setClientID("brokerClientId"); 
    factory.setSubscriptionDurable(true); 
    return factory; 
} 

aber das allein registrierte nicht die Client als dauerhafter Teilnehmer, ist, dass, weil die JMSListener die containerFactory angegeben benötigt, sonst wäre es nur die Standardeinstellung übernehmen:

@JmsListener(
destination = "venta.topic", 
id = "comercial", 
subscription = "venta.topic", 
//this was also needed with the same name as the bean above 
containerFactory = "jmsListenerContainerFactory" 
) 
public void receiveMessage(Venta venta) { 
      logger.log(Level.INFO, "RECEIVED : {0}",venta);  
      repository.save(venta); 
} 

Es ist erwähnenswert, dass this post derjenige war, bei dem ich meinen Fehler erkannte.

Ich hoffe, das jemand helfen wird, sonst

1

Schwer zu sagen, aber eine häufige Ursache für dieses Problem ist vergessen, eine eindeutige clientId für die connectionFactory Bean zu konfigurieren. Es muss einzigartig sein und ist die Art und Weise, wie der Broker jeden Kunden unterscheiden kann.

+1

Danke für mich in die richtige Richtung –

3

Die DefaultJmsListenerContainerFactory sollte eine eindeutige clientId und dauerhafte Unterversion haben. true gesetzt wie unten Code:

@Bean 
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { 
    DefaultJmsListenerContainerFactory factory = 
      new DefaultJmsListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory()); 
    factory.setDestinationResolver(destinationResolver()); 
    factory.setConcurrency("3-10"); 
    factory.setClientID("brokerClientId"); 
    factory.setSubscriptionDurable(true); 
    return factory; 
} 
+1

Danke für mich in die richtige Richtung, aber ich war immer noch das Problem hat, sieht aus wie ich die Fabrik registrieren benötigt auf dem JMSListener –

+0

richtig, müssen Sie die benutzerdefinierte ContainerFactory in Ihrem JmsListener registrieren. – Nir

Verwandte Themen