Attendre la fin du process d'un MDB
Bonjour,
je coince sur un petit problème pour un unit test. J'ai un paquet de MDB qui s'inscrivent sur une topic, un truc dans ce genre là:
Code:
1 2 3 4 5 6 7 8 9 10 11
| @MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/someTopic"),
@ActivationConfigProperty(propertyName = "maxSession", propertyValue = "1"),
@ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
@ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "XYZHandlerEJB3"),
@ActivationConfigProperty(propertyName = "clientId", propertyValue = "XYZHandlerEJB3") })
public class XYZHandler implements MessageListener {
@Override
public void onMessage(Message message) { |
J'ai de l'autre coté des unit test qui font actuellement ceci:
- poster un message sur la queue
- attendre 1 secondes
- s'assurer que l'état de la DB correspond à ce qui est attendu après traitement
multiplié par le nombre de tests, on est de l'ordre de 30 minutes pour lancer les tests sur les MDB. Sachant qu'on attends 1s quelque chose qui s'exécute typiquement en 20/30ms, y a de la perte de temps. J'avais pensé créer un MDB de test qui, lorsqu'il reçoit le message, abaisse un flag pour dire au unit test "message reçu". Mais non, les MDB s'exécutant en parallèle, mon MDB ne bloque pas l'exécution des autres, et les autres ne bloquent pas le mien. Du coup ce n'est pas parce que j'ai reçu le message que c'est traité...
Je voudrais savoir quelles seraient les alternatives. Est-il possible d'empêcher le parallélisme entre les MDB? De garantir un ordre d'execution des MDB (genre le MDB test uniquement quand les autres ont fini)? De savoir quand un message a été entièrement traité? Enrober mes MDB avec des post message hooks durant le test (et comment)?
Je précise que je peux rajouter des MDB supplémentaire, je peux jouer sur la config de la queue (c'est du Hornet MQ), jouer sur la config ejb3 utilisée par le unit test. Par contre l'option d'aller rajouter du code dans les MDB buisness n'est pas acceptable, ils doivent être performant et, par exemple, rajouter une queue de ack les rendrait trop lents. Ensuite, d'une manière général, je ne veux pas de code ne servant qu'aux tests dans la partie buisness.