forked from Alexey/DAS_2024_1
Merge pull request 'kalyshev_yan_lab_4' (#148) from kalyshev_yan_lab_4 into main
Reviewed-on: Alexey/DAS_2024_1#148
This commit is contained in:
commit
1cca5bf31f
47
kalyshev_yan_lab_4/README.md
Normal file
47
kalyshev_yan_lab_4/README.md
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Отчет. Лабораторная работа 4
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
В ходе лабораторной работы были изучены главы туториала по работе с RabbitMQ, в результате чего получен отчет о выполнении заданий каждой главы, представленный на скриншотах в папке /images:
|
||||||
|
|
||||||
|
- Первый туториал:
|
||||||
|
![Tutorial-1](./images/Tutorial-1.png)
|
||||||
|
- Второй туториал:
|
||||||
|
![Tutorial-2](./images/Tutorial-2.png)
|
||||||
|
- Третий туториал:
|
||||||
|
[Tutorial-3](./images/Tutorial-3.png)
|
||||||
|
|
||||||
|
Чтобы продемонстрировать работу сервисов посредством ассинхронного общения через брокер сообщений RabbitMQ была выбрана предметная область администрирования компьютеров, где мы отслеживаем события включения компьютеров.
|
||||||
|
|
||||||
|
Сервис-издатель "Publisher" публикует в очередь сообщений событие поступления заказа с некоторым номером. Сервисы-подписчики обрабатывают сообщения о заказах, при этом подписчики обрабатывают сообщение по-разному: один вид подписчика обрабатывает его со задержкой несколько секунд, другой - "мгновенно", они получают одни и те же сообщения, но соединены с разными очередями.
|
||||||
|
|
||||||
|
В качестве эксперимента изначально были запущены по одному экземпляру каждого вида. На Consumer2.png представлена работа мгновенно обрабатывающего подписчика, справляющегося с нагрузкой без увеличения размера очереди:
|
||||||
|
![Consumer 2](./images/Consumer2.PNG)
|
||||||
|
На Consumer1.png представлена работа подписчика, обрабатывающего сообщения с задержкой. В очереди накапливаются сообщения в состоянии 'Ready', которые готовы для того чтобы быть доставленными подписчикам. Сервис не справляется с нагрузкой, так как отправляются сообщения быстрее, чем обрабатываются:
|
||||||
|
![Consumer 1](./images/Consumer1.PNG)
|
||||||
|
Чтобы обеспечить равную скорость отправки и обработки, увеличивается количество экземпляров-подписчиков данного типа до трех. На Consumer1-scaling.png видно, что теперь длина очереди не растет и система справляется с поступающими сообщениями. Скорость "publish" и "consumer ack" также становится равной:
|
||||||
|
![Consumer 1](images/Consumer1-3_replicas.png)
|
||||||
|
|
||||||
|
## Как запустить
|
||||||
|
|
||||||
|
Для того, чтобы запустить сервисы, необходимо выполнить следующие действия:
|
||||||
|
|
||||||
|
1. Установить и запустить Docker Engine или Docker Desktop
|
||||||
|
2. Через консоль перейти в папку, в которой расположен файл docker-compose.yml
|
||||||
|
3. Выполнить команду для запуска брокера сообщений rabbitmq:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker compose up rabbit -d
|
||||||
|
```
|
||||||
|
|
||||||
|
4. Выполнить команду для запуска остальных контейнеров:
|
||||||
|
|
||||||
|
```
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Такой порядок запуска важен для того, чтобы брокер сообщений успел полностью запуститься и произвести действия для того, чтобы быть готовым принимать соединения от сервисов. Потому что указания depends_on не хватает для отслеживания завершения всех необходимых подготовительных процессов брокера.
|
||||||
|
|
||||||
|
## Видео-отчет
|
||||||
|
|
||||||
|
Работоспособность лабораторной работы можно оценить в следующем [видео]https://zyzf.space/s/iWxb6b4EFQjPias).
|
23
kalyshev_yan_lab_4/consumer-app/Dockerfile
Normal file
23
kalyshev_yan_lab_4/consumer-app/Dockerfile
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Используем образ Maven для сборки
|
||||||
|
FROM maven:3.8-eclipse-temurin-21-alpine AS build
|
||||||
|
|
||||||
|
# Устанавливаем рабочую директорию
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Копируем остальные исходные файлы
|
||||||
|
COPY pom.xml .
|
||||||
|
COPY src src
|
||||||
|
|
||||||
|
# Собираем весь проект
|
||||||
|
RUN mvn clean package -DskipTests
|
||||||
|
RUN mvn dependency:copy-dependencies
|
||||||
|
|
||||||
|
# Используем официальный образ JDK для запуска собранного jar-файла
|
||||||
|
FROM eclipse-temurin:21-jdk-alpine
|
||||||
|
|
||||||
|
# Копируем jar-файл из предыдущего этапа
|
||||||
|
COPY --from=build /app/target/*.jar /app.jar
|
||||||
|
COPY --from=build /app/target/dependency /
|
||||||
|
|
||||||
|
# Указываем команду для запуска приложения
|
||||||
|
CMD ["java", "-jar", "app.jar"]
|
50
kalyshev_yan_lab_4/consumer-app/pom.xml
Normal file
50
kalyshev_yan_lab_4/consumer-app/pom.xml
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>ru.somecompany</groupId>
|
||||||
|
<artifactId>consumer-app</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>3.2.3</version>
|
||||||
|
<relativePath/>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>21</maven.compiler.source>
|
||||||
|
<maven.compiler.target>21</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.rabbitmq</groupId>
|
||||||
|
<artifactId>amqp-client</artifactId>
|
||||||
|
<version>5.22.0</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.30</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,15 @@
|
|||||||
|
package ru.somecompany;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
|
||||||
|
import ru.somecompany.config.property.RabbitProperties;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@ConfigurationPropertiesScan(basePackageClasses = RabbitProperties.class)
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(Main.class, args);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,45 @@
|
|||||||
|
package ru.somecompany.config;
|
||||||
|
|
||||||
|
import com.rabbitmq.client.BuiltinExchangeType;
|
||||||
|
import com.rabbitmq.client.Channel;
|
||||||
|
import com.rabbitmq.client.Connection;
|
||||||
|
import com.rabbitmq.client.ConnectionFactory;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import ru.somecompany.config.property.RabbitProperties;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ConnectionFactoryConfig {
|
||||||
|
|
||||||
|
private final RabbitProperties rabbitProperties;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ConnectionFactory connectionFactory() {
|
||||||
|
ConnectionFactory factory = new ConnectionFactory();
|
||||||
|
factory.setHost(rabbitProperties.getHost());
|
||||||
|
factory.setPort(rabbitProperties.getPort());
|
||||||
|
return factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Connection connection(ConnectionFactory connectionFactory) throws IOException, TimeoutException {
|
||||||
|
return connectionFactory.newConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Channel channel(Connection connection) throws IOException {
|
||||||
|
var exchange = rabbitProperties.getExchange();
|
||||||
|
var queue = rabbitProperties.getQueue();
|
||||||
|
var channel = connection.createChannel();
|
||||||
|
|
||||||
|
channel.exchangeDeclare(exchange, BuiltinExchangeType.FANOUT);
|
||||||
|
channel.queueDeclare(queue, true, false, true, null);
|
||||||
|
channel.queueBind(queue, exchange, "");
|
||||||
|
return channel;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package ru.somecompany.config.property;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@ConfigurationProperties(prefix = "app.rabbit-properties")
|
||||||
|
public class RabbitProperties {
|
||||||
|
|
||||||
|
private String host;
|
||||||
|
|
||||||
|
private Integer port;
|
||||||
|
|
||||||
|
private Integer delay;
|
||||||
|
|
||||||
|
private String queue;
|
||||||
|
|
||||||
|
private String exchange;
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
package ru.somecompany.consumer;
|
||||||
|
|
||||||
|
import com.rabbitmq.client.AMQP;
|
||||||
|
import com.rabbitmq.client.Channel;
|
||||||
|
import com.rabbitmq.client.Connection;
|
||||||
|
import com.rabbitmq.client.DefaultConsumer;
|
||||||
|
import com.rabbitmq.client.Envelope;
|
||||||
|
import jakarta.annotation.PostConstruct;
|
||||||
|
import jakarta.annotation.PreDestroy;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import ru.somecompany.config.property.RabbitProperties;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class Consumer {
|
||||||
|
|
||||||
|
private final RabbitProperties rabbitProperties;
|
||||||
|
|
||||||
|
private final Connection connection;
|
||||||
|
private final Channel channel;
|
||||||
|
|
||||||
|
@PostConstruct
|
||||||
|
public void consume() {
|
||||||
|
try {
|
||||||
|
channel.basicQos(1);
|
||||||
|
channel.basicConsume(rabbitProperties.getQueue(), false, new DefaultConsumer(channel) {
|
||||||
|
@Override
|
||||||
|
public void handleDelivery(String consumerTag,
|
||||||
|
Envelope envelope,
|
||||||
|
AMQP.BasicProperties properties,
|
||||||
|
byte[] body) throws IOException {
|
||||||
|
long deliveryTag = envelope.getDeliveryTag();
|
||||||
|
|
||||||
|
String message = new String(body, StandardCharsets.UTF_8);
|
||||||
|
System.out.println(" [x] Received '" + message + "'");
|
||||||
|
|
||||||
|
var delay = rabbitProperties.getDelay();
|
||||||
|
try {
|
||||||
|
doWork(delay);
|
||||||
|
} finally {
|
||||||
|
System.out.println(" [x] Processed '" + message + "'");
|
||||||
|
channel.basicAck(deliveryTag, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (Exception exception) {
|
||||||
|
log.error("Error while set up connection with rabbit", exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void doWork(Integer delay) {
|
||||||
|
if (delay > 0) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(delay);
|
||||||
|
} catch (InterruptedException _ignored) {
|
||||||
|
Thread.currentThread().interrupt();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreDestroy
|
||||||
|
public void cleanUp() throws Exception {
|
||||||
|
if (channel != null) {
|
||||||
|
channel.close();
|
||||||
|
}
|
||||||
|
if (connection != null) {
|
||||||
|
connection.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,10 @@
|
|||||||
|
server:
|
||||||
|
port: ${SERVER_PORT:8081}
|
||||||
|
|
||||||
|
app:
|
||||||
|
rabbit-properties:
|
||||||
|
host: ${RABBIT_HOST:localhost}
|
||||||
|
port: ${RABBIT_PORT:5672}
|
||||||
|
delay: ${PROCESS_DELAY:0}
|
||||||
|
queue: ${QUEUE_NAME:queue-1}
|
||||||
|
exchange: ${EXCHANGE_NAME:software-events}
|
55
kalyshev_yan_lab_4/docker-compose.yml
Normal file
55
kalyshev_yan_lab_4/docker-compose.yml
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
services:
|
||||||
|
rabbit:
|
||||||
|
container_name: rabbit
|
||||||
|
image: rabbitmq:3-management
|
||||||
|
ports:
|
||||||
|
- "15672:15672"
|
||||||
|
- "5672:5672"
|
||||||
|
- "5671:5671"
|
||||||
|
networks:
|
||||||
|
- rabbit
|
||||||
|
|
||||||
|
publisher:
|
||||||
|
build: ./publisher-app
|
||||||
|
container_name: publisher
|
||||||
|
depends_on:
|
||||||
|
- rabbit
|
||||||
|
environment:
|
||||||
|
RABBIT_HOST: rabbit
|
||||||
|
RABBIT_PORT: 5672
|
||||||
|
networks:
|
||||||
|
- rabbit
|
||||||
|
|
||||||
|
consumer-1:
|
||||||
|
build: ./consumer-app
|
||||||
|
depends_on:
|
||||||
|
- rabbit
|
||||||
|
- publisher
|
||||||
|
environment:
|
||||||
|
RABBIT_HOST: rabbit
|
||||||
|
RABBIT_PORT: 5672
|
||||||
|
PROCESS_DELAY: 3000
|
||||||
|
QUEUE_NAME: queue1
|
||||||
|
EXCHANGE_NAME: software-events
|
||||||
|
deploy:
|
||||||
|
replicas: 3
|
||||||
|
networks:
|
||||||
|
- rabbit
|
||||||
|
|
||||||
|
consumer-2:
|
||||||
|
build: ./consumer-app
|
||||||
|
container_name: consumer-2
|
||||||
|
depends_on:
|
||||||
|
- rabbit
|
||||||
|
- publisher
|
||||||
|
environment:
|
||||||
|
RABBIT_HOST: rabbit
|
||||||
|
RABBIT_PORT: 5672
|
||||||
|
PROCESS_DELAY: 0
|
||||||
|
QUEUE_NAME: queue2
|
||||||
|
EXCHANGE_NAME: software-events
|
||||||
|
networks:
|
||||||
|
- rabbit
|
||||||
|
|
||||||
|
networks:
|
||||||
|
rabbit:
|
BIN
kalyshev_yan_lab_4/images/Consumer1-3_replicas.PNG
Normal file
BIN
kalyshev_yan_lab_4/images/Consumer1-3_replicas.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
BIN
kalyshev_yan_lab_4/images/Consumer1.PNG
Normal file
BIN
kalyshev_yan_lab_4/images/Consumer1.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 39 KiB |
BIN
kalyshev_yan_lab_4/images/Consumer2.PNG
Normal file
BIN
kalyshev_yan_lab_4/images/Consumer2.PNG
Normal file
Binary file not shown.
After Width: | Height: | Size: 28 KiB |
BIN
kalyshev_yan_lab_4/images/Tutorial-1.png
Normal file
BIN
kalyshev_yan_lab_4/images/Tutorial-1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 567 KiB |
BIN
kalyshev_yan_lab_4/images/Tutorial-2.png
Normal file
BIN
kalyshev_yan_lab_4/images/Tutorial-2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 549 KiB |
BIN
kalyshev_yan_lab_4/images/Tutorial-3.png
Normal file
BIN
kalyshev_yan_lab_4/images/Tutorial-3.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 500 KiB |
38
kalyshev_yan_lab_4/publisher-app/.gitignore
vendored
Normal file
38
kalyshev_yan_lab_4/publisher-app/.gitignore
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
target/
|
||||||
|
!.mvn/wrapper/maven-wrapper.jar
|
||||||
|
!**/src/main/**/target/
|
||||||
|
!**/src/test/**/target/
|
||||||
|
|
||||||
|
### IntelliJ IDEA ###
|
||||||
|
.idea/modules.xml
|
||||||
|
.idea/jarRepositories.xml
|
||||||
|
.idea/compiler.xml
|
||||||
|
.idea/libraries/
|
||||||
|
*.iws
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
.apt_generated
|
||||||
|
.classpath
|
||||||
|
.factorypath
|
||||||
|
.project
|
||||||
|
.settings
|
||||||
|
.springBeans
|
||||||
|
.sts4-cache
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
/nbproject/private/
|
||||||
|
/nbbuild/
|
||||||
|
/dist/
|
||||||
|
/nbdist/
|
||||||
|
/.nb-gradle/
|
||||||
|
build/
|
||||||
|
!**/src/main/**/build/
|
||||||
|
!**/src/test/**/build/
|
||||||
|
|
||||||
|
### VS Code ###
|
||||||
|
.vscode/
|
||||||
|
|
||||||
|
### Mac OS ###
|
||||||
|
.DS_Store
|
21
kalyshev_yan_lab_4/publisher-app/Dockerfile
Normal file
21
kalyshev_yan_lab_4/publisher-app/Dockerfile
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
# Используем образ Maven для сборки
|
||||||
|
FROM maven:3.8-eclipse-temurin-21-alpine AS build
|
||||||
|
|
||||||
|
# Устанавливаем рабочую директорию
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Копируем остальные исходные файлы
|
||||||
|
COPY pom.xml .
|
||||||
|
COPY src src
|
||||||
|
|
||||||
|
# Собираем весь проект
|
||||||
|
RUN mvn clean package -DskipTests
|
||||||
|
|
||||||
|
# Используем официальный образ JDK для запуска собранного jar-файла
|
||||||
|
FROM eclipse-temurin:21-jdk-alpine
|
||||||
|
|
||||||
|
# Копируем jar-файл из предыдущего этапа
|
||||||
|
COPY --from=build /app/target/*.jar /app.jar
|
||||||
|
|
||||||
|
# Указываем команду для запуска приложения
|
||||||
|
CMD ["java", "-jar", "app.jar"]
|
49
kalyshev_yan_lab_4/publisher-app/pom.xml
Normal file
49
kalyshev_yan_lab_4/publisher-app/pom.xml
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|
||||||
|
<groupId>ru.somecompany</groupId>
|
||||||
|
<artifactId>publisher-app</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>3.2.3</version>
|
||||||
|
<relativePath/>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<maven.compiler.source>21</maven.compiler.source>
|
||||||
|
<maven.compiler.target>21</maven.compiler.target>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.projectlombok</groupId>
|
||||||
|
<artifactId>lombok</artifactId>
|
||||||
|
<version>1.18.30</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.rabbitmq</groupId>
|
||||||
|
<artifactId>amqp-client</artifactId>
|
||||||
|
<version>5.22.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</project>
|
@ -0,0 +1,17 @@
|
|||||||
|
package ru.somecompany;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
import ru.somecompany.config.property.RabbitProperties;
|
||||||
|
|
||||||
|
@EnableScheduling
|
||||||
|
@SpringBootApplication
|
||||||
|
@ConfigurationPropertiesScan(basePackageClasses = RabbitProperties.class)
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(Main.class, args);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package ru.somecompany.config;
|
||||||
|
|
||||||
|
import com.rabbitmq.client.BuiltinExchangeType;
|
||||||
|
import com.rabbitmq.client.Channel;
|
||||||
|
import com.rabbitmq.client.Connection;
|
||||||
|
import com.rabbitmq.client.ConnectionFactory;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import ru.somecompany.config.property.RabbitProperties;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class ConnectionFactoryConfig {
|
||||||
|
|
||||||
|
private final RabbitProperties rabbitProperties;
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public ConnectionFactory connectionFactory() {
|
||||||
|
ConnectionFactory factory = new ConnectionFactory();
|
||||||
|
factory.setHost(rabbitProperties.getHost());
|
||||||
|
factory.setPort(rabbitProperties.getPort());
|
||||||
|
return factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Connection connection(ConnectionFactory connectionFactory) throws IOException, TimeoutException {
|
||||||
|
return connectionFactory.newConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Channel channel(Connection connection) throws IOException {
|
||||||
|
var channel = connection.createChannel();
|
||||||
|
channel.exchangeDeclare(rabbitProperties.getExchange(), BuiltinExchangeType.FANOUT);
|
||||||
|
return channel;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package ru.somecompany.config.property;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@ConfigurationProperties(prefix = "app.rabbit-properties")
|
||||||
|
public class RabbitProperties {
|
||||||
|
|
||||||
|
private String host;
|
||||||
|
|
||||||
|
private Integer port;
|
||||||
|
|
||||||
|
private String exchange;
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package ru.somecompany.scheduler;
|
||||||
|
|
||||||
|
import com.rabbitmq.client.BuiltinExchangeType;
|
||||||
|
import com.rabbitmq.client.Channel;
|
||||||
|
import com.rabbitmq.client.Connection;
|
||||||
|
import com.rabbitmq.client.ConnectionFactory;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class SenderScheduler {
|
||||||
|
|
||||||
|
private static final String EXCHANGE_NAME = "software-events";
|
||||||
|
private static final String MESSAGE = "Компьютер включился №%d";
|
||||||
|
private Integer index = 0;
|
||||||
|
|
||||||
|
private final ConnectionFactory connectionFactory;
|
||||||
|
private final Connection connection;
|
||||||
|
private final Channel channel;
|
||||||
|
|
||||||
|
@Scheduled(cron = "*/1 * * * * *")
|
||||||
|
public void sendMessage() {
|
||||||
|
try {
|
||||||
|
var message = String.format(MESSAGE, index);
|
||||||
|
|
||||||
|
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes(StandardCharsets.UTF_8));
|
||||||
|
index++;
|
||||||
|
System.out.println(" [x] Sent '" + message + "'");
|
||||||
|
} catch (IOException e) {
|
||||||
|
System.out.println(" [x] Error while send message");
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
server:
|
||||||
|
port: ${SERVER_PORT:8080}
|
||||||
|
|
||||||
|
app:
|
||||||
|
rabbit-properties:
|
||||||
|
host: ${RABBIT_HOST:localhost}
|
||||||
|
port: ${RABBIT_PORT:5672}
|
||||||
|
exchange: ${EXCHANGE_NAME:software-events}
|
BIN
kalyshev_yan_lab_4/spring-amqp/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
BIN
kalyshev_yan_lab_4/spring-amqp/.mvn/wrapper/maven-wrapper.jar
vendored
Normal file
Binary file not shown.
18
kalyshev_yan_lab_4/spring-amqp/.mvn/wrapper/maven-wrapper.properties
vendored
Executable file
18
kalyshev_yan_lab_4/spring-amqp/.mvn/wrapper/maven-wrapper.properties
vendored
Executable file
@ -0,0 +1,18 @@
|
|||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.6/apache-maven-3.9.6-bin.zip
|
||||||
|
wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar
|
108
kalyshev_yan_lab_4/spring-amqp/README.md
Normal file
108
kalyshev_yan_lab_4/spring-amqp/README.md
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
# RabbitMQ Tutorial Using Spring AMQP
|
||||||
|
|
||||||
|
This project implements each of the [6 RabbitMQ Tutorials][1] using Spring AMQP.
|
||||||
|
|
||||||
|
It is a CLI app that uses Spring Profiles to control its behavior. Each tutorial is a trio of classes:
|
||||||
|
sender, receiver, and configuration.
|
||||||
|
|
||||||
|
[1]: https://www.rabbitmq.com/getstarted.html
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
These tutorials assume RabbitMQ is [installed](https://rabbitmq.com/download.html) and running
|
||||||
|
on `localhost` using the standard port (`5672`). In case you use
|
||||||
|
a different host, port or credentials, connections settings would require adjusting.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
These tutorials use Maven. To build them run
|
||||||
|
|
||||||
|
```
|
||||||
|
./mvnw clean package
|
||||||
|
```
|
||||||
|
The app uses Spring Profiles to control what tutorial it's running, and if it's a
|
||||||
|
Sender or Receiver. Choose which tutorial to run by using these profiles:
|
||||||
|
|
||||||
|
- {tut1|hello-world},{sender|receiver}
|
||||||
|
- {tut2|work-queues},{sender|receiver}
|
||||||
|
- {tut3|pub-sub|publish-subscribe},{sender|receiver}
|
||||||
|
- {tut4|routing},{sender|receiver}
|
||||||
|
- {tut5|topics},{sender|receiver}
|
||||||
|
- {tut6|rpc},{client|server}
|
||||||
|
|
||||||
|
After building with maven, run the app however you like to run boot apps.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,sender
|
||||||
|
```
|
||||||
|
|
||||||
|
will run the publisher part of tutorial 2 (Work Queues).
|
||||||
|
|
||||||
|
For tutorials 1-5, run the consumer (receiver) followed by the publisher (sender):
|
||||||
|
|
||||||
|
```
|
||||||
|
# shell 1
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,receiver
|
||||||
|
|
||||||
|
# shell 2
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,sender
|
||||||
|
```
|
||||||
|
|
||||||
|
For tutorial 6, run the server followed by the client.
|
||||||
|
|
||||||
|
You can find more usage instructions by running the following command:
|
||||||
|
|
||||||
|
```
|
||||||
|
java -jar target/rabbitmq-tutorials.jar
|
||||||
|
```
|
||||||
|
|
||||||
|
This will display the following message:
|
||||||
|
|
||||||
|
```
|
||||||
|
This app uses Spring Profiles to control its behavior.
|
||||||
|
|
||||||
|
Options are:
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=hello-world,receiver
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=hello-world,sender
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,receiver
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,sender
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=pub-sub,receiver
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=pub-sub,sender
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=routing,receiver
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=routing,sender
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=topics,receiver
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=topics,sender
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=rpc,client
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=rpc,server
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
When running receivers/servers it's useful to set the duration the app runs to a longer time. Do this by setting
|
||||||
|
the `tutorial.client.duration` property.
|
||||||
|
|
||||||
|
```
|
||||||
|
java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=tut2,receiver,remote --tutorial.client.duration=60000
|
||||||
|
```
|
||||||
|
|
||||||
|
By default, Spring AMQP uses localhost to connect to RabbitMQ. In the
|
||||||
|
sample, the `remote` profile causes Spring to load the properties in
|
||||||
|
`application-remote.yml` that are used for testing with a non-local
|
||||||
|
server. Set your own properties in the one in the project, or provide
|
||||||
|
your own on the command line when you run it.
|
||||||
|
|
||||||
|
To use to a remote RabbitMQ installation set the following properties:
|
||||||
|
|
||||||
|
```
|
||||||
|
spring:
|
||||||
|
rabbitmq:
|
||||||
|
host: <rabbitmq-server>
|
||||||
|
username: <tutorial-user>
|
||||||
|
password: <tutorial-user>
|
||||||
|
```
|
||||||
|
|
||||||
|
To use this at runtime create a file called `application-remote.yml` (or properties) and set the properties in there. Then set the
|
||||||
|
remote profile as in the example above. See the [Spring Boot](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/)
|
||||||
|
and [Spring AMQP documentation](https://docs.spring.io/spring-amqp/reference/html/) for more information on setting application
|
||||||
|
properties and AMQP properties specifically.
|
308
kalyshev_yan_lab_4/spring-amqp/mvnw
vendored
Executable file
308
kalyshev_yan_lab_4/spring-amqp/mvnw
vendored
Executable file
@ -0,0 +1,308 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
# or more contributor license agreements. See the NOTICE file
|
||||||
|
# distributed with this work for additional information
|
||||||
|
# regarding copyright ownership. The ASF licenses this file
|
||||||
|
# to you under the Apache License, Version 2.0 (the
|
||||||
|
# "License"); you may not use this file except in compliance
|
||||||
|
# with the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing,
|
||||||
|
# software distributed under the License is distributed on an
|
||||||
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
# KIND, either express or implied. See the License for the
|
||||||
|
# specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
# Apache Maven Wrapper startup batch script, version 3.2.0
|
||||||
|
#
|
||||||
|
# Required ENV vars:
|
||||||
|
# ------------------
|
||||||
|
# JAVA_HOME - location of a JDK home dir
|
||||||
|
#
|
||||||
|
# Optional ENV vars
|
||||||
|
# -----------------
|
||||||
|
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||||
|
# e.g. to debug Maven itself, use
|
||||||
|
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||||
|
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||||
|
# ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
if [ -z "$MAVEN_SKIP_RC" ] ; then
|
||||||
|
|
||||||
|
if [ -f /usr/local/etc/mavenrc ] ; then
|
||||||
|
. /usr/local/etc/mavenrc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f /etc/mavenrc ] ; then
|
||||||
|
. /etc/mavenrc
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$HOME/.mavenrc" ] ; then
|
||||||
|
. "$HOME/.mavenrc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
# OS specific support. $var _must_ be set to either true or false.
|
||||||
|
cygwin=false;
|
||||||
|
darwin=false;
|
||||||
|
mingw=false
|
||||||
|
case "$(uname)" in
|
||||||
|
CYGWIN*) cygwin=true ;;
|
||||||
|
MINGW*) mingw=true;;
|
||||||
|
Darwin*) darwin=true
|
||||||
|
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
|
||||||
|
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
|
||||||
|
if [ -z "$JAVA_HOME" ]; then
|
||||||
|
if [ -x "/usr/libexec/java_home" ]; then
|
||||||
|
JAVA_HOME="$(/usr/libexec/java_home)"; export JAVA_HOME
|
||||||
|
else
|
||||||
|
JAVA_HOME="/Library/Java/Home"; export JAVA_HOME
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] ; then
|
||||||
|
if [ -r /etc/gentoo-release ] ; then
|
||||||
|
JAVA_HOME=$(java-config --jre-home)
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Cygwin, ensure paths are in UNIX format before anything is touched
|
||||||
|
if $cygwin ; then
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME=$(cygpath --unix "$JAVA_HOME")
|
||||||
|
[ -n "$CLASSPATH" ] &&
|
||||||
|
CLASSPATH=$(cygpath --path --unix "$CLASSPATH")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# For Mingw, ensure paths are in UNIX format before anything is touched
|
||||||
|
if $mingw ; then
|
||||||
|
[ -n "$JAVA_HOME" ] && [ -d "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME="$(cd "$JAVA_HOME" || (echo "cannot cd into $JAVA_HOME."; exit 1); pwd)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ]; then
|
||||||
|
javaExecutable="$(which javac)"
|
||||||
|
if [ -n "$javaExecutable" ] && ! [ "$(expr "\"$javaExecutable\"" : '\([^ ]*\)')" = "no" ]; then
|
||||||
|
# readlink(1) is not available as standard on Solaris 10.
|
||||||
|
readLink=$(which readlink)
|
||||||
|
if [ ! "$(expr "$readLink" : '\([^ ]*\)')" = "no" ]; then
|
||||||
|
if $darwin ; then
|
||||||
|
javaHome="$(dirname "\"$javaExecutable\"")"
|
||||||
|
javaExecutable="$(cd "\"$javaHome\"" && pwd -P)/javac"
|
||||||
|
else
|
||||||
|
javaExecutable="$(readlink -f "\"$javaExecutable\"")"
|
||||||
|
fi
|
||||||
|
javaHome="$(dirname "\"$javaExecutable\"")"
|
||||||
|
javaHome=$(expr "$javaHome" : '\(.*\)/bin')
|
||||||
|
JAVA_HOME="$javaHome"
|
||||||
|
export JAVA_HOME
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVACMD" ] ; then
|
||||||
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
|
JAVACMD="$JAVA_HOME/jre/sh/java"
|
||||||
|
else
|
||||||
|
JAVACMD="$JAVA_HOME/bin/java"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
JAVACMD="$(\unset -f command 2>/dev/null; \command -v java)"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
|
echo "Error: JAVA_HOME is not defined correctly." >&2
|
||||||
|
echo " We cannot execute $JAVACMD" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$JAVA_HOME" ] ; then
|
||||||
|
echo "Warning: JAVA_HOME environment variable is not set."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# traverses directory structure from process work directory to filesystem root
|
||||||
|
# first directory with .mvn subdirectory is considered project base directory
|
||||||
|
find_maven_basedir() {
|
||||||
|
if [ -z "$1" ]
|
||||||
|
then
|
||||||
|
echo "Path not specified to find_maven_basedir"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
basedir="$1"
|
||||||
|
wdir="$1"
|
||||||
|
while [ "$wdir" != '/' ] ; do
|
||||||
|
if [ -d "$wdir"/.mvn ] ; then
|
||||||
|
basedir=$wdir
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
|
||||||
|
if [ -d "${wdir}" ]; then
|
||||||
|
wdir=$(cd "$wdir/.." || exit 1; pwd)
|
||||||
|
fi
|
||||||
|
# end of workaround
|
||||||
|
done
|
||||||
|
printf '%s' "$(cd "$basedir" || exit 1; pwd)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# concatenates all lines of a file
|
||||||
|
concat_lines() {
|
||||||
|
if [ -f "$1" ]; then
|
||||||
|
# Remove \r in case we run on Windows within Git Bash
|
||||||
|
# and check out the repository with auto CRLF management
|
||||||
|
# enabled. Otherwise, we may read lines that are delimited with
|
||||||
|
# \r\n and produce $'-Xarg\r' rather than -Xarg due to word
|
||||||
|
# splitting rules.
|
||||||
|
tr -s '\r\n' ' ' < "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
log() {
|
||||||
|
if [ "$MVNW_VERBOSE" = true ]; then
|
||||||
|
printf '%s\n' "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
BASE_DIR=$(find_maven_basedir "$(dirname "$0")")
|
||||||
|
if [ -z "$BASE_DIR" ]; then
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
|
||||||
|
MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}; export MAVEN_PROJECTBASEDIR
|
||||||
|
log "$MAVEN_PROJECTBASEDIR"
|
||||||
|
|
||||||
|
##########################################################################################
|
||||||
|
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||||
|
# This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||||
|
##########################################################################################
|
||||||
|
wrapperJarPath="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar"
|
||||||
|
if [ -r "$wrapperJarPath" ]; then
|
||||||
|
log "Found $wrapperJarPath"
|
||||||
|
else
|
||||||
|
log "Couldn't find $wrapperJarPath, downloading it ..."
|
||||||
|
|
||||||
|
if [ -n "$MVNW_REPOURL" ]; then
|
||||||
|
wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||||
|
else
|
||||||
|
wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||||
|
fi
|
||||||
|
while IFS="=" read -r key value; do
|
||||||
|
# Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' )
|
||||||
|
safeValue=$(echo "$value" | tr -d '\r')
|
||||||
|
case "$key" in (wrapperUrl) wrapperUrl="$safeValue"; break ;;
|
||||||
|
esac
|
||||||
|
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
|
||||||
|
log "Downloading from: $wrapperUrl"
|
||||||
|
|
||||||
|
if $cygwin; then
|
||||||
|
wrapperJarPath=$(cygpath --path --windows "$wrapperJarPath")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v wget > /dev/null; then
|
||||||
|
log "Found wget ... using wget"
|
||||||
|
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet"
|
||||||
|
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||||
|
wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||||
|
else
|
||||||
|
wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
|
||||||
|
fi
|
||||||
|
elif command -v curl > /dev/null; then
|
||||||
|
log "Found curl ... using curl"
|
||||||
|
[ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent"
|
||||||
|
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
|
||||||
|
curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
|
||||||
|
else
|
||||||
|
curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "Falling back to using Java to download"
|
||||||
|
javaSource="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.java"
|
||||||
|
javaClass="$MAVEN_PROJECTBASEDIR/.mvn/wrapper/MavenWrapperDownloader.class"
|
||||||
|
# For Cygwin, switch paths to Windows format before running javac
|
||||||
|
if $cygwin; then
|
||||||
|
javaSource=$(cygpath --path --windows "$javaSource")
|
||||||
|
javaClass=$(cygpath --path --windows "$javaClass")
|
||||||
|
fi
|
||||||
|
if [ -e "$javaSource" ]; then
|
||||||
|
if [ ! -e "$javaClass" ]; then
|
||||||
|
log " - Compiling MavenWrapperDownloader.java ..."
|
||||||
|
("$JAVA_HOME/bin/javac" "$javaSource")
|
||||||
|
fi
|
||||||
|
if [ -e "$javaClass" ]; then
|
||||||
|
log " - Running MavenWrapperDownloader.java ..."
|
||||||
|
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$wrapperUrl" "$wrapperJarPath") || rm -f "$wrapperJarPath"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
##########################################################################################
|
||||||
|
# End of extension
|
||||||
|
##########################################################################################
|
||||||
|
|
||||||
|
# If specified, validate the SHA-256 sum of the Maven wrapper jar file
|
||||||
|
wrapperSha256Sum=""
|
||||||
|
while IFS="=" read -r key value; do
|
||||||
|
case "$key" in (wrapperSha256Sum) wrapperSha256Sum=$value; break ;;
|
||||||
|
esac
|
||||||
|
done < "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties"
|
||||||
|
if [ -n "$wrapperSha256Sum" ]; then
|
||||||
|
wrapperSha256Result=false
|
||||||
|
if command -v sha256sum > /dev/null; then
|
||||||
|
if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c > /dev/null 2>&1; then
|
||||||
|
wrapperSha256Result=true
|
||||||
|
fi
|
||||||
|
elif command -v shasum > /dev/null; then
|
||||||
|
if echo "$wrapperSha256Sum $wrapperJarPath" | shasum -a 256 -c > /dev/null 2>&1; then
|
||||||
|
wrapperSha256Result=true
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available."
|
||||||
|
echo "Please install either command, or disable validation by removing 'wrapperSha256Sum' from your maven-wrapper.properties."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [ $wrapperSha256Result = false ]; then
|
||||||
|
echo "Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised." >&2
|
||||||
|
echo "Investigate or delete $wrapperJarPath to attempt a clean download." >&2
|
||||||
|
echo "If you updated your Maven version, you need to update the specified wrapperSha256Sum property." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
|
||||||
|
|
||||||
|
# For Cygwin, switch paths to Windows format before running java
|
||||||
|
if $cygwin; then
|
||||||
|
[ -n "$JAVA_HOME" ] &&
|
||||||
|
JAVA_HOME=$(cygpath --path --windows "$JAVA_HOME")
|
||||||
|
[ -n "$CLASSPATH" ] &&
|
||||||
|
CLASSPATH=$(cygpath --path --windows "$CLASSPATH")
|
||||||
|
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
|
||||||
|
MAVEN_PROJECTBASEDIR=$(cygpath --path --windows "$MAVEN_PROJECTBASEDIR")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Provide a "standardized" way to retrieve the CLI args that will
|
||||||
|
# work with both Windows and non-Windows executions.
|
||||||
|
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $*"
|
||||||
|
export MAVEN_CMD_LINE_ARGS
|
||||||
|
|
||||||
|
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||||
|
|
||||||
|
# shellcheck disable=SC2086 # safe args
|
||||||
|
exec "$JAVACMD" \
|
||||||
|
$MAVEN_OPTS \
|
||||||
|
$MAVEN_DEBUG_OPTS \
|
||||||
|
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
|
||||||
|
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
|
||||||
|
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
|
205
kalyshev_yan_lab_4/spring-amqp/mvnw.cmd
vendored
Normal file
205
kalyshev_yan_lab_4/spring-amqp/mvnw.cmd
vendored
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
@REM Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
@REM or more contributor license agreements. See the NOTICE file
|
||||||
|
@REM distributed with this work for additional information
|
||||||
|
@REM regarding copyright ownership. The ASF licenses this file
|
||||||
|
@REM to you under the Apache License, Version 2.0 (the
|
||||||
|
@REM "License"); you may not use this file except in compliance
|
||||||
|
@REM with the License. You may obtain a copy of the License at
|
||||||
|
@REM
|
||||||
|
@REM http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
@REM
|
||||||
|
@REM Unless required by applicable law or agreed to in writing,
|
||||||
|
@REM software distributed under the License is distributed on an
|
||||||
|
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
@REM KIND, either express or implied. See the License for the
|
||||||
|
@REM specific language governing permissions and limitations
|
||||||
|
@REM under the License.
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
@REM Apache Maven Wrapper startup batch script, version 3.2.0
|
||||||
|
@REM
|
||||||
|
@REM Required ENV vars:
|
||||||
|
@REM JAVA_HOME - location of a JDK home dir
|
||||||
|
@REM
|
||||||
|
@REM Optional ENV vars
|
||||||
|
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
|
||||||
|
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
|
||||||
|
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
|
||||||
|
@REM e.g. to debug Maven itself, use
|
||||||
|
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
|
||||||
|
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
|
||||||
|
@REM ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
|
||||||
|
@echo off
|
||||||
|
@REM set title of command window
|
||||||
|
title %0
|
||||||
|
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
|
||||||
|
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
|
||||||
|
|
||||||
|
@REM set %HOME% to equivalent of $HOME
|
||||||
|
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
|
||||||
|
|
||||||
|
@REM Execute a user defined script before this one
|
||||||
|
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
|
||||||
|
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
|
||||||
|
if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
|
||||||
|
if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
|
||||||
|
:skipRcPre
|
||||||
|
|
||||||
|
@setlocal
|
||||||
|
|
||||||
|
set ERROR_CODE=0
|
||||||
|
|
||||||
|
@REM To isolate internal variables from possible post scripts, we use another setlocal
|
||||||
|
@setlocal
|
||||||
|
|
||||||
|
@REM ==== START VALIDATION ====
|
||||||
|
if not "%JAVA_HOME%" == "" goto OkJHome
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Error: JAVA_HOME not found in your environment. >&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||||
|
echo location of your Java installation. >&2
|
||||||
|
echo.
|
||||||
|
goto error
|
||||||
|
|
||||||
|
:OkJHome
|
||||||
|
if exist "%JAVA_HOME%\bin\java.exe" goto init
|
||||||
|
|
||||||
|
echo.
|
||||||
|
echo Error: JAVA_HOME is set to an invalid directory. >&2
|
||||||
|
echo JAVA_HOME = "%JAVA_HOME%" >&2
|
||||||
|
echo Please set the JAVA_HOME variable in your environment to match the >&2
|
||||||
|
echo location of your Java installation. >&2
|
||||||
|
echo.
|
||||||
|
goto error
|
||||||
|
|
||||||
|
@REM ==== END VALIDATION ====
|
||||||
|
|
||||||
|
:init
|
||||||
|
|
||||||
|
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
|
||||||
|
@REM Fallback to current working directory if not found.
|
||||||
|
|
||||||
|
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
|
||||||
|
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
|
||||||
|
|
||||||
|
set EXEC_DIR=%CD%
|
||||||
|
set WDIR=%EXEC_DIR%
|
||||||
|
:findBaseDir
|
||||||
|
IF EXIST "%WDIR%"\.mvn goto baseDirFound
|
||||||
|
cd ..
|
||||||
|
IF "%WDIR%"=="%CD%" goto baseDirNotFound
|
||||||
|
set WDIR=%CD%
|
||||||
|
goto findBaseDir
|
||||||
|
|
||||||
|
:baseDirFound
|
||||||
|
set MAVEN_PROJECTBASEDIR=%WDIR%
|
||||||
|
cd "%EXEC_DIR%"
|
||||||
|
goto endDetectBaseDir
|
||||||
|
|
||||||
|
:baseDirNotFound
|
||||||
|
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
|
||||||
|
cd "%EXEC_DIR%"
|
||||||
|
|
||||||
|
:endDetectBaseDir
|
||||||
|
|
||||||
|
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
|
||||||
|
|
||||||
|
@setlocal EnableExtensions EnableDelayedExpansion
|
||||||
|
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
|
||||||
|
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
|
||||||
|
|
||||||
|
:endReadAdditionalConfig
|
||||||
|
|
||||||
|
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
|
||||||
|
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
|
||||||
|
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
|
||||||
|
|
||||||
|
set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||||
|
|
||||||
|
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||||
|
IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B
|
||||||
|
)
|
||||||
|
|
||||||
|
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
|
||||||
|
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
|
||||||
|
if exist %WRAPPER_JAR% (
|
||||||
|
if "%MVNW_VERBOSE%" == "true" (
|
||||||
|
echo Found %WRAPPER_JAR%
|
||||||
|
)
|
||||||
|
) else (
|
||||||
|
if not "%MVNW_REPOURL%" == "" (
|
||||||
|
SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.2.0/maven-wrapper-3.2.0.jar"
|
||||||
|
)
|
||||||
|
if "%MVNW_VERBOSE%" == "true" (
|
||||||
|
echo Couldn't find %WRAPPER_JAR%, downloading it ...
|
||||||
|
echo Downloading from: %WRAPPER_URL%
|
||||||
|
)
|
||||||
|
|
||||||
|
powershell -Command "&{"^
|
||||||
|
"$webclient = new-object System.Net.WebClient;"^
|
||||||
|
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
|
||||||
|
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
|
||||||
|
"}"^
|
||||||
|
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^
|
||||||
|
"}"
|
||||||
|
if "%MVNW_VERBOSE%" == "true" (
|
||||||
|
echo Finished downloading %WRAPPER_JAR%
|
||||||
|
)
|
||||||
|
)
|
||||||
|
@REM End of extension
|
||||||
|
|
||||||
|
@REM If specified, validate the SHA-256 sum of the Maven wrapper jar file
|
||||||
|
SET WRAPPER_SHA_256_SUM=""
|
||||||
|
FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
|
||||||
|
IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B
|
||||||
|
)
|
||||||
|
IF NOT %WRAPPER_SHA_256_SUM%=="" (
|
||||||
|
powershell -Command "&{"^
|
||||||
|
"$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^
|
||||||
|
"If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^
|
||||||
|
" Write-Output 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^
|
||||||
|
" Write-Output 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^
|
||||||
|
" Write-Output 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^
|
||||||
|
" exit 1;"^
|
||||||
|
"}"^
|
||||||
|
"}"
|
||||||
|
if ERRORLEVEL 1 goto error
|
||||||
|
)
|
||||||
|
|
||||||
|
@REM Provide a "standardized" way to retrieve the CLI args that will
|
||||||
|
@REM work with both Windows and non-Windows executions.
|
||||||
|
set MAVEN_CMD_LINE_ARGS=%*
|
||||||
|
|
||||||
|
%MAVEN_JAVA_EXE% ^
|
||||||
|
%JVM_CONFIG_MAVEN_PROPS% ^
|
||||||
|
%MAVEN_OPTS% ^
|
||||||
|
%MAVEN_DEBUG_OPTS% ^
|
||||||
|
-classpath %WRAPPER_JAR% ^
|
||||||
|
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
|
||||||
|
%WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
|
||||||
|
if ERRORLEVEL 1 goto error
|
||||||
|
goto end
|
||||||
|
|
||||||
|
:error
|
||||||
|
set ERROR_CODE=1
|
||||||
|
|
||||||
|
:end
|
||||||
|
@endlocal & set ERROR_CODE=%ERROR_CODE%
|
||||||
|
|
||||||
|
if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
|
||||||
|
@REM check for post script, once with legacy .bat ending and once with .cmd ending
|
||||||
|
if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
|
||||||
|
if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
|
||||||
|
:skipRcPost
|
||||||
|
|
||||||
|
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
|
||||||
|
if "%MAVEN_BATCH_PAUSE%"=="on" pause
|
||||||
|
|
||||||
|
if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
|
||||||
|
|
||||||
|
cmd /C exit /B %ERROR_CODE%
|
55
kalyshev_yan_lab_4/spring-amqp/pom.xml
Normal file
55
kalyshev_yan_lab_4/spring-amqp/pom.xml
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<?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>
|
||||||
|
|
||||||
|
<groupId>org.springframework.amqp</groupId>
|
||||||
|
<artifactId>rabbitmq-tutorials</artifactId>
|
||||||
|
<version>2.0.0.RELEASE</version>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>rabbitmq-tutorials</name>
|
||||||
|
<description>Spring AMQP Implementations for RabbitMQ Tutorials</description>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-parent</artifactId>
|
||||||
|
<version>3.3.5</version>
|
||||||
|
<relativePath/> <!-- lookup parent from repository -->
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-amqp</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<mainClass>org.springframework.amqp.tutorials.RabbitAmqpTutorialsApplication</mainClass>
|
||||||
|
<finalName>rabbitmq-tutorials</finalName>
|
||||||
|
<layout>ZIP</layout>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>3.13.0</version>
|
||||||
|
<configuration>
|
||||||
|
<release>17</release>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
@ -0,0 +1,65 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015-2018 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials;
|
||||||
|
|
||||||
|
import org.springframework.boot.CommandLineRunner;
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
* @author Arnaud Cogoluègnes
|
||||||
|
*/
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableScheduling
|
||||||
|
public class RabbitAmqpTutorialsApplication {
|
||||||
|
|
||||||
|
@Profile("usage_message")
|
||||||
|
@Bean
|
||||||
|
public CommandLineRunner usage() {
|
||||||
|
return args -> {
|
||||||
|
System.out.println("This app uses Spring Profiles to control its behavior.\n");
|
||||||
|
System.out.println("Options are: ");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=hello-world,receiver");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=hello-world,sender");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,receiver");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=work-queues,sender");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=pub-sub,receiver");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=pub-sub,sender");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=routing,receiver");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=routing,sender");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=topics,receiver");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=topics,sender");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=rpc,client");
|
||||||
|
System.out.println("java -jar target/rabbitmq-tutorials.jar --spring.profiles.active=rpc,server");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Profile("!usage_message")
|
||||||
|
@Bean
|
||||||
|
public CommandLineRunner tutorial() {
|
||||||
|
return new RabbitAmqpTutorialsRunner();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(RabbitAmqpTutorialsApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials;
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.boot.CommandLineRunner;
|
||||||
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
*/
|
||||||
|
public class RabbitAmqpTutorialsRunner implements CommandLineRunner {
|
||||||
|
|
||||||
|
@Value("${tutorial.client.duration:0}")
|
||||||
|
private int duration;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ConfigurableApplicationContext ctx;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run(String... arg0) throws Exception {
|
||||||
|
System.out.println("Ready ... running for " + duration + "ms");
|
||||||
|
Thread.sleep(duration);
|
||||||
|
ctx.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015-2018 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials.tut1;
|
||||||
|
|
||||||
|
import org.springframework.amqp.core.Queue;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
* @author Wayne Lund
|
||||||
|
*/
|
||||||
|
@Profile({"tut1","hello-world"})
|
||||||
|
@Configuration
|
||||||
|
public class Tut1Config {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue hello() {
|
||||||
|
return new Queue("hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Profile("receiver")
|
||||||
|
@Bean
|
||||||
|
public Tut1Receiver receiver() {
|
||||||
|
return new Tut1Receiver();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Profile("sender")
|
||||||
|
@Bean
|
||||||
|
public Tut1Sender sender() {
|
||||||
|
return new Tut1Sender();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials.tut1;
|
||||||
|
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
* @author Wayne Lund
|
||||||
|
*/
|
||||||
|
@RabbitListener(queues = "hello")
|
||||||
|
public class Tut1Receiver {
|
||||||
|
|
||||||
|
@RabbitHandler
|
||||||
|
public void receive(String in) {
|
||||||
|
System.out.println(" [x] Received '" + in + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials.tut1;
|
||||||
|
|
||||||
|
import org.springframework.amqp.core.Queue;
|
||||||
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
*/
|
||||||
|
public class Tut1Sender {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RabbitTemplate template;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Queue queue;
|
||||||
|
|
||||||
|
@Scheduled(fixedDelay = 1000, initialDelay = 500)
|
||||||
|
public void send() {
|
||||||
|
String message = "Hello World!";
|
||||||
|
this.template.convertAndSend(queue.getName(), message);
|
||||||
|
System.out.println(" [x] Sent '" + message + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015-2018 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials.tut2;
|
||||||
|
|
||||||
|
import org.springframework.amqp.core.Queue;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
*/
|
||||||
|
@Profile({"tut2", "work-queues"})
|
||||||
|
@Configuration
|
||||||
|
public class Tut2Config {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue hello() {
|
||||||
|
return new Queue("tut.hello");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Profile("receiver")
|
||||||
|
private static class ReceiverConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Tut2Receiver receiver1() {
|
||||||
|
return new Tut2Receiver(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Tut2Receiver receiver2() {
|
||||||
|
return new Tut2Receiver(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Profile("sender")
|
||||||
|
@Bean
|
||||||
|
public Tut2Sender sender() {
|
||||||
|
return new Tut2Sender();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials.tut2;
|
||||||
|
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
import org.springframework.util.StopWatch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
*/
|
||||||
|
@RabbitListener(queues = "tut.hello")
|
||||||
|
public class Tut2Receiver {
|
||||||
|
|
||||||
|
private final int instance;
|
||||||
|
|
||||||
|
public Tut2Receiver(int i) {
|
||||||
|
this.instance = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
@RabbitHandler
|
||||||
|
public void receive(String in) throws InterruptedException {
|
||||||
|
StopWatch watch = new StopWatch();
|
||||||
|
watch.start();
|
||||||
|
System.out.println("instance " + this.instance + " [x] Received '" + in + "'");
|
||||||
|
doWork(in);
|
||||||
|
watch.stop();
|
||||||
|
System.out.println("instance " + this.instance + " [x] Done in " + watch.getTotalTimeSeconds() + "s");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doWork(String in) throws InterruptedException {
|
||||||
|
for (char ch : in.toCharArray()) {
|
||||||
|
if (ch == '.') {
|
||||||
|
Thread.sleep(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015-2018 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials.tut2;
|
||||||
|
|
||||||
|
import org.springframework.amqp.core.Queue;
|
||||||
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
* @author Arnaud Cogoluègnes
|
||||||
|
*/
|
||||||
|
public class Tut2Sender {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RabbitTemplate template;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private Queue queue;
|
||||||
|
|
||||||
|
AtomicInteger dots = new AtomicInteger(0);
|
||||||
|
|
||||||
|
AtomicInteger count = new AtomicInteger(0);
|
||||||
|
|
||||||
|
@Scheduled(fixedDelay = 1000, initialDelay = 500)
|
||||||
|
public void send() {
|
||||||
|
StringBuilder builder = new StringBuilder("Hello");
|
||||||
|
if (dots.getAndIncrement() == 4) {
|
||||||
|
dots.set(1);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < dots.get(); i++) {
|
||||||
|
builder.append('.');
|
||||||
|
}
|
||||||
|
builder.append(count.incrementAndGet());
|
||||||
|
String message = builder.toString();
|
||||||
|
template.convertAndSend(queue.getName(), message);
|
||||||
|
System.out.println(" [x] Sent '" + message + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials.tut3;
|
||||||
|
|
||||||
|
import org.springframework.amqp.core.AnonymousQueue;
|
||||||
|
import org.springframework.amqp.core.Binding;
|
||||||
|
import org.springframework.amqp.core.BindingBuilder;
|
||||||
|
import org.springframework.amqp.core.FanoutExchange;
|
||||||
|
import org.springframework.amqp.core.Queue;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
*/
|
||||||
|
@Profile({"tut3", "pub-sub", "publish-subscribe"})
|
||||||
|
@Configuration
|
||||||
|
public class Tut3Config {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FanoutExchange fanout() {
|
||||||
|
return new FanoutExchange("tut.fanout");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Profile("receiver")
|
||||||
|
private static class ReceiverConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue autoDeleteQueue1() {
|
||||||
|
return new AnonymousQueue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Queue autoDeleteQueue2() {
|
||||||
|
return new AnonymousQueue();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Binding binding1(FanoutExchange fanout, Queue autoDeleteQueue1) {
|
||||||
|
return BindingBuilder.bind(autoDeleteQueue1).to(fanout);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Binding binding2(FanoutExchange fanout, Queue autoDeleteQueue2) {
|
||||||
|
return BindingBuilder.bind(autoDeleteQueue2).to(fanout);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public Tut3Receiver receiver() {
|
||||||
|
return new Tut3Receiver();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Profile("sender")
|
||||||
|
@Bean
|
||||||
|
public Tut3Sender sender() {
|
||||||
|
return new Tut3Sender();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials.tut3;
|
||||||
|
|
||||||
|
import org.springframework.amqp.rabbit.annotation.RabbitListener;
|
||||||
|
import org.springframework.util.StopWatch;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
*/
|
||||||
|
public class Tut3Receiver {
|
||||||
|
|
||||||
|
@RabbitListener(queues = "#{autoDeleteQueue1.name}")
|
||||||
|
public void receive1(String in) throws InterruptedException {
|
||||||
|
receive(in, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@RabbitListener(queues = "#{autoDeleteQueue2.name}")
|
||||||
|
public void receive2(String in) throws InterruptedException {
|
||||||
|
receive(in, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void receive(String in, int receiver) throws InterruptedException {
|
||||||
|
StopWatch watch = new StopWatch();
|
||||||
|
watch.start();
|
||||||
|
System.out.println("instance " + receiver + " [x] Received '" + in + "'");
|
||||||
|
doWork(in);
|
||||||
|
watch.stop();
|
||||||
|
System.out.println("instance " + receiver + " [x] Done in " + watch.getTotalTimeSeconds() + "s");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doWork(String in) throws InterruptedException {
|
||||||
|
for (char ch : in.toCharArray()) {
|
||||||
|
if (ch == '.') {
|
||||||
|
Thread.sleep(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015-2018 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.amqp.tutorials.tut3;
|
||||||
|
|
||||||
|
import org.springframework.amqp.core.FanoutExchange;
|
||||||
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Gary Russell
|
||||||
|
* @author Scott Deeg
|
||||||
|
* @author Arnaud Cogoluègnes
|
||||||
|
*/
|
||||||
|
public class Tut3Sender {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RabbitTemplate template;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private FanoutExchange fanout;
|
||||||
|
|
||||||
|
AtomicInteger dots = new AtomicInteger(0);
|
||||||
|
|
||||||
|
AtomicInteger count = new AtomicInteger(0);
|
||||||
|
|
||||||
|
@Scheduled(fixedDelay = 1000, initialDelay = 500)
|
||||||
|
public void send() {
|
||||||
|
StringBuilder builder = new StringBuilder("Hello");
|
||||||
|
if (dots.getAndIncrement() == 3) {
|
||||||
|
dots.set(1);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < dots.get(); i++) {
|
||||||
|
builder.append('.');
|
||||||
|
}
|
||||||
|
builder.append(count.incrementAndGet());
|
||||||
|
String message = builder.toString();
|
||||||
|
template.convertAndSend(fanout.getName(), "", message);
|
||||||
|
System.out.println(" [x] Sent '" + message + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
spring:
|
||||||
|
rabbitmq:
|
||||||
|
host: rabbitmq.local.pcfdev.io
|
||||||
|
username: f5e10385-1db5-4a98-9d96-99600f55a500
|
||||||
|
password: u6nog1g1pjadcj95937bk41vgb
|
||||||
|
virtualHost: 5888c0ff-a99e-4749-90c9-77167abb8616
|
@ -0,0 +1,5 @@
|
|||||||
|
spring:
|
||||||
|
rabbitmq:
|
||||||
|
host: rabbitserver
|
||||||
|
username: tutorial
|
||||||
|
password: tutorial
|
@ -0,0 +1,11 @@
|
|||||||
|
spring:
|
||||||
|
profiles:
|
||||||
|
active: usage_message
|
||||||
|
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
org: ERROR
|
||||||
|
|
||||||
|
tutorial:
|
||||||
|
client:
|
||||||
|
duration: 10000
|
@ -0,0 +1,4 @@
|
|||||||
|
__ __ ___
|
||||||
|
|__)_ |_ |_ .|_|\/|/ \ | |_ _ _. _ | _
|
||||||
|
| \(_||_)|_)||_| |\_\/ | |_||_(_)| |(_||_)
|
||||||
|
|
@ -0,0 +1,6 @@
|
|||||||
|
spring:
|
||||||
|
rabbitmq:
|
||||||
|
host: rabbitmq.local.pcfdev.io
|
||||||
|
username: f5e10385-1db5-4a98-9d96-99600f55a500
|
||||||
|
password: u6nog1g1pjadcj95937bk41vgb
|
||||||
|
virtualHost: 5888c0ff-a99e-4749-90c9-77167abb8616
|
@ -0,0 +1,5 @@
|
|||||||
|
spring:
|
||||||
|
rabbitmq:
|
||||||
|
host: rabbitserver
|
||||||
|
username: tutorial
|
||||||
|
password: tutorial
|
@ -0,0 +1,11 @@
|
|||||||
|
spring:
|
||||||
|
profiles:
|
||||||
|
active: usage_message
|
||||||
|
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
org: ERROR
|
||||||
|
|
||||||
|
tutorial:
|
||||||
|
client:
|
||||||
|
duration: 10000
|
4
kalyshev_yan_lab_4/spring-amqp/target/classes/banner.txt
Normal file
4
kalyshev_yan_lab_4/spring-amqp/target/classes/banner.txt
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
__ __ ___
|
||||||
|
|__)_ |_ |_ .|_|\/|/ \ | |_ _ _. _ | _
|
||||||
|
| \(_||_)|_)||_| |\_\/ | |_||_(_)| |(_||_)
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,3 @@
|
|||||||
|
artifactId=rabbitmq-tutorials
|
||||||
|
groupId=org.springframework.amqp
|
||||||
|
version=2.0.0.RELEASE
|
@ -0,0 +1,13 @@
|
|||||||
|
org/springframework/amqp/tutorials/tut3/Tut3Receiver.class
|
||||||
|
org/springframework/amqp/tutorials/tut2/Tut2Receiver.class
|
||||||
|
org/springframework/amqp/tutorials/tut3/Tut3Config$ReceiverConfig.class
|
||||||
|
org/springframework/amqp/tutorials/tut1/Tut1Receiver.class
|
||||||
|
org/springframework/amqp/tutorials/RabbitAmqpTutorialsRunner.class
|
||||||
|
org/springframework/amqp/tutorials/tut1/Tut1Config.class
|
||||||
|
org/springframework/amqp/tutorials/tut3/Tut3Sender.class
|
||||||
|
org/springframework/amqp/tutorials/RabbitAmqpTutorialsApplication.class
|
||||||
|
org/springframework/amqp/tutorials/tut3/Tut3Config.class
|
||||||
|
org/springframework/amqp/tutorials/tut1/Tut1Sender.class
|
||||||
|
org/springframework/amqp/tutorials/tut2/Tut2Sender.class
|
||||||
|
org/springframework/amqp/tutorials/tut2/Tut2Config.class
|
||||||
|
org/springframework/amqp/tutorials/tut2/Tut2Config$ReceiverConfig.class
|
@ -0,0 +1,11 @@
|
|||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/RabbitAmqpTutorialsApplication.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/RabbitAmqpTutorialsRunner.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/tut1/Tut1Config.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/tut1/Tut1Receiver.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/tut1/Tut1Sender.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/tut2/Tut2Config.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/tut2/Tut2Receiver.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/tut2/Tut2Sender.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/tut3/Tut3Config.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/tut3/Tut3Receiver.java
|
||||||
|
/home/zyzf/Code/DAS_2024_1/kalyshev_yan_lab_4/spring-amqp/src/main/java/org/springframework/amqp/tutorials/tut3/Tut3Sender.java
|
Binary file not shown.
BIN
kalyshev_yan_lab_4/spring-amqp/target/rabbitmq-tutorials.jar
Normal file
BIN
kalyshev_yan_lab_4/spring-amqp/target/rabbitmq-tutorials.jar
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user