Message-Driven Bean reagiert nicht

B

bananenkasper

Gast
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:
Java:
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:
Java:
@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
Code:
Session session = c.createSession(true, 0);
tausche gegen
Code:
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

Top Contributor
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.
 
B

bananenkasper

Gast
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
Code:
session.commit();
vor dem
Code:
 session.close();
hat das Problem gelöst.
(Siehe hier: Message-Driven Beans, Message not send / received)
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben