Skip to content

Commit

Permalink
Module deployments are deduplicated when static merge deployments(#338)…
Browse files Browse the repository at this point in the history
… (#1035)

* Module deployments are deduplicated when static merge deployments(#338)
  • Loading branch information
Willhow-Gao authored Jan 2, 2025
1 parent 5a1780f commit 41fe026
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,14 @@
<version>${reactor-netty.version}</version>
<scope>provided</scope>
</dependency>

<!--test-->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-inline</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,21 @@
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.Ordered;

import java.util.concurrent.atomic.AtomicBoolean;

public class ArkDeployStaticBizListener implements ApplicationListener<ApplicationContextEvent>,
Ordered {

private final AtomicBoolean deployed = new AtomicBoolean(false);

@Override
public void onApplicationEvent(ApplicationContextEvent event) {
// Only listen to the event when the master biz is started
if (this.getClass().getClassLoader() != Thread.currentThread().getContextClassLoader()) {
return;
}
if (ArkConfigs.isEmbedEnable() && ArkConfigs.isEmbedStaticBizEnable()) {
if (event instanceof ContextRefreshedEvent) {
if (event instanceof ContextRefreshedEvent && deployed.compareAndSet(false, true)) {
// After the master biz is started, statically deploy the other biz from classpath
EmbedSofaArkBootstrap.deployStaticBizAfterEmbedMasterBizStarted();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/*
* 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.
*/
package com.alipay.sofa.ark.springboot.listener;

import com.alipay.sofa.ark.api.ArkConfigs;
import com.alipay.sofa.ark.support.startup.EmbedSofaArkBootstrap;
import org.junit.Test;
import org.mockito.MockedStatic;
import org.mockito.Mockito;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.ContextStartedEvent;

import static org.mockito.Mockito.*;

/**
* @author gaowh
* @version 1.0
* @time 2024/12/30
*/
public class ArkDeployStaticBizListenerTest {

/**
* classloader不匹配的场景
*/
@Test
public void testDiffClassLoader() {
ArkDeployStaticBizListener listener = new ArkDeployStaticBizListener();
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
try (MockedStatic<EmbedSofaArkBootstrap> bootstrap = mockStatic(EmbedSofaArkBootstrap.class);
MockedStatic<ArkConfigs> arkConfigs = mockStatic(ArkConfigs.class)) {
arkConfigs.when(ArkConfigs::isEmbedEnable).thenReturn(true);
arkConfigs.when(ArkConfigs::isEmbedStaticBizEnable).thenReturn(true);
Thread.currentThread().setContextClassLoader(new ClassLoader() {
});
listener.onApplicationEvent(new ContextRefreshedEvent(new AnnotationConfigApplicationContext()));
bootstrap.verify(Mockito.times(0), EmbedSofaArkBootstrap::deployStaticBizAfterEmbedMasterBizStarted);
} finally {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}

/**
* applicationEvent 不是 ContextRefreshedEvent 的场景
*/
@Test
public void testNonContextRefreshedEvent() {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
try (MockedStatic<EmbedSofaArkBootstrap> bootstrap = mockStatic(EmbedSofaArkBootstrap.class);
MockedStatic<ArkConfigs> arkConfigs = mockStatic(ArkConfigs.class)) {
ClassLoader classLoader = ArkDeployStaticBizListener.class.getClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
arkConfigs.when(ArkConfigs::isEmbedEnable).thenReturn(true);
arkConfigs.when(ArkConfigs::isEmbedStaticBizEnable).thenReturn(true);
ArkDeployStaticBizListener listener = new ArkDeployStaticBizListener();
listener.onApplicationEvent(new ContextStartedEvent(new AnnotationConfigApplicationContext()));
bootstrap.verify(Mockito.times(0), EmbedSofaArkBootstrap::deployStaticBizAfterEmbedMasterBizStarted);
} finally {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}

/**
* 事件重复发送的场景
*/
@Test
public void testDeployed() {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
try (MockedStatic<EmbedSofaArkBootstrap> bootstrap = mockStatic(EmbedSofaArkBootstrap.class);
MockedStatic<ArkConfigs> arkConfigs = mockStatic(ArkConfigs.class)) {
ClassLoader classLoader = ArkDeployStaticBizListener.class.getClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
arkConfigs.when(ArkConfigs::isEmbedEnable).thenReturn(true);
arkConfigs.when(ArkConfigs::isEmbedStaticBizEnable).thenReturn(true);
ArkDeployStaticBizListener listener = new ArkDeployStaticBizListener();
listener.onApplicationEvent(new ContextRefreshedEvent(new AnnotationConfigApplicationContext()));
// 容器刷新事件已经发送过,重复发送不会重复部署
listener.onApplicationEvent(new ContextRefreshedEvent(new AnnotationConfigApplicationContext()));
bootstrap.verify(Mockito.times(1), EmbedSofaArkBootstrap::deployStaticBizAfterEmbedMasterBizStarted);
} finally {
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
}
}

0 comments on commit 41fe026

Please sign in to comment.