在我的 Java EE 应用程序中,我将异步 DB 记录器实现为 MDB,它通过 JMS 接收 XML 消息并将它们写入 DB。
在另一个 MDB 中,我创建了一条日志消息,并使用以下代码将它们发送到记录器 MDB 的输入队列:
public static void log(String correlId, String message, String data) throws Exception{
SysLogEntry sysLogEntry = new SysLogEntry();
sysLogEntry.setCorrelId(correlId);
sysLogEntry.setDatetimeCreate(new Date());
sysLogEntry.setMessage(message);
sysLogEntry.setData(data);
ConnectionFactory jmsConnectionFactory = (ConnectionFactory)initialContext.lookup(JMS_CONNECTION_FACTORY_JNDI_NAME);
Destination logEventDestination = (Destination) initialContext.lookup(LOG_EVENT_DESTINATION_JNDI_NAME);
JmsUtils.sendMsgToDestination(JaxbUtils.toString(sysLogEntry, jaxbContext), jmsConnectionFactory, logEventDestination, false, Session.AUTO_ACKNOWLEDGE);
}
public static void sendMsgToDestination(String payload, ConnectionFactory connFactory, Destination destination, boolean sessionTransacted, int acknowledgeMode) throws JMSException{
if(payload == null)
throw new IllegalArgumentException("Message payload is null");
if(connFactory == null)
throw new IllegalArgumentException("Connection factory is null");
if(destination == null)
throw new IllegalArgumentException("Message destination is null");
Connection connection = null;
try{
connection = connFactory.createConnection();
Session session = connection.createSession(sessionTransacted, acknowledgeMode);
MessageProducer messageProducer = session.createProducer(destination);
TextMessage textMessage = session.createTextMessage();
textMessage.setText(payload);
messageProducer.send(textMessage);
} finally {
if(connection != null){
try{
connection.close();
} catch (JMSException ignore){
}
}
}
}
在哪里
SysLogEntry
是一个带有 JAXB 注释的类,我用于序列化JMS_CONNECTION_FACTORY_JNDI_NAME
是 XA 连接工厂的 JNDI 名称
但是,每次我创建日志消息的事务回滚时,日志消息都不会放入记录器输入队列。
有人可以告诉我我的代码有什么问题吗?我曾考虑使用一个单独的无状态会话 bean,它会启动一个新事务来生成日志消息,但这种方法有一个缺点:在 EJB 中,我可以轻松地让容器注入记录器 bean,但我也有非 EJB我想在其中进行异步日志记录的对象。
我的应用服务器是 Weblogic 10.3.3