Проблема развертывания Spring Boot ActiveMQ AWS - PullRequest
2 голосов
/ 04 ноября 2019

У меня есть приложение Spring Boot, которое использует ActiveMQ для постановки почтовых сообщений в очередь (класс POJO). Очередь развернута в облаке (отдельный узел) в экземпляре ec2 amazon, расположенном по адресу: tcp: // public_ip: 61616 . Когда я запускаю .jar локально, мое приложение работает без проблем;почтовые сообщения помещаются в очередь и удаляются из очереди.

Проблема возникает, когда я загружаю тот же файл .jar в AWS Elastic Beanstalk Java Platform. Когда файл .jar выполняется из облака (ранее выполнялся локально), сообщения попадают в очередь «ActiveMQ.DLQ». Сообщения помещаются в очередь, но не помещаются в очередь. Мой вопрос заключается в том, почему мое приложение Spring Boot при развертывании в облаке не убирает сообщения из очереди?

Это мой файл pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xxxxxx</groupId>
    <artifactId>xxxxxxx</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>xxxxxxProject</name>
    <description>xxxxx</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- JMS -->
        <dependency>              
            <groupId>org.springframework.boot</groupId>           
            <artifactId>spring-boot-starter-activemq</artifactId>         
        </dependency>         
        <dependency>              
            <groupId>org.apache.activemq</groupId>            
            <artifactId>activemq-broker</artifactId>          
        </dependency>         
        <dependency>              
            <groupId>com.fasterxml.jackson.core</groupId>             
            <artifactId>jackson-databind</artifactId>         
        </dependency>

        <!-- Spring Mail -->
        <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

        <!--Json Web Token-->
        <dependency>
                <groupId>io.jsonwebtoken</groupId>
                <artifactId>jjwt</artifactId>
                <version>0.7.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.modelmapper/modelmapper -->
        <dependency>
            <groupId>org.modelmapper</groupId>
            <artifactId>modelmapper</artifactId>
            <version>1.1.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.vladmihalcea/hibernate-types-5 -->
        <dependency>
                <groupId>com.vladmihalcea</groupId>
                <artifactId>hibernate-types-5</artifactId>
                <version>2.2.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.9.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-core</artifactId>
                <version>2.9.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-annotations</artifactId>
                <version>2.9.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-hibernate5 -->
        <dependency>
                <groupId>com.fasterxml.jackson.datatype</groupId>
                <artifactId>jackson-datatype-hibernate5</artifactId>
                <version>2.9.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.7</version>
        </dependency>

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk</artifactId>
            <version>1.11.133</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>    
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

Мой файл App.Properties:

#SpringFrameworkVersion: 4.3.13.RELEASE
#SSL Properties:
server.port=8083
server.use-forward-headers=true
#server.tomcat.remote_ip_header=x-forwarded-for
#DataBase Properties:
app.db.user=xxx
app.db.password=xxx
app.db.host=xxxxxxxxxx.us-east-1.rds.amazonaws.com
#app.db.host=localhost
app.db.port=3306
app.db.scheme=xxxxxkBD
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.broker-url=tcp://public_ip:61616?jms.redeliveryPolicy.maximumRedeliveries=1
spring.jackson.default-property-inclusion=non_empty
spring.mvc.dispatch-options-request=true
amazonS3Properties.endpointUrlBase=https://s3.amazonaws.com
amazonS3Properties.bucketName=zzzzz.com
amazonS3Properties.region=us-east-1
#Recordar que faltan las propiedades de llave para conectarse a AWS S3
amazonS3Properties.accessKey=xx
amazonS3Properties.secretKey=xx
spring.http.multipart.max-file-size=4MB
spring.http.multipart.max-request-size=10MB

Моя конфигурация Spring Boot Bean:

@Configuration
@EnableJms
public class JavaMessageServiceConfiguration {

    @Bean         
    public JmsListenerContainerFactory<?> myFactory( ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {            
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();

        configurer.configure(factory, connectionFactory);
        return factory;   
    }

    // Serialize message content to json using TextMessage
    @Bean
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }

Мой класс производителя:

@Component
public class Mail implements ApplicationListener<GenericEvent>{

    @Autowired 
    private JmsTemplate jmsTemplate;

    @Override
    public void onApplicationEvent(GenericEvent event) {
        if (event instanceof UserRegistrationEvent) {
            UserRegistrationEvent registrationEvent = (UserRegistrationEvent) event;
            createUserRegistrationEmailMessage(registrationEvent.getId(), registrationEvent.getEmail(),
                    registrationEvent.getName(), registrationEvent.getAppUrl());
        }
    }

    @Transactional
    private void createUserRegistrationEmailMessage(int id, String to, String name, String appUrl) {
        EmailMessage emailMessage = new EmailMessage(env.getProperty("support.email"), to, subject, body.toString());
        jmsTemplate.convertAndSend("mailbox",emailMessage);
    }
}

Мой потребительский класс:

@Component
public class MailSender {

    @Autowired
    private JavaMailSender mailSender;

    @Async
    @JmsListener(destination = "mailbox", containerFactory = "myFactory")
    public void sendEmail(EmailMessage emailMessage) throws MessagingException {
        System.out.println("Dequeue e-mail");
        MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(emailMessage.getFrom());
        helper.setTo(emailMessage.getTo());
        helper.setSubject(emailMessage.getSubject());
        helper.setText(emailMessage.getBody(), true);
        mailSender.send(message);
    }
}

Обновление:

Имейте в виду логику поведения, чтобы они могли лучше понять, что происходит:

Когда я запускаю .jar локально, приложение работает без проблем. Теперь я останавливаю .jar локально, затем я выполняю развертывание AWS Elastic Beanstalk этого же самого .jar, но сообщения отправляются в «ActiveMQ.DLQ».

enter image description here

Затем, если я снова запускаю .jar локально, приложение перестает работать (сообщения отправляются в «ActiveMQ.DLQ», ста же самая причина, показанная на изображении).

Чтобы он снова работал локально, мне нужно запустить локальный .jar и одновременно повторно развернуть этот же .jar на AWS Elastic Beanstalk. Таким образом, локальный .jar снова начинает без проблем удалять сообщения. По-видимому, при развертывании соединение с очередью перезапускается, и соединение с локальным .jar снова работает. Это странное поведение, которое я до сих пор не могу понять

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...