[SPRING] 동기화 된 메소드 또는 spring @transactional?
SPRING동기화 된 메소드 또는 spring @transactional?
이메일을 보내는 데 사용할 방법이 있습니다. 나는이 방법을 잠그고 오직 하나의 스레드가 시간당 접근을 허용하고 동시에 나머지 풀을 잠 그길 원한다. 내가 방법을 동기화하거나 스프링 @ 트랜샌드 PROPAGATION_REQUIRED를 사용해야합니까?
//each time use new thread to send out email
public void sendThroughSMTP(List<String> emails,String subject,String content){
//each time will open and sent through port 25. dont u think this will caused too many threads spawned?
BlastEmailThread blastEmailThread = new BlastEmailThread(emails,subject,content);
blastEmailThread.start();
}
해결법
-
==============================
1.왜 인스턴스 수준의 것들을 사용하지 않음으로써 스레드 안전성을 보장하지 않습니까?
왜 인스턴스 수준의 것들을 사용하지 않음으로써 스레드 안전성을 보장하지 않습니까?
그러나 Spring의 Transaction Management가 여기에 어떻게 들어 맞는지는 모르겠습니다. 나는 Spring이 거의 트랜잭션 관리자를 제공하지 않는다는 것을 의미한다. DataSourceTransactionManager, JtaTransactionManager, HibernateTransactionManager는 데이터베이스 지속성에 관한 것이다. 이 전자 메일에 대해 구성 할 내용은 무엇입니까?
먼저, 스레드 안전성에 대해 걱정하는 이유를 먼저 보여 주어야한다고 생각합니다. 대부분의 경우 관련성있는 코드 스 니펫이나 다른 것을 보여주고 싶을 것입니다. 그러면 우리는 당신에게 뭔가를 제안 할 수있을 것입니다.
[추가]
해당 메서드에 대한 모든 호출에 대해 스레드를 생성하고 해당 상태의 아무 것도 사용하지 않으면 메서드를 동기화하려는 이유가 무엇입니까? 메서드를 동기화하면 어떤 식 으로든 스레드 수를 제한하지 않습니다. 새 스레드를 시작하기 전에 동기화로 인해 이전 스레드가 작업을 마칠 수 있습니다. 스레드를 생성하는 프로세스가 느려질 수 있습니다.
그러나 실제로 많은 스레드가 실행 중이고 메모리가 부족하다는 것을 알게 될 때까지이 작업을 수행해야합니다. 그리고 정말로 시간이 지나기 전에 문제를 해결하려면 세마포어 (Semaphore)와 같은 차단 메커니즘을 선택해야합니다.
-
==============================
2.Spring 3.0에서는 @Async 어노테이션을 사용하여 작업을 수행 할 수 있으므로 나중에 메소드가 실행되고 메소드가 전자 메일 전송을 기다리지 않고 직접 리턴된다.
Spring 3.0에서는 @Async 어노테이션을 사용하여 작업을 수행 할 수 있으므로 나중에 메소드가 실행되고 메소드가 전자 메일 전송을 기다리지 않고 직접 리턴된다.
@Async public void sendThroughSMTP(List<String> emails,String subject,String content){ //Send emails here, you can directly send lots of email }
응용 프로그램 컨텍스트에서 작업 스키마에 대해 xmlns를 추가하는 것을 잊지 말고 지정하십시오.
특정 시간 동안 실행을 지연 시키려면 메서드에 @Scheduled 주석을 사용할 수 있습니다.
@Async 및 @Scheduled에 대한 추가 자습서는 다음에서 찾을 수 있습니다.
http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/
-
==============================
3.또 다른 가능성은 JMS 대기열을 사용하고 Message Driven Bean (또는 Spring JMS)에 이메일 전송 코드를 넣는 것입니다. 그런 다음 앱 서버를 사용하여 MDB의 동시 인스턴스 수를 제어하고 발신 이메일을 그런 식으로 조절할 수 있습니다.
또 다른 가능성은 JMS 대기열을 사용하고 Message Driven Bean (또는 Spring JMS)에 이메일 전송 코드를 넣는 것입니다. 그런 다음 앱 서버를 사용하여 MDB의 동시 인스턴스 수를 제어하고 발신 이메일을 그런 식으로 조절할 수 있습니다.
-
==============================
4.귀하의 질문에 대답하는 경우 잘 모르겠지만 대신 모든 메일에 대한 새 스레드를 만들고 그것에 대한 호출을 시작할 수 있습니다 클래스의 구성원으로 Executor 또는 ExecutorService, 구현으로 당신과 함께 ThreadPoolExecutor 사용할 수있는 풀 크기는 1입니다. sendMail 메소드는 실행 프로그램을 실행 프로그램에 제출합니다.
귀하의 질문에 대답하는 경우 잘 모르겠지만 대신 모든 메일에 대한 새 스레드를 만들고 그것에 대한 호출을 시작할 수 있습니다 클래스의 구성원으로 Executor 또는 ExecutorService, 구현으로 당신과 함께 ThreadPoolExecutor 사용할 수있는 풀 크기는 1입니다. sendMail 메소드는 실행 프로그램을 실행 프로그램에 제출합니다.
-
==============================
5.Spring @Transactional은 귀하의 경우에 사용 된 것이 아닙니다. 최선의 방법은 synchorized 메서드를 사용하고 메서드가 수백 번 호출 된 경우 일부 스레드 풀링을 추가하는 것입니다. 하지만 여기서 스레드 풀이 필요 없다고 생각합니다.
Spring @Transactional은 귀하의 경우에 사용 된 것이 아닙니다. 최선의 방법은 synchorized 메서드를 사용하고 메서드가 수백 번 호출 된 경우 일부 스레드 풀링을 추가하는 것입니다. 하지만 여기서 스레드 풀이 필요 없다고 생각합니다.
스레드를 사용하여 폭발적인 이메일을 보낸다면 그 방법을 동기화하는 부분은 무엇입니까? 하나의 프로세스가 메서드를 호출하고 전자 메일을 보내면 다른 프로세스가 첫 번째 전자 메일 프로세스를 완료하는 방법조차도 호출합니다.
전자 메일 보내는 프로세스를 제한하려면 큐 (수집)를 조정하고 동기화 블록을 사용하여 컬렉션을 보호해야합니다. 대기열에있는 항목이 하나있는 경우 해당 대기열을 모니터링하는 다른 프로세스를 생성하고 팝업을 보내서 폭발 전자 메일을 보낸 다음 전자 메일 프로세스가 끝날 때까지 대기하고 다시 대기열을 확인합니다. 항목이 있으면 전자 메일 프로세스를 계속 진행합니다. 대기열에 항목이 없으면 모니터 스레드가 일정 시간 동안 잠자기 상태가되고 잠자기 시간이 끝나면 다시 대기열을 확인하십시오.
-
==============================
6.서비스를 싱글 톤으로 만들고 메서드에 동기화를 추가하십시오.
서비스를 싱글 톤으로 만들고 메서드에 동기화를 추가하십시오.
from https://stackoverflow.com/questions/1950596/synchronized-method-or-use-spring-transactional by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 + 쿼츠가 트리거를 예약하거나 업데이트합니까? (0) | 2019.04.30 |
---|---|
[SPRING] 봄 보안 - 특정 URL 패턴에서 캐시 제어를 제거하는 방법 (0) | 2019.04.30 |
[SPRING] Spring Rest-API - 403 금지 된 오류 응답 (0) | 2019.04.30 |
[SPRING] 봄 부팅 내 보낸 항아리가 작동하지 않음 (org.springframework.beans.factory.BeanCreationException : 'entityManagerFactory'라는 이름으로 빈 생성 오류) (0) | 2019.04.29 |
[SPRING] 쓰레드에서 봄 보안 현재 사용자 (0) | 2019.04.29 |