If you'll allow a slight digression, but are you sure that bulk update is a good idea in your case?
Product is an aggregate of high contetion if it manages inventory. Just imagine that maybe hundreds of people are placing orders for the same product at same time on Amazon.com, whereas few people will modify your order at same time.
Take an example:
Event1: A-5, B-1 Event2: C-1, D-2 Event3: A-2, D-3
Event1 conflicts with Event3, Event2 conflicts with Event3
The more product you update in one transaction, the greater chance of a concurrency failure if your products are selling well.
Iterate one product per transaction is even worse, making the event harder to retry.
handle(NewProductDeliveryEvent event) {
for (ProductDelivery delivery : event.getProductDeliveries()) {
updateProductTransactionally();
// How to retry the whole event
// when the second one failed and the first one committed?
}
}
Maybe splitting the event to multiple sub events which triggers only one product update is more appropiate.