# Message-Driven Bean reagiert nicht



## bananenkasper (8. Mrz 2011)

Hallo,

ich habe das Problem dass eine Message-Driven Bean nicht auf reinkommende Nachrichten reagiert. Die <code> onMessage()</code> Methode wird nicht aufgerufen:

Der Client, der Nachrichten sendet:

```
System.setProperty("java.security.policy", "client.policy");
		if (System.getSecurityManager() == null)
		System.setSecurityManager(new RMISecurityManager());
		
		InitialContext jndiContext = new InitialContext();
		QueueConnectionFactory cf = (QueueConnectionFactory) jndiContext.lookup("ConnectionFactory");
		QueueConnection c = cf.createQueueConnection();
		c.start();
		
		Queue q = (Queue) jndiContext.lookup("queue/instructions");
		Session session = c.createSession(true, 0);
		MessageProducer p = session.createProducer(q);
		ObjectMessage m = session.createObjectMessage(new UploadInstruction(sample));
		p.send(m);

c.stop();
		c.close();
```

Das Bean das die Nachrichten empfangen soll:

```
@MessageDriven(mappedName = "noname/Instructions", activationConfig = {
		@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
		@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/instructions")
//		@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Session-transacted")
		})
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class Instructions implements MessageListener {

	private final static Logger log = LoggerFactory
			.getLogger(Instructions.class);

	@EJB
	private WorkerLocal worker;

	@Override
	public void onMessage(Message m) {
		try {
			ObjectMessage om = (ObjectMessage) m;
			Object o = om.getObject();
			log.info("Recevied message: " + o);

			if (o instanceof UploadInstruction) {
				worker.addSample(((UploadInstruction) o).getValue());
			} else if (o instanceof NormalizeInstruction) {
				worker.normalizeSample(
						((NormalizeInstruction) o).getSampleId(),
						((NormalizeInstruction) o).getNormalizationMethod(),
						((NormalizeInstruction) o).getStandards(),
						((NormalizeInstruction) o).getMassDelta());
			} else {
				log.warn("unknown message type: [" + o + "]");
			}
		} catch (Exception e) {
			log.error(e.getLocalizedMessage(), e);
		}
	}

}
```

Wenn ich im Client

```
Session session = c.createSession(true, 0);
```
tausche gegen

```
Session session = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
```

klappt es (sofern ich die Transaction-Annotation am Bean entferne)

Wie kann ich Transactionelle Nachrichten übermitteln?

Danke!


----------



## FArt (9. Mrz 2011)

Tipps für eine sinnvolle Google-Suche:
jboss hornetq tutorial mdb transaction.
Das wichtigste Stichwort ist "tutorial". Verknüpfe das mit Kombinationen der anderen Stichwörter.

Das sollte das Problem (und weitere, die man dem Code ansieht) lösen.


----------



## bananenkasper (9. Mrz 2011)

Hmm, also vermutlich bin ich blind, aber was google mit diesen Search terms ausspuckt finde ich nicht so hilfreich...
Was hat der Code denn noch für Probleme?

Das mit der Transaction klappt, ein

```
session.commit();
```
vor dem

```
session.close();
```
hat das Problem gelöst.
(Siehe hier: Message-Driven Beans, Message not send / received)


----------



## FArt (9. Mrz 2011)

Ja, so ein commit aus Code, der nicht CMT unterliegt ist bei transaktionalen Queues Gold wert...


----------

