Sorry, I do see the “unwrap” call now, but what I can’t correlate is your code 
to the stack trace. Actually, it appears from your stack trace that in your 
GESBOProcessor on line 183 you are attempting to cast the 
org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper to 
OracleConnection and the unwrap call is supposed to be called on such 
connection. Can you clarify?

Cheers
Oleg

> On Mar 15, 2017, at 2:29 PM, Anil Rai <[email protected]> wrote:
> 
> Hi Oleg, if you look at the java code and logs i sent in the previous
> email, it does have the code to unwrap. But it is not allowing to cast that
> connection object back to OracleConnection. It fails.
> 
> On Wed, Mar 15, 2017 at 2:14 PM, Oleg Zhurakousky <
> [email protected]> wrote:
> 
>> Ok, so it appears that DBCP does not like you to get access to the
>> underlying connection without additional configuration, but Java does since
>> java.sql.Connection extends java.sql.Wrapper from which you can do
>> something like this:
>> 
>> Connection dbConnection= d.getConnection();
>> OracleConnection orcConnection = null;
>> if (dbConnection.isWrapperFor(OracleConnection.class)) {
>>        orcConnection = dbConnection.unwrap(OracleConnection.class);
>> }
>> . . .
>> 
>> Let me know
>> 
>> Cheers
>> Oleg
>> 
>> On Mar 15, 2017, at 1:33 PM, Anil Rai <[email protected]<mailto:
>> [email protected]>> wrote:
>> 
>> Hi Oleg, we tried and no luck. This is another example where we are seeing
>> similar issue. Attached txt has the java code as well as the log.
>> 
>> Thanks in advance
>> Anil
>> 
>> 
>> On Wed, Mar 15, 2017 at 10:02 AM, Anil Rai <[email protected]<mailto:
>> [email protected]>> wrote:
>> Thanks Oleg. Makes sense. Will try and keep you posted.
>> 
>> Regards
>> Anil
>> 
>> 
>> On Wed, Mar 15, 2017 at 9:56 AM, Oleg Zhurakousky <
>> [email protected]<mailto:[email protected]>> wrote:
>> Anil
>> 
>> Thank you for details. That does help a lot.
>> 
>> First, I want to make sure that it is clear that this is not a NiFi issue,
>> since the problem is specific to the combination of DBCP and Oracle and the
>> expectations between the two.
>> 
>> Seems like Oracle JDBC connection is wrapped in an implementation specific
>> class (DBCP in this case I assume).
>> It is my believe that you need to obtain reference to native Oracle
>> connection to avoid "JMS-112: Connection is invalid".
>> So, I think you need to try to cast your Connection object to DBCPs
>> DelegatingConnection and then do something like this:
>> 
>> DelegatingConnection wrappedConn = (DelegatingConnection)con;
>> OracleConnection ocon =  null ;
>> if (wrappedConn != null)
>>     ocon = (OracleConnection) wrappedConn.getDelegate();
>>     . . .
>> 
>> Let me know how it goes
>> 
>> Cheers
>> Oleg
>> 
>>> On Mar 15, 2017, at 9:20 AM, Anil Rai <[email protected]<mailto:
>> [email protected]>> wrote:
>>> 
>>> 2017-03-14 16:50:42,312 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
>>> 2017-03-14 16:50:42,313 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
>>> 2017-03-14 16:50:42,313 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.ScheduledThreadPoolExecutor$
>> ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
>>> 2017-03-14 16:50:42,313 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.ScheduledThreadPoolExecutor$
>> ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
>>> 2017-03-14 16:50:42,313 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.ThreadPoolExecutor.runWorker(
>> ThreadPoolExecutor.java:1142)
>>> 2017-03-14 16:50:42,313 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(
>> ThreadPoolExecutor.java:617)
>>> 2017-03-14 16:50:42,313 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at java.lang.Thread.run(Thread.java:745)
>>> 2017-03-14 16:50:43,567 INFO [NiFi logging handler]
>> org.apache.nifi.StdOut
>>> Databse Connection :- jdbc:oracle:thin:@xxxog.yy.com:1521/DB1<
>> http://jdbc:oracle:thin:@xxxog.yy.com:1521/DB1>,
>>> UserName=user, Oracle JDBC driver
>>> 2017-03-14 16:50:43,567 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>> oracle.AQ.AQException: JMS-112: Connection is invalid
>>> 2017-03-14 16:50:43,567 INFO [NiFi logging handler]
>> org.apache.nifi.StdOut
>>> AQ Driver Class ---> oracle.AQ.AQOracleDriver
>>> 2017-03-14 16:50:43,567 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>> 2017-03-14 16:50:43,568 INFO [NiFi logging handler]
>> org.apache.nifi.StdOut
>>> Aq Sesssion ---> null
>>> 2017-03-14 16:50:43,568 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>> 2017-03-14 16:50:43,568 INFO [NiFi logging handler]
>> org.apache.nifi.StdOut
>>> Queue Owner ---> APPS
>>> 2017-03-14 16:50:43,568 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at oracle.AQ.AQDriverManager.createAQSession(
>> AQDriverManager.java:193)
>>> 2017-03-14 16:50:43,569 INFO [NiFi logging handler]
>> org.apache.nifi.StdOut
>>> QueueName ---> WF_BPEL_Q
>>> 2017-03-14 16:50:43,569 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> com.oracle.xx.connector.processors.xx_SCon_ConsumeAQ.xx_Scon_ConsumeAQ.
>> createSession(xx_Scon_ConsumeAQ.java:183)
>>> 2017-03-14 16:50:43,569 INFO [NiFi logging handler]
>> org.apache.nifi.StdOut
>>> EventName ---> oracle.apps.ar.hz.CustAcctSite.update
>>> 2017-03-14 16:50:43,569 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> com.oracle.xx.connector.processors.XX_SCon_ConsumeAQ.
>> XX_Scon_ConsumeAQ.onTrigger(XX_Scon_ConsumeAQ.java:254)
>>> 2017-03-14 16:50:43,569 INFO [NiFi logging handler]
>> org.apache.nifi.StdOut
>>> Consumer Name ---> ORA_69242HHG6SR4CGPI6KSJ8DI36T
>>> 2017-03-14 16:50:43,569 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> org.apache.nifi.processor.AbstractProcessor.onTrigger(
>> AbstractProcessor.java:27)
>>> 2017-03-14 16:50:43,569 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> org.apache.nifi.controller.StandardProcessorNode.onTrigger(
>> StandardProcessorNode.java:1099)
>>> 2017-03-14 16:50:43,569 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(
>> ContinuallyRunProcessorTask.java:136)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> org.apache.nifi.controller.tasks.ContinuallyRunProcessorTask.call(
>> ContinuallyRunProcessorTask.java:47)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(
>> TimerDrivenSchedulingAgent.java:132)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.ScheduledThreadPoolExecutor$
>> ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.ScheduledThreadPoolExecutor$
>> ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.ThreadPoolExecutor.runWorker(
>> ThreadPoolExecutor.java:1142)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at
>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(
>> ThreadPoolExecutor.java:617)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>>     at java.lang.Thread.run(Thread.java:745)
>>> 2017-03-14 16:50:43,570 ERROR [NiFi logging handler]
>> org.apache.nifi.StdErr
>>> java.lang.NullPointerException
>>> 
>>> 
>>> On Wed, Mar 15, 2017 at 9:09 AM, Oleg Zhurakousky <
>>> [email protected]<mailto:[email protected]>>
>> wrote:
>>> 
>>>> Anil
>>>> 
>>>> Unfortunately the attachment didn’t come thru. Perhaps you can just
>> paste
>>>> the relevant part of the exception.
>>>> 
>>>> Cheers
>>>> Oleg
>>>> 
>>>> On Mar 15, 2017, at 8:58 AM, Anil Rai <[email protected]<mailto:
>> [email protected]><mailto:
>>>> [email protected]<mailto:[email protected]>>> wrote:
>>>> 
>>>> Hi Oleg, Thanks. attached is the log. Let me know if you want us to
>> change
>>>> the log levels and re-run and send you additional logs?
>>>> 
>>>> 
>>>> On Tue, Mar 14, 2017 at 5:12 PM, Oleg Zhurakousky <
>>>> [email protected]<mailto:[email protected]
>>> <mailto:[email protected]<mailto:[email protected]
>>>>> wrote:
>>>> Anil
>>>> 
>>>> I understand that you are having an issue and we are here to help, but
>> we
>>>> can only do this if you help us just a little more, so it would be very
>>>> helpful if you provided a stack trace (I understand if you have to mask
>>>> sensitive information).
>>>> The “. . .fails saying cannot create AQSession. . .” could be due to
>>>> various reasons and until we see the stack trace everything here would
>> be
>>>> speculation.
>>>> I hope you understand
>>>> 
>>>> Cheers
>>>> Oleg
>>>> 
>>>>> On Mar 14, 2017, at 4:59 PM, Anil Rai <[email protected]<mailto:
>> [email protected]><mailto:
>>>> [email protected]<mailto:[email protected]>>> wrote:
>>>>> 
>>>>> Here is the behaviour that we have seen so for....hope this helps
>>>>> 
>>>>> 1. When we run the java code in eclipse, it works and this is the
>>>>> connection object that is printed ->
>>>>> oracle.jdbc.driver.T4CConnection@6f75e721
>>>>> 2. When we hard code all the values as mentioned in my first email in
>> a
>>>>> custom processor, deploy that. It works as well. The above connection
>>>>> object gets printed.
>>>>> 3. When we change the code in the custom processor to use the DBCP
>>>>> connection service, deploy that. The connection object that gets
>>>> printed is
>>>>> jdbc:oracle:thin:@oged-scan.og.ge.com:1521/ORPOGPB1<http:/
>> /jdbc:oracle:thin:@oged-scan.og.ge.com:1521/ORPOGPB1><http:/
>>>> /jdbc:oracle:thin:@oged-scan.og.ge.com:1521/ORPOGPB1<http:/
>> /jdbc:oracle:thin:@oged-scan.og.ge.com:1521/ORPOGPB1>> and this does not
>>>>> work. aqSession = AQDriverManager.createAQSession(connection) fails
>>>>> saying cannot create AQSession.
>>>>> 
>>>>> Thanks
>>>>> Anil
>>>>> 
>>>>> 
>>>>> On Tue, Mar 14, 2017 at 4:13 PM, Oleg Zhurakousky <
>>>>> [email protected]<mailto:[email protected]
>>> <mailto:[email protected]<mailto:[email protected]
>>>>> 
>>>> wrote:
>>>>> 
>>>>>> Anil
>>>>>> 
>>>>>> When you say "it does not like the connection object. . .” what do you
>>>>>> mean by that?
>>>>>> Can you please provide stack trace or some other details?
>>>>>> 
>>>>>> Cheers
>>>>>> Oleg
>>>>>> 
>>>>>>> On Mar 14, 2017, at 4:06 PM, Anil Rai <[email protected]<mailto:
>> [email protected]><mailto:
>>>> [email protected]<mailto:[email protected]>>> wrote:
>>>>>>> 
>>>>>>> Thanks Russ. Yes, we are doing exactly the same thing.
>>>>>>> 
>>>>>>>     driverClass = context.getProperty(DRIVER_CLASS).getValue();
>>>>>>>     queueName = context.getProperty(QUEUE_NAME).getValue();
>>>>>>>     databaseSchema = context.getProperty(DATABASE_
>>>> SCHEMA).getValue();
>>>>>>>     consumerName = context.getProperty(CONSUMER_NAME).getValue();
>>>>>>>     eventName = context.getProperty(EVENT_NAME).getValue();
>>>>>>>     DBCPService connection =
>>>>>>> context.getProperty(JDBC_CONNECTION_POOL).asControllerService(
>>>>>> DBCPService.class);
>>>>>>>     Connection conn = connection.getConnection();
>>>>>>> *        aqSession = AQDriverManager.createAQSession(connection);*
>>>>>>> 
>>>>>>> The underlined code above fails as it does not like the connection
>>>> object
>>>>>>> that is returned by the DBCPService.
>>>>>>> 
>>>>>>> Regards
>>>>>>> Anil
>>>>>>> 
>>>>>>> 
>>>>>>> On Tue, Mar 14, 2017 at 2:43 PM, Russell Bateman <
>>>> [email protected]<mailto:[email protected]><mailto:r
>> [email protected]<mailto:[email protected]>>>
>>>>>>> wrote:
>>>>>>> 
>>>>>>>> Anil,
>>>>>>>> 
>>>>>>>> Typically, your custom processor should have a property, something
>>>> like
>>>>>>>> 
>>>>>>>> public static final PropertyDescriptor DBCP_SERVICE = new
>>>>>>>> PropertyDescriptor.Builder()
>>>>>>>>         .name("Database Connection Pooling Service")
>>>>>>>>         .description("The Controller Service that is used to obtain
>>>>>>>> connection to database")
>>>>>>>>         .required(true)
>>>>>>>>         .identifiesControllerService(DBCPService.class)
>>>>>>>>         .build();
>>>>>>>> 
>>>>>>>> When your NiFi user sets up the flow, he or she puts a reference to
>>>>>> NiFi's
>>>>>>>> DBCPConnectionPool in it. In configuring that (a ControllerService,
>>>> you
>>>>>>>> tell it that it's Oracle, location, etc.)
>>>>>>>> 
>>>>>>>> Then, your onTrigger() code would do something like this:
>>>>>>>> 
>>>>>>>>     final DBCPService dbcpService = context.getProperty(DBCP_SERVI
>>>>>>>> CE).asControllerService(DBCPService.class);
>>>>>>>> 
>>>>>>>> 
>>>>>>>> and later...
>>>>>>>> 
>>>>>>>> 
>>>>>>>>     try (final Connection connection = dbcpService.getConnection())
>>>>>>>>     {
>>>>>>>>         try (final Statement stmt = connection.createStatement(
>>>>>> ResultSet.TYPE_FORWARD_ONLY,
>>>>>>>> ResultSet.CONCUR_READ_ONLY))
>>>>>>>> 
>>>>>>>> etc.
>>>>>>>> 
>>>>>>>> Does this help?
>>>>>>>> 
>>>>>>>> Russ
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On 03/14/2017 11:54 AM, Anil Rai wrote:
>>>>>>>> 
>>>>>>>>> We have a use case to connect to oracle database and subscribe to
>>>>>> Advanced
>>>>>>>>> Queuing (https://docs.oracle.com/cd/A58617_01/server.804/a58241/
>>>>>> ch_aq.htm
>>>>>>>>> ).
>>>>>>>>> Below is the java snippet to establish this connection from a java
>>>>>> client.
>>>>>>>>> We can run this in eclipse and consume message from the advanced
>>>> queue.
>>>>>>>>> **************
>>>>>>>>>          Class.forName("oracle.jdbc.driver.OracleDriver");
>>>>>>>>>          connection = DriverManager.getConnection("
>>>>>>>>> jdbc:oracle:thin:@xxx-yyy.zzz.com:1521/DB1<http://jdbc:
>> oracle:thin:@xxx-yyy.zzz.com:1521/DB1><http://jdbc<http://jdbc/>:
>>>> oracle:thin:@xxx-yyy.zzz.com:1521/DB1<http://oracle:thin:@
>> xxx-yyy.zzz.com:1521/DB1>>","user", "pwd");
>>>>>>>>>          connection.setAutoCommit(true);
>>>>>>>>>          Class.forName("oracle.AQ.AQOracleDriver");
>>>>>>>>>          aqSession = AQDriverManager.createAQSession(connection);
>>>>>>>>>          System.out.println("AQ Session --->" + aqSession);
>>>>>>>>> ********************
>>>>>>>>> 
>>>>>>>>> We have created a custom processor in Nifi. This processor is
>> getting
>>>>>> the
>>>>>>>>> connection string using getConnection function of Standard DBCP
>>>>>> service.
>>>>>>>>> The problem is, the connection object that is retrieved from
>> eclipse
>>>>>>>>> versus
>>>>>>>>> what is returned from DBCP service is different. We have made sure
>> we
>>>>>> are
>>>>>>>>> referring to the same jar both in eclipse and Nifi (ojdbc7.jar)
>>>>>>>>> It fails @  aqSession = AQDriverManager.
>> createAQSession(connection);
>>>>>>>>> The connection object that comes from DBCP is not what is expected
>> by
>>>>>>>>> AQDriverManager.
>>>>>>>>> 
>>>>>>>>> Any help is greatly appreciated.
>>>>>>>>> 
>>>>>>>>> Thanks
>>>>>>>>> Anil
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>> 
>> 
>> 
>> <oracle_error.txt>
>> 
>> 

Reply via email to