短期问题: 是否有办法迫使一个无国籍的EJB呼吁的POJO生活在EJB的背景下,以便交易和资源注入能够在POJO工作?
具体地说,在我试图做些什么的情况下:我如何把一个POJO JMS生产商列入一个EJB的交易,该交易在要求POJO发出电文之前将一些数据留在一个数据库中,这样,如果信息可能由于一个例外而发出,数据库交易也会回头? 我想仓促地寄送邮件。
这是一条幸福的道路(从无国籍会议开始):
- save data to database // this works
- pull select data from the data that was persisted and place it in a custom message class (really a dto)
- call the sendEmail method of the EmailQueueMessenger POJO passing it the message object.
- message is sent to the MDB to process and send the email (not part of the question, just here for completeness)
下面的法典是行之有效的,如果我错说情况调查,它就只赢得了打字班的“老板”数据库。 BTW,我可以拿到@Resource注入工作。
//In the EJB
EmailQueueMessenger eqm = new EmailQueueMessenger();
eqm.sendEmail(messageObject);
// mailObject will be translated into an email message at the other end of the queue.
/******************** POJO Below ************/
public class EmailQueueMessenger implements Serializable {
// Resource injection doesn t work... using lookup below, which does work.
// @Resource(name = "jms/EmailerQueueConnectionFactory")
// private ConnectionFactory connectionFactory;
// @Resource(name = "jms/EmailerQueue")
// private Destination EmailerQueue;
public EmailQueueMessenger() {
}
public void sendEmail(MailMessageDTO theMessage) {
Context ctx = null;
try {
ctx = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) ctx.lookup("jms/EmailerQueueConnectionFactory");
System.out.println("JMS Producer CTX Name In Namespace: " + ctx.getNameInNamespace());
//Destination EmailerQueue = (Destination) ctx.lookup("jms/ERROR"); // forces exception
Destination EmailerQueue = (Destination) ctx.lookup("jms/EmailerQueue"); // normal working code
try {
Connection con = connectionFactory.createConnection();
Session session = con.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageProducer msgProd = session.createProducer(EmailerQueue);
...
我试图补充:
@TransactionAttribute(TransactionAttributeType.MANDATORY)
@Stateless
而对于POJO的定义,它并没有改变。
FWIW 我在为电子邮件QueueMessenger使用一个单独的类别,因为其他部分需要寄送偶尔的电子邮件,因此不想重复编码。
值得一提的是,我进行了一项试验,即我把所有联医处迁到首批EJB中,而且情况正确......但我需要以单独一类工作,供其他部分使用。