firebase 푸시를 발송하는데 갑자기 대부분의 요청에 대해서 오류가 발생했다.
java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: No enum constant com.google.firebase.ErrorCode.UNIMPLEMENTED
java.lang.IllegalArgumentException: No enum constant com.google.firebase.ErrorCode.UNIMPLEMENTED · Issue #974 · firebase/fireb
Hello, We are receiving IllegalArgumentException while calling com.google.firebase.messaging.FirebaseMessaging#sendMulticast(com.google.firebase.messaging.MulticastMessage) method since 2024-08-12 ...
github.com
Version 9.2.0 - 22 June, 2023
Cloud Messaging
- Added sendEach(), sendEachAsync(), sendEachForMulticast(), and sendEachForMulticastAsync() APIs.
- sendAll(), sendAllAsync(), sendMulticast(), and sendMulticastAsync() APIs are now deprecated.
- Use sendEach(), sendEachAsync(), sendEachForMulticast(), and sendEachForMulticastAsync() APIs instead.
https://firebase.google.com/support/release-notes/admin/java
Firebase Admin Java SDK Release Notes
Send feedback Firebase Admin Java SDK Release Notes Stay organized with collections Save and categorize content based on your preferences. To review release notes for the Firebase console and for other Firebase platforms and related SDKs, refer to the Fire
firebase.google.com
사용중이던 함수가 deprecated 된 것이다.
Firebase Admin Java SDK의 버전을 최신으로 변경하고 소스 코드에서 sendAllAsync() 를 sendEachAsync()로 변경했다. 하지만 여전히 네트워크 오류가 많이 보였다.
sendEachAsync() 함수 내부에서 쓰레드를 너무 많이 생성하고 있었다.
해당 문제점을 해결하기 위해 Firebase의 ThreadManager 를 newCachedThreadPool에서 newFixedThreadPool로 변경해 주었다.
@Slf4j
@Configuration
@RequiredArgsConstructor
public class FcmConfig {
private final FixedThreadManagers threadManagers;
@Bean
public FirebaseApp firebaseApp() throws IOException {
InputStream inputStream = new ClassPathResource(authFilePath).getInputStream();
FirebaseOptions options = FirebaseOptions.builder()
.setThreadManager(threadManagers.DEFAULT_THREAD_MANAGER)
.setCredentials(GoogleCredentials.fromStream(inputStream))
.build();
return FirebaseApp.initializeApp(options);
}
}
Firebase 라이브러의 FirebaseThreadManager 와 FirebaseScheduledExecutor 소스를 그대로 복사해서 FirebaseThreadManager 의 DEFALUT_THEAD_MANAGER 쓰레드 설정만 변경했다.
이렇게 하면 Thread가 무한으로 생성되지 않고, 200개로 제한되게 된다.
return Executors.newFixedThreadPool(200, threadFactory);
이 부분이다.
@Component
public class FixedThreadManagers {
private static final Logger logger = LoggerFactory.getLogger(FixedThreadManagers.class);
public static final ThreadManager DEFAULT_THREAD_MANAGER = new FixedThreadManagers.DefaultThreadManager();
public FixedThreadManagers() {
}
private static class DefaultThreadManager extends FixedThreadManagers.GlobalThreadManager {
private DefaultThreadManager() {
}
protected ExecutorService doInit() {
ThreadFactory threadFactory = FixedScheduledExecutor.getThreadFactoryWithName(this.getThreadFactory(), "fixed-default-%d");
return Executors.newFixedThreadPool(200, threadFactory);
}
protected void doCleanup(ExecutorService executorService) {
FixedThreadManagers.logger.debug("Shutting down default executor");
executorService.shutdownNow();
}
protected ThreadFactory getThreadFactory() {
return Executors.defaultThreadFactory();
}
}
abstract static class GlobalThreadManager extends ThreadManager {
private final Object lock = new Object();
private final Set<String> apps = new HashSet();
private ExecutorService executorService;
GlobalThreadManager() {
}
protected ExecutorService getExecutor(FirebaseApp app) {
synchronized(this.lock) {
if (this.executorService == null) {
this.executorService = this.doInit();
}
this.apps.add(app.getName());
return this.executorService;
}
}
protected void releaseExecutor(FirebaseApp app, ExecutorService executor) {
synchronized(this.lock) {
if (this.apps.remove(app.getName()) && this.apps.isEmpty()) {
this.doCleanup(this.executorService);
this.executorService = null;
}
}
}
protected abstract ExecutorService doInit();
protected abstract void doCleanup(ExecutorService var1);
}
}
'Backend > SpringBoot' 카테고리의 다른 글
Communications link failure (0) | 2024.09.06 |
---|---|
@GetMapping에서 URL 경로 변수로 특수 문자를 처리 (0) | 2024.09.06 |
[Thymeleaf] Resource Versioning (0) | 2022.09.29 |