JMS Gateway mit javax.jms
Connection, Session, Producer und Message werden im Gateway manuell verwaltet.
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.
Connection, Session, Producer und Message werden im Gateway manuell verwaltet.
JmsTemplate kapselt Ressourcenverwaltung und Message-Konvertierung.
Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.
| Vergleichsgruppe | Legacy-Dateien | Modern-Dateien | Legacy-Zeilen | Modern-Zeilen | Ähnlichkeit |
|---|---|---|---|---|---|
| Build-Konfiguration | 1 | 1 | 46 | 43 | 38% |
| Bootstrap, Demo und Konfiguration | 1 | 3 | 24 | 30 | 15% |
| Messaging-Fluss und Test | 2 | 3 | 50 | 43 | 4% |
Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.
JMS- und Spring-Messaging-Abhängigkeiten werden verglichen.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| pom.xml | pom.xml | Direktvergleich Semantische Ähnlichkeit: 38% |
<?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><?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>Manuelles Starten wird durch Spring Boot und extern konfigurierte Demo ersetzt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| MessagingLegacyApplication.java | MessagingModernApplication.java MessageDemoRunner.java application.properties | Direktvergleich Semantische Ähnlichkeit: 15% |
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();
}
}
}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");
}
}spring.artemis.mode=embedded
spring.artemis.embedded.enabled=trueEin Gateway wird in Publisher und Listener mit integriertem Anwendungstest getrennt.
| Legacy-Dateien | Modern-Dateien | Einordnung |
|---|---|---|
| LegacyJmsGateway.java MessagingContractTest.java | OrderMessagePublisher.java OrderMessageListener.java MessagingModernApplicationTest.java | Direktvergleich Semantische Ähnlichkeit: 4% |
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();
}
}
}
}package at.aydin.lab.messaging.legacy;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
class MessagingContractTest {
@Test
void queueNameIsStable() {
assertEquals("orders", "orders");
}
}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);
}
}package at.aydin.lab.messaging.modern;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertNotNull;
class MessagingModernApplicationTest {
@Test
void applicationTypeExists() {
assertNotNull(MessagingModernApplication.class);
}
}