@MessageDriven(activationConfig =
{@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "queue/paymentQueue")
})
@Name("paymentReceiver")
public class PaymentReceiver implements MessageListener
{
@Logger private Log log;
@In(create = true) private PaymentProcessor paymentProcessor;
@Override
public void onMessage(Message message)
{
try {
paymentProcessor.processPayment((Payment) ((ObjectMessage)
message).getObject());
} catch (JMSException ex) {
log.error("Message payload did not contain a Payment object", ex);
}
}
}
@MessageDriven(activationConfig =
{@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination",
propertyValue = "queue/paymentQueue")
})
@Name("paymentReceiver")
public class PaymentReceiver implements MessageListener
{
@Logger private Log log;
@In(create = true) private PaymentProcessor paymentProcessor;
@Override
public void onMessage(Message message)
{
try {
paymentProcessor.processPayment((Payment) ((ObjectMessage)
message).getObject());
} catch (JMSException ex) {
log.error("Message payload did not contain a Payment object", ex);
}
}
}
Copy to ClipboardCopied!Toggle word wrapToggle overflow
次に、 レシーバーによる支払い処理の委任先に Seam コンポーネントを実装します。
@Name("paymentProcessor")
public class PaymentProcessor {
@In private EntityManager entityManager;
public void processPayment(Payment payment) {
// perhaps do something more fancy
entityManager.persist(payment);
}
}
@Name("paymentProcessor")
public class PaymentProcessor {
@In private EntityManager entityManager;
public void processPayment(Payment payment) {
// perhaps do something more fancy
entityManager.persist(payment);
}
}
Copy to ClipboardCopied!Toggle word wrapToggle overflow
メッセージ駆動型 Bean でトランザクションの動作を実行したい場合は、 XA データソースで作業するようにしてください。 そうでない場合は、データベーストランザクションがコミットする場合にはデータベースの変更をロールバックできなくなりますが、 その後のメッセージ動作は失敗します。