Configurazione del modulo JMS logico Web con le code Oracle AQ
-
28-10-2019 - |
Domanda
Ho provato a impostare un server Web logic che può utilizzare un'implementazione Oracle AQ JMS, ma per qualche motivo il mio pool di connessioni WLS non può vedere la coda che ho creato, l'unico modo in cui posso vedere la coda nella logica web è quello di creare il pool di connessioni dati di dati logici Web Utilizzare le credenziali dell'utente DB che ha creato la coda.
Ho fatto quanto segue come admin_user:
Creato una tabella coda
EXECUTE DBMS_AQADM.CREATE_QUEUE_TABLE(queue_table=>'testqueue_table',queue_payload_type=>'sys.aq$_jms_text_message');
Ha creato una coda
EXECUTE dbms_aqadm.create_queue(queue_name=>'testqueue', queue_table=>'testqueue_table');
Ha iniziato la coda
EXECUTE dbms_aqadm.start_queue(queue_name=>'testqueue');
Concesse le autorizzazioni utente CPOOL
GRANT aq_user_role TO cpool;
EXECUTE DBMS_AQADM.grant_queue_privilege(privilege=>'ALL', queue_name=>'adming_user.testqueue', grantee=>'cpool',grant_option=>FALSE);
Imposta 2 dati JDBC nella logica webHo impostato 2 dati di dati nella logica Web che si connettono al mio database, entrambi sono identici tranne per il fatto che si utilizza il cpool l'utente e gli altri usi admin_user
Crea moduli JMSOra registro un modulo JMS con i dati di dati JDBC e collego i nomi JDNI locali e stranieri.
Se utilizzo la dataSource che utilizza admin_user Tutto funziona bene e la mia applicazione distribuita può trovare la coda in JNDI.
ProblemaSe utilizzo l'origine dati che utilizza cpool Quindi fallisce trova il pool di connessioni in JNDI ma mai la coda (nonostante il fatto che abbia funzionato per admin_user). Ricevo il seguente errore da WL:
Related cause:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testqueue': Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Cannot resolve name:Queues/TESTQUEUE
Qualcuno sa perché WL non può risolvere il nome JNDI per la coda a meno che non utilizzo l'account admin_user per il mio dati dati.
Soluzione
La risposta è stata che al mio utente del pool di connessioni mancava alcune sovvenzioni, quanto segue:
GRANT EXECUTE on DBMS_AQ to <CPOOL>;
GRANT EXECUTE on DBMS_AQADM to <CPOOL>;
GRANT aq_user_role to <CPOOL>;
Assicurati che l'utente che crea l'accesso alle sovvenzioni di destinazione all'utente del pool di connessioni:
`EXECUTE DBMS_AQADM.grant_queue_privilege(privilege=>'ALL', queue_name=>'<SCHEMAOWNER>.docprod_queue', grantee=>'<CPOOL>',grant_option=>FALSE);`
Infine, in Web Logic assicurarsi di fare riferimento alla destinazione con il loro nome JNDI straniero completo:
Queues/<SCHEMA OWNER>.<DESTINATION_NAME>