2012-01-03 4 views
1

Мне нужно реализовать следующую архитектуру:Как сохраняться объект в ThreadPoolTaskExecutor

N потоков мониторинга BlockedQueue<Message> (я даже считаю, что мы можем использовать ActiveMQ в ближайшем будущем).

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

Услуга что-то вроде этого:

@Repository(value="service") 
public class Service { 

    @Autowired 
    MongoTemplate mongoTemplate; 

public void save(Message message){ 
    //do something to message 
    doSomething(message); 
    //persist it 
    mongoTemplate.save(message, "messages"); 
} 
//etc... 
} 

Теперь мне нужно разделить Service объект между потоками.

Как я могу сделать эту службу безопасной? Будет ли хорошая практика сделать объект службы как singleton (Design Pattern) и ввести его в Runnabble beans с использованием фабрики getInstance()?

Должен ли мой шаблон mongoDb открывать N соединений (вид пула соединений)?

Может быть, есть другие способы обмена такой службой между потоками?

+0

Во-первых, я лично не считаю, что «Сервис» - хорошее имя для класса. Можете ли вы просто сделать 'save' метод' synchronized'? – fiction

ответ

1

Драйвер MongoDB уже обрабатывает пул соединений, а также поточно-безопасный, если вы не изменяете объект Message во время разговора. Поэтому, если doSomething(message) является потокобезопасным, ваш код обслуживания должен быть в порядке.

Примечание: mongoTemplate.save (сообщение, «сообщения»), похоже, имеет неправильный порядок аргументов. Сначала вы должны передать имя коллекции.

+0

Должен ли я реализовывать заводской метод getInstance() или должен вводить его как обычный синглтон Spring? –

+0

Вложение должно быть достаточно хорошим. – Nat

Смежные вопросы