Migration Deep Dive für 07 · Messaging öffnen →
⌂ ÜbersichtAlle Vergleiche
Modul 07 · 100 % Codeabdeckung

Messaging

Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.

4Legacy-Dateien
7Modern-Dateien
120 → 116Codezeilen
12/12vollständig erfasst

Fachliche Einordnung

Legacy

JMS Gateway mit javax.jms

Connection, Session, Producer und Message werden im Gateway manuell verwaltet.

Modern

Spring JmsTemplate Publisher

JmsTemplate kapselt Ressourcenverwaltung und Message-Konvertierung.

Vergleichsfokus: Alle Dateien werden nach technischer Rolle und fachlicher Verantwortung gruppiert.
Wichtige Abgrenzung: One-to-many-Änderungen werden als Gruppe dargestellt; eine künstliche 1:1-Zuordnung wird vermieden.

Vollständige Abdeckungsmatrix

Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.

VergleichsgruppeLegacy-DateienModern-DateienLegacy-ZeilenModern-ZeilenÄhnlichkeit
Build-Konfiguration11464338%
Bootstrap, Demo und Konfiguration13243015%
Messaging-Fluss und Test2350434%

Gemeinsame Modulstruktur

Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.

Gemeinsam · 19 Zeilenpom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>at.aydin.academy</groupId>
        <artifactId>java-modernization-deep-dive</artifactId>
        <version>1.0.0</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <artifactId>07messaging-pair</artifactId>
    <packaging>pom</packaging>
    <name>Messaging: Legacy und Modern</name>
    <modules>
        <module>legacy</module>
        <module>modern</module>
    </modules>
</project>

Alle semantischen Codevergleiche

01Build-KonfigurationDirektvergleich · Legacy 46 / Modern 43 Zeilen · Ähnlichkeit 38%

JMS- und Spring-Messaging-Abhängigkeiten werden verglichen.

Legacy-DateienModern-DateienEinordnung
pom.xmlpom.xmlDirektvergleich
Semantische Ähnlichkeit: 38%

Legacy

Legacy · 46 Zeilenlegacy/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>at.aydin.academy</groupId>
        <artifactId>07messaging-pair</artifactId>
        <version>1.0.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <artifactId>messaging-legacy</artifactId>
    <packaging>jar</packaging>
    <name>Messaging Legacy (JMS / ActiveMQ Classic)</name>
    <dependencies>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-broker</artifactId>
            <version>${activemq.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-client</artifactId>
            <version>${activemq.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.jms</groupId>
            <artifactId>javax.jms-api</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>

        </plugins>
    </build>
</project>

Modern

Modern · 43 Zeilenmodern/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>at.aydin.academy</groupId>
        <artifactId>07messaging-pair</artifactId>
        <version>1.0.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <artifactId>messaging-modern</artifactId>
    <packaging>jar</packaging>
    <name>Messaging Modern (Spring JMS / Artemis)</name>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-artemis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>artemis-jakarta-server</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
02Bootstrap, Demo und KonfigurationDirektvergleich · Legacy 24 / Modern 30 Zeilen · Ähnlichkeit 15%

Manuelles Starten wird durch Spring Boot und extern konfigurierte Demo ersetzt.

Legacy-DateienModern-DateienEinordnung
MessagingLegacyApplication.javaMessagingModernApplication.java
MessageDemoRunner.java
application.properties
Direktvergleich
Semantische Ähnlichkeit: 15%

Legacy

package at.aydin.lab.messaging.legacy;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.broker.BrokerService;

public final class MessagingLegacyApplication {
    private MessagingLegacyApplication() {
    }

    public static void main(String[] args) throws Exception {
        BrokerService broker = new BrokerService();
        broker.setBrokerName("legacy-demo");
        broker.setPersistent(false);
        broker.addConnector("vm://legacy-demo");
        broker.start();
        try {
            LegacyJmsGateway gateway = new LegacyJmsGateway(new ActiveMQConnectionFactory("vm://legacy-demo?create=false"));
            gateway.send("orders", "ORDER-1001");
            System.out.println("Empfangen: " + gateway.receive("orders", 2000));
        } finally {
            broker.stop();
        }
    }
}

Modern

package at.aydin.lab.messaging.modern;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MessagingModernApplication {
    public static void main(String[] args) {
        SpringApplication.run(MessagingModernApplication.class, args);
    }
}
package at.aydin.lab.messaging.modern;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class MessageDemoRunner implements CommandLineRunner {
    private final OrderMessagePublisher publisher;
    public MessageDemoRunner(OrderMessagePublisher publisher) {
        this.publisher = publisher;
    }

    @Override
    public void run(String ... args) {
        publisher.publish("ORDER-2001");
    }
}
03Messaging-Fluss und TestDirektvergleich · Legacy 50 / Modern 43 Zeilen · Ähnlichkeit 4%

Ein Gateway wird in Publisher und Listener mit integriertem Anwendungstest getrennt.

Legacy-DateienModern-DateienEinordnung
LegacyJmsGateway.java
MessagingContractTest.java
OrderMessagePublisher.java
OrderMessageListener.java
MessagingModernApplicationTest.java
Direktvergleich
Semantische Ähnlichkeit: 4%

Legacy

package at.aydin.lab.messaging.legacy;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;

// Design Pattern: Messaging Gateway
// Zweck: JMS-Infrastruktur wird hinter einfachen Sende-/Empfangsmethoden gekapselt.
public final class LegacyJmsGateway {
    private final ConnectionFactory connectionFactory;
    public LegacyJmsGateway(ConnectionFactory connectionFactory) {
        this.connectionFactory = connectionFactory;
    }

    public void send(String queueName, String payload) throws Exception {
        try (Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false,
            Session.AUTO_ACKNOWLEDGE)) {
            Queue queue = session.createQueue(queueName);
            try (MessageProducer producer = session.createProducer(queue)) {
                producer.send(session.createTextMessage(payload));
            }
        }
    }

    public String receive(String queueName, long timeoutMillis) throws Exception {
        try (Connection connection = connectionFactory.createConnection(); Session session = connection.createSession(false,
            Session.AUTO_ACKNOWLEDGE)) {
            connection.start();
            Queue queue = session.createQueue(queueName);
            try (MessageConsumer consumer = session.createConsumer(queue)) {
                return ((TextMessage) consumer.receive(timeoutMillis)).getText();
            }
        }
    }
}

Modern

package at.aydin.lab.messaging.modern;

import org.springframework.jms.core.JmsTemplate;
import org.springframework.stereotype.Component;

@Component
// Design Pattern: Messaging Gateway
// Zweck: Fachcode muss weder Connection noch Session verwalten.
public class OrderMessagePublisher {
    private final JmsTemplate jmsTemplate;
    public OrderMessagePublisher(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    public void publish(String orderNumber) {
        jmsTemplate.convertAndSend("orders", orderNumber);
    }
}
package at.aydin.lab.messaging.modern;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;

@Component
// Design Pattern: Message-Driven Consumer
// Zweck: Nachrichten werden ereignisorientiert verarbeitet.
public class OrderMessageListener {
    @JmsListener(destination = "orders")
    public void receive(String orderNumber) {
        System.out.println("Empfangen: " + orderNumber);
    }
}
⌂ Cockpit