我在Java Spring Boot应用程序中使用Oracle AQ。我有Oracle JMS实现AQAPI作为依赖项。
最近我尝试将应用程序更新到Spring Boot 3。它是基于Jakarta而不是Javax命名空间构建的。然而,我的代码不再与Oracle AQ兼容,因为使用Javax命名空间,即Javax .jms. connection。
那么问题是如何解决这个问题呢?似乎Oracle还没有推出与Jakarta MS兼容的新版本AQAPI
只是为了完成@mathze的响应并复制/粘贴当前官方maven坐标。
你只需要迁移到com.oracle.database.messaging:aqapi-jakarta
(Jakarta JMS 3.0)
<!-- https://mvnrepository.com/artifact/com.oracle.database.messaging/aqapi-jakarta -->
<dependency>
<groupId>com.oracle.database.messaging</groupId>
<artifactId>aqapi-jakarta</artifactId>
<version>23.2.0.0</version>
</dependency>
NB。注意,-jakarta
被添加到artifactId中。
我在升级到Spring boot 3时遇到了同样的问题,所以我编写了一个适配器来包装javax。基于jakarta.jms的AQAPI:
<dependency>
<groupId>net.sf.gavgav</groupId>
<artifactId>jakarta-javax-jms-adapter</artifactId>
<version>1.0.0</version>
</dependency>
这只是雅加达的一个集合。JMS接口将调用委托给相应的javax。jms实现:https://sourceforge.net/p/jakarta-javax-jms-adapter/code/ci/master/tree/src/main/java/net/sf/gavgav/jakartajavax/jms/
例如:将AQjmsFactory (javax.jms.ConnectionFactory)封装为jakarta.jms.ConnectionFactory
import java.sql.SQLException;
import javax.sql.DataSource;
import jakarta.jms.ConnectionFactory;
import jakarta.jms.JMSException;
import net.sf.gavgav.jakartajavax.jms.JakartaJmsConnectionFactory;
import net.sf.gavgav.jakartajavax.jms.JmsException;
import oracle.jms.AQjmsFactory;
...
@Bean
public ConnectionFactory connectionFactory(DataSource ds) throws JMSException, SQLException {
try {
return new JakartaJmsConnectionFactory(AQjmsFactory.getQueueConnectionFactory(ds));
} catch (javax.jms.JMSException e) {
throw JmsException.wrap(e);
}
}
为JmsTemplate或DefaultJmsListenerContainerFactory实现Spring的DestinationResolver:
import net.sf.gavgav.jakartajavax.jms.JakartaJmsSession;
import net.sf.gavgav.jakartajavax.jms.JakartaJmsQueue;
import net.sf.gavgav.jakartajavax.jms.JmsException;
import jakarta.jms.Destination;
import jakarta.jms.Session;
import oracle.jms.AQjmsSession;
import org.springframework.jms.support.destination.DestinationResolver;
public class AqDestinationResolver implements DestinationResolver {
private final String schema;
public AqDestinationResolver(String schema) {
this.schema = schema;
}
@Override
public Destination resolveDestinationName(Session session, String destinationName, boolean pubSubDomain) throws JMSException {
JakartaJmsSession jakartaSession = (JakartaJmsSession) session;
try {
AQjmsSession aqjmsSession = ((AQjmsSession) jakartaSession.getSession());
javax.jms.Queue aqjmsQueue = aqjmsSession.getQueue(schema, destinationName);
return new JakartaJmsQueue(aqjmsQueue);
} catch (javax.jms.JMSException e) {
throw JmsException.wrap(e);
}
}
}