Вопрос по java, synchronized, spring – синхронизированный метод или использовать пружину @transactional?

2

У меня есть метод, который будет использоваться для отправки электронной почты. я хочу заблокировать этот метод, чтобы только один поток мог его использовать одновременно, а остальной пул одновременно. я должен синхронизировать метод или использовать пружину @transactional PROPAGATION_REQUIRED?

в моем слое обслуживания
 //each time use new thread to send out email
  public  void sendThroughSMTP(List 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();


}

Ваш Ответ

6   ответов
0

singleton и добавитьsynchronized к вашему методу.

2

электронной почты в компонент, управляемый сообщениями (или через Spring JMS). Затем вы можете использовать свой сервер приложений, чтобы контролировать, сколько одновременных экземпляров вашей MDB будет использоваться, и таким образом регулировать исходящие электронные письма.

7

не используя какие-либо вещи уровня экземпляра?

Тем не менее, я нене вижу, как веснаs Управление транзакциями подходит здесь. Я имею в виду, что Spring предоставляет несколько менеджеров транзакций, т.е.DataSourceTransactionManagerJtaTransactionManagerHibernateTransactionManager все это о сохранении базы данных. Что вы будете настраивать для отправки этого письма?

Я полагаю, сначала вы должны показать нам, почему вы беспокоитесь о безопасности потоков в первую очередь. Скорее всего, вы хотели бы показать нам некоторый соответствующий фрагмент кода или что-то. Тогда мы могли бы предложить вам кое-что.

[Приложение]

Когда вы создаете поток для каждого вызова этого метода и не используете ничего из состояния, тогда почему вы хотите создать методsynchronized, Синхронизация метода никоим образом не ограничит количество потоков. Может быть шанс, что до начала нового потока предыдущий поток мог завершить работу из-за синхронизации. Процесс порождения потока может идти медленнее.

Однако вы должны продолжать это до тех пор, пока не обнаружите, что действительно много запущенных потоков и вам не хватает памяти. И если вы действительно хотите заняться этим раньше времени, то вам следует выбрать какой-то механизм блокировки, что-то вродеСемафор.

так что весной управление транзакциями в основном для базы данных. cometta
мой метод внутри сервисного уровня. не могли бы вы рассказать подробнее ... как это сделать cometta
Да, именно так Для тебя 'как' вопрос, я думаю, вам нужно показать нам соответствующий фрагмент кода и рассказать, почему вы беспокоитесь о безопасности потоков в этом случае. Я имею в виду, что заставляет вас думать, что ваш метод должен быть синхронизирован или что-то в этом роде. Adeel Ansari
3

ачи, поэтому ваш метод будет выполнен позже, и метод будет возвращен напрямую, не дожидаясь отправки электронной почты.

@Async
public  void sendThroughSMTP(List<string> emails,String subject,String content){
//Send emails here, you can directly send lots of email
}
</string>

тогда в контексте приложения вы указываете и нене забудьте добавить xmlns для схемы задач.

Если вы хотите отложить выполнение на определенный период времени, вы можете использовать аннотацию @Scheduled для вашего метода.

Дальнейшее руководство по @Async и @Scheduled можно найти здесь:

http://blog.springsource.com/2010/01/05/task-scheduling-simplifications-in-spring-3-0/

Я бы сказал, что @Async - одно из лучших решений здесь. Я написал об этомskill-guru.com/blog/2010/01/13/... vsingh
1

Лучше всего использовать синхронизированный метод и добавить несколько пулов потоков, если ваш метод вызывается сотни раз. Но я думаю, вам здесь не нужен пул потоков.

Если вы используете поток для отправки взрыва электронной почты, то чтоТочка синхронизации метода? если один процесс вызовет ваш метод и отправит электронное письмо, другой процесс вызовет вас, даже если первый процесс отправки электронной почты еще не завершен.

Если вы намереваетесь ограничить процесс отправки электронной почты, вам нужно создать очередь (коллекцию) и защитить коллекцию с помощью блока синхронизации. Создайте другой процесс для отслеживания этой очереди. Если в очереди есть один элемент, извлеките его и отправьте электронное письмо, затем дождитесь завершения процесса отправки электронной почты и снова проверьте очередь, если есть какой-либо элемент, продолжайте отправку процесса электронной почты. Если в очереди нет элементов, переведите поток монитора в спящий режим на некоторое время, затем, если время ожидания закончилось, проверьте очередь еще раз.

1

что он отвечает на ваш вопрос, но вместо того, чтобы создавать новую ветку для каждой почты и вызывать ее начало, вы можете получитьдушеприказчик или жеExecutorService как член вашего класса, в качестве реализации вы могли бы использоватьThreadPoolExecutor с размером пула 1. Ваш метод sendMail затем отправит Runnables исполнителю.

Похожие вопросы