Heim > Java > javaLernprogramm > Hauptteil

Schauen Sie sich kurz an, wie Spring Boot JMS unterstützt

DDD
Freigeben: 2024-11-02 10:30:03
Original
312 Leute haben es durchsucht

Quick look on how Spring Boot supports JMS

Beispielcode

Der Beispielcode stammt von hier mit einigen Änderungen. Zum Zeitpunkt des Schreibens wird Spring Boot 3.3.0 (Spring Framework 6.1.8) verwendet.

complete/pom.xml

Wechseln Sie zum eingebetteten ActiveMQ-Broker

<dependency>
    <groupId>org.springframework.boot</groupId>
    <!--<artifactId>spring-boot-starter-artemis</artifactId>-->
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.activemq</groupId>
    <!--<artifactId>artemis-jakarta-server</artifactId>-->
    <artifactId>activemq-broker</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- ... -->
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

complete/src/main/resources/application.properties

Schalten Sie die Debug-Protokollierung ein und richten Sie die eingebettete Broker-URL ein

#spring.artemis.mode=embedded
debug=true
spring.activemq.broker-url=vm://localhost?broker.persistent=false
Nach dem Login kopieren
Nach dem Login kopieren

complete/src/main/java/hello/Application.java

Verwenden Sie die von Spring Boot erstellte JmsListenerContainerFactory-Bean, anstatt sie selbst zu erstellen

@SpringBootApplication
@EnableJms
public class Application {

    /*@Bean
    public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        // This provides all auto-configured defaults to this factory, including the message converter
        configurer.configure(factory, connectionFactory);
        // You could still override some settings if necessary.
        return factory;
    }*/

    //...

}
Nach dem Login kopieren

complete/src/main/java/hello/Receiver.java

Geben Sie die Standardeinstellung JmsListenerContainerFactory
an

@Component
public class Receiver {

    //@JmsListener(destination = "mailbox", containerFactory = "myFactory")
    @JmsListener(destination = "mailbox")
    public void receiveMessage(Email email) {
        System.out.println("Received <" + email + ">");
    }

}
Nach dem Login kopieren

Spring Boot-Autokonfigurationsprotokoll

Nur ​​JMS-bezogene Konfiguration wird angezeigt.

   ActiveMQAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'jakarta.jms.ConnectionFactory', 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)
      - @ConditionalOnMissingBean (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ActiveMQAutoConfiguration#activemqConnectionDetails matched:
      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jms.activemq.ActiveMQConnectionDetails; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ActiveMQConnectionFactoryConfiguration matched:
      - @ConditionalOnMissingBean (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

   ActiveMQConnectionFactoryConfiguration.SimpleConnectionFactoryConfiguration matched:
      - @ConditionalOnProperty (spring.activemq.pool.enabled=false) matched (OnPropertyCondition)

   ActiveMQConnectionFactoryConfiguration.SimpleConnectionFactoryConfiguration.CachingConnectionFactoryConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.jms.connection.CachingConnectionFactory' (OnClassCondition)
      - @ConditionalOnProperty (spring.jms.cache.enabled=true) matched (OnPropertyCondition)

   JmsAnnotationDrivenConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.jms.annotation.EnableJms' (OnClassCondition)

   JmsAnnotationDrivenConfiguration#jmsListenerContainerFactory matched:
      - @ConditionalOnSingleCandidate (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) found a single bean 'jmsConnectionFactory'; @ConditionalOnMissingBean (names: jmsListenerContainerFactory; SearchStrategy: all) did not find any beans (OnBeanCondition)

   JmsAnnotationDrivenConfiguration#jmsListenerContainerFactoryConfigurer matched:
      - @ConditionalOnMissingBean (types: org.springframework.boot.autoconfigure.jms.DefaultJmsListenerContainerFactoryConfigurer; SearchStrategy: all) did not find any beans (OnBeanCondition)

   JmsAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'jakarta.jms.Message', 'org.springframework.jms.core.JmsTemplate' (OnClassCondition)
      - @ConditionalOnBean (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) found bean 'jmsConnectionFactory' (OnBeanCondition)

   JmsAutoConfiguration.JmsTemplateConfiguration#jmsTemplate matched:
      - @ConditionalOnSingleCandidate (types: jakarta.jms.ConnectionFactory; SearchStrategy: all) found a single bean 'jmsConnectionFactory'; @ConditionalOnMissingBean (types: org.springframework.jms.core.JmsOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)

   JmsAutoConfiguration.MessagingTemplateConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.jms.core.JmsMessagingTemplate' (OnClassCondition)

   JmsAutoConfiguration.MessagingTemplateConfiguration#jmsMessagingTemplate matched:
      - @ConditionalOnSingleCandidate (types: org.springframework.jms.core.JmsTemplate; SearchStrategy: all) found a single bean 'jmsTemplate'; @ConditionalOnMissingBean (types: org.springframework.jms.core.JmsMessageOperations; SearchStrategy: all) did not find any beans (OnBeanCondition)
Nach dem Login kopieren

Zugehörige Schnittstelle

Interface Function
org.springframework.jms.support.destination.DestinationResolver lookup jakarta.jms.Destination instance by String name
org.springframework.transaction.jta.JtaTransactionManager control transaction by JTA
org.springframework.jms.support.converter.MessageConverter serialize/deserialize DTO instance
jakarta.jms.ExceptionListener processor when jakarta.jms.JMSException throws. One implementation is SingleConnectionFactory, connection managed by that class will be restarted once exception is catched
io.micrometer.observation.ObservationRegistry for statistics

Über ConnectionFactory

Die Implementierung von ActiveMQ ist org.apache.activemq.ActiveMQConnectionFactory, aber Spring Framework verwendet sie nicht direkt. Die Klasse wird von org.springframework.jms.connection.CachingConnectionFactory zum Folgen

umschlossen
  • Es wird nur eine Verbindung erstellt und diese wird wiederverwendet
  • cache MessageProducer und MessageConsumer (In diesem Beispiel wird nur MessageProducer zwischengespeichert)

Herausgeber

Nachricht senden über org.springframework.jms.core.JmsTemplate

<dependency>
    <groupId>org.springframework.boot</groupId>
    <!--<artifactId>spring-boot-starter-artemis</artifactId>-->
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.activemq</groupId>
    <!--<artifactId>artemis-jakarta-server</artifactId>-->
    <artifactId>activemq-broker</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- ... -->
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

JmsTemplate Bean wird von org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration.JmsTemplateConfiguration#jmsTemplate erstellt. Für die Deserialisierung des DTO ist eine MessageConverter-Bean erforderlich.

Als

DestinationResolver wird org.springframework.jms.support.destination.DynamicDestinationResolver verwendet, die Klasse wird einfach durch Aufrufen der jakarta.jms.Destination-Instanz abgerufen 🎜>jakarta.jms.Session#createTopic oder jakarta.jms.Session#createQueue.

Teilnehmer

org.springframework.jms.annotation.JmsListener-Annotation

org.springframework.jms.listener.DefaultMessageListenerContainer-Klasse

In der JMS-Spezifikation wird die asynchrone Nachrichtenverarbeitung unterstützt und der Listener wird unter Threads des JMS-Anbieters ausgeführt.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <!--<artifactId>spring-boot-starter-artemis</artifactId>-->
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

<dependency>
    <groupId>org.apache.activemq</groupId>
    <!--<artifactId>artemis-jakarta-server</artifactId>-->
    <artifactId>activemq-broker</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- ... -->
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Aber asynchrone Ansätze werden im Spring Framework nicht verwendet, es wird eine synchrone API (Polling) verwendet. Der eigentliche Code befindet sich in org.springframework.jms.support.destination.JmsDestinationAccessor#receiveFromConsumer.

#spring.artemis.mode=embedded
debug=true
spring.activemq.broker-url=vm://localhost?broker.persistent=false
Nach dem Login kopieren
Nach dem Login kopieren
Die Klasse

org.springframework.jms.listener.DefaultMessageListenerContainer.AsyncMessageListenerInvoker dient der Durchführung regelmäßiger Abfragejobs. Dies ist in org.springframework.core.task.SimpleAsyncTaskExecutor geplant.

Eine DefaultMessageListenerContainer-Instanz wird für eine mit @JmsListener annotierte Funktion erstellt. Dies wird von org.springframework.jms.config.DefaultJmsListenerContainerFactory.

erstellt

Natürlich sind die Instanzen MessageConverter und ExceptionListener notwendig.

Das obige ist der detaillierte Inhalt vonSchauen Sie sich kurz an, wie Spring Boot JMS unterstützt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage