Ev.Rei.
Ev.Rei.

Reputation: 283

Oracle Advanced Queuing and Jakarta namespace

I am using Oracle AQ in my Java Spring Boot application. I have Oracle JMS implementation AQAPI as dependencies.

Recently I had tried to update the application to Spring Boot 3.x which is build on Jakarta, not Javax namespace. However my code is no longer compatible with Oracle AQ since is using Javax namespace, i.e. javax.jms.Connection.

So question how to solve this problem? Seems like Oracle has not yet produced new version of AQAPI compatible with Jakarta MS

Upvotes: 3

Views: 2150

Answers (2)

jahk04
jahk04

Reputation: 56

Just to complete @mathze's response and copy/paste here current official maven coordinates.

You just have to migrate to 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. note that -jakarta was added in artifactId.

Upvotes: 4

gavgav
gavgav

Reputation: 1

I had the same problem when upgrading to Spring boot 3, so I wrote an adapter to wrap javax.jms based AQAPI as jakarta.jms:

<dependency>
    <groupId>net.sf.gavgav</groupId>
    <artifactId>jakarta-javax-jms-adapter</artifactId>
    <version>1.0.0</version>
</dependency>

This is just a collection of jakarata.jms interfaces delegating calls to corresponding javax.jms implementation: https://sourceforge.net/p/jakarta-javax-jms-adapter/code/ci/master/tree/src/main/java/net/sf/gavgav/jakartajavax/jms/

For example: Wrapping AQjmsFactory (javax.jms.ConnectionFactory) as jakarta.jms.ConnectionFactory in Spring boot 3:

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);
        }
    }

Implementing Spring's DestinationResolver for JmsTemplate or DefaultJmsListenerContainerFactory:

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);
        }
    }
}

Upvotes: 0

Related Questions