Медленная доставка сообщений в приложении Java с использованием oracle Advanced QueueJAVA

Программисты JAVA общаются здесь
Anonymous
Медленная доставка сообщений в приложении Java с использованием oracle Advanced Queue

Сообщение Anonymous »

У меня есть приложение Java, которое подключается к Oracle Advanced Queue (AQ) и прослушивает различные типы событий. Сервер Java и сервер Oracle находятся на разных машинах, но в одной и той же сети обработки данных. Despite a very low event generation rate, we frequently observe delays of around 10 seconds between enqueueing an event and receiving it in Java.
To measure this, we:

[*]Insert a log entry with a timestamp into a table just before pushing the event onto the AQ queue.
Log another timestamp in our Java MessageListener, как только появится сообщение. (См. Используемые зависимости ниже) (См. Реализацию подключения ниже)

com.oracle.database.messaging
aqapi-jakarta
23.3.1.0


jakarta.jms
jakarta.jms-api
3.1.0


jakarta.transaction
jakarta.transaction-api
2.0.1



фабрика соединения
@Component
public class QueueConn {
private static final Logger LOGGER = LoggerFactory.getLogger(QueueConn.class);

@Override
public QueueConnectionWrapper createQueueConnectionWrapper()
throws JMSException, SQLException {
Connection dbConn = getConnection();
try {
QueueConnection aqConn =
AQjmsQueueConnectionFactory.createQueueConnection(dbConn);
return new QueueConnectionWrapper(dbConn, aqConn);
} catch (JMSException | RuntimeException e) {
close(dbConn);
if (e instanceof JMSException) throw (JMSException) e;
throw new SQLException("Failed to create AQ queue connection", e);
}
}

@Override
public void close(Connection c) {
if (c != null) {
try {
c.close();
} catch (SQLException e) {
LOGGER.error("Failed to close DB connection", e);
}
}
}

@Override
public QueueSession createQueueSession(QueueConnection queueConnection)
throws JMSException {
return queueConnection.createQueueSession(
false, Session.CLIENT_ACKNOWLEDGE);
}

@Override
public MessageConsumer createMessageConsumer(
String queueName,
QueueSession queueSession,
String schemaName
) throws JMSException, SQLException {
Queue queue = ((AQjmsSession) queueSession)
.getQueue(schemaName, queueName);
return queueSession.createConsumer(queue);
}

private Connection getConnection() throws SQLException {
DatabaseConfig cfg = /* load config */;
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource");
pds.setURL(cfg.connectionString());
pds.setUser(cfg.username());
pds.setPassword(cfg.password());
pds.setValidateConnectionOnBorrow(cfg.validateConnectionOnBorrow());
pds.setInitialPoolSize(cfg.initialPoolSize());
pds.setMaxPoolSize(cfg.maxPoolSize());
pds.setMaxIdleTime(cfg.maxIdleTime());
pds.setSecondsToTrustIdleConnection(cfg.secondsToTrustIdleConnection());
return pds.getConnection();
}
}

реализация прослушивателя
public class Listener implements MessageListener {
private static final Logger LOGGER = LoggerFactory.getLogger(Listener.class);

@Override
public void onMessage(Message message) {
// log timestamp and process message
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... nced-queue

Вернуться в «JAVA»