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:
Das Bean das die Nachrichten empfangen soll:
Wenn ich im Client
tausche gegen
klappt es (sofern ich die Transaction-Annotation am Bean entferne)
Wie kann ich Transactionelle Nachrichten übermitteln?
Danke!
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);
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!