A method to asynchronously LISTEN ?

classic Classic list List threaded Threaded
16 messages Options
Reply | Threaded
Open this post in threaded view
|

A method to asynchronously LISTEN ?

Philippe Ebersohl
Hello,
I checked the documentation and FAQ at jdbc.postgresql.org
Is there a roadmap of feature implementation for the jdbc driver ?

Are there plans to include something similar to the PGNotificationListener found in pgjdbc-ng?
Which does not require to send SELECT to the postgres.

We would if possible only use one postgresql jdbc driver.

I hope I hit the right list for my questions.
Thank you.

Best regards,
Philippe Ebersohl



(null)

Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Dave Cramer-8
Hi Philippe,

So this is old, but I didn't get much response https://github.com/pgjdbc/pgjdbc/pull/579

have a look and see if it works for you. If so we can look at putting it in.

On Sat, 16 Feb 2019 at 03:36, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I checked the documentation and FAQ at jdbc.postgresql.org
Is there a roadmap of feature implementation for the jdbc driver ?

Are there plans to include something similar to the PGNotificationListener found in pgjdbc-ng?
Which does not require to send SELECT to the postgres.

We would if possible only use one postgresql jdbc driver.

I hope I hit the right list for my questions.
Thank you.

Best regards,
Philippe Ebersohl



(null)

Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Philippe Ebersohl
Hello Dave,

This is, sir, what we would like !

However looking at  line 47-50 of 

How do we guaranty that the listener is called before the assertTrue() is fired ?

stmt.executeUpdate("NOTIFY mynotification");


assertTrue(flag.get());

Best regards,
Philippe




From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "List" <[hidden email]>
Sent: Friday, 22 February, 2019 20:03:46
Subject: Re: A method to asynchronously LISTEN ?

Hi Philippe,
So this is old, but I didn't get much response https://github.com/pgjdbc/pgjdbc/pull/579

have a look and see if it works for you. If so we can look at putting it in.

On Sat, 16 Feb 2019 at 03:36, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I checked the documentation and FAQ at jdbc.postgresql.org
Is there a roadmap of feature implementation for the jdbc driver ?

Are there plans to include something similar to the PGNotificationListener found in pgjdbc-ng?
Which does not require to send SELECT to the postgres.

We would if possible only use one postgresql jdbc driver.

I hope I hit the right list for my questions.
Thank you.

Best regards,
Philippe Ebersohl



(null)


Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Dave Cramer-8
Philippe




On Mon, 25 Feb 2019 at 04:15, Philippe Ebersohl <[hidden email]> wrote:
Hello Dave,

This is, sir, what we would like !

However looking at  line 47-50 of 

How do we guaranty that the listener is called before the assertTrue() is fired ?

stmt.executeUpdate("NOTIFY mynotification");


assertTrue(flag.get());

I'm not sure exactly what you mean

Dave Cramer

[hidden email]


From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "List" <[hidden email]>
Sent: Friday, 22 February, 2019 20:03:46
Subject: Re: A method to asynchronously LISTEN ?

Hi Philippe,
So this is old, but I didn't get much response https://github.com/pgjdbc/pgjdbc/pull/579

have a look and see if it works for you. If so we can look at putting it in.

On Sat, 16 Feb 2019 at 03:36, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I checked the documentation and FAQ at jdbc.postgresql.org
Is there a roadmap of feature implementation for the jdbc driver ?

Are there plans to include something similar to the PGNotificationListener found in pgjdbc-ng?
Which does not require to send SELECT to the postgres.

We would if possible only use one postgresql jdbc driver.

I hope I hit the right list for my questions.
Thank you.

Best regards,
Philippe Ebersohl



(null)


Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Philippe Ebersohl
Hello,

This feature is indeed what we would need.
In fact I do not understand how the test case works.
I am more a sql/database guy.

Best regards,
Philippe Ebersohl



From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "List" <[hidden email]>
Sent: Monday, 25 February, 2019 16:13:49
Subject: Re: A method to asynchronously LISTEN ?

Philippe



On Mon, 25 Feb 2019 at 04:15, Philippe Ebersohl <[hidden email]> wrote:
Hello Dave,

This is, sir, what we would like !

However looking at  line 47-50 of 

How do we guaranty that the listener is called before the assertTrue() is fired ?

stmt.executeUpdate("NOTIFY mynotification");


assertTrue(flag.get());

I'm not sure exactly what you mean

Dave Cramer

[hidden email]


From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "List" <[hidden email]>
Sent: Friday, 22 February, 2019 20:03:46
Subject: Re: A method to asynchronously LISTEN ?

Hi Philippe,
So this is old, but I didn't get much response https://github.com/pgjdbc/pgjdbc/pull/579

have a look and see if it works for you. If so we can look at putting it in.

On Sat, 16 Feb 2019 at 03:36, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I checked the documentation and FAQ at jdbc.postgresql.org
Is there a roadmap of feature implementation for the jdbc driver ?

Are there plans to include something similar to the PGNotificationListener found in pgjdbc-ng?
Which does not require to send SELECT to the postgres.

We would if possible only use one postgresql jdbc driver.

I hope I hit the right list for my questions.
Thank you.

Best regards,
Philippe Ebersohl



(null)


Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

David G Johnston
In reply to this post by Dave Cramer-8
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

David J.

On Mon, Feb 25, 2019 at 8:14 AM Dave Cramer <[hidden email]> wrote:
Philippe




On Mon, 25 Feb 2019 at 04:15, Philippe Ebersohl <[hidden email]> wrote:
Hello Dave,

This is, sir, what we would like !

However looking at  line 47-50 of 

How do we guaranty that the listener is called before the assertTrue() is fired ?

stmt.executeUpdate("NOTIFY mynotification");


assertTrue(flag.get());

I'm not sure exactly what you mean

Dave Cramer

[hidden email]


From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "List" <[hidden email]>
Sent: Friday, 22 February, 2019 20:03:46
Subject: Re: A method to asynchronously LISTEN ?

Hi Philippe,
So this is old, but I didn't get much response https://github.com/pgjdbc/pgjdbc/pull/579

have a look and see if it works for you. If so we can look at putting it in.

On Sat, 16 Feb 2019 at 03:36, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I checked the documentation and FAQ at jdbc.postgresql.org
Is there a roadmap of feature implementation for the jdbc driver ?

Are there plans to include something similar to the PGNotificationListener found in pgjdbc-ng?
Which does not require to send SELECT to the postgres.

We would if possible only use one postgresql jdbc driver.

I hope I hit the right list for my questions.
Thank you.

Best regards,
Philippe Ebersohl



(null)


Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Dave Cramer-8


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


David J.

On Mon, Feb 25, 2019 at 8:14 AM Dave Cramer <[hidden email]> wrote:
Philippe




On Mon, 25 Feb 2019 at 04:15, Philippe Ebersohl <[hidden email]> wrote:
Hello Dave,

This is, sir, what we would like !

However looking at  line 47-50 of 

How do we guaranty that the listener is called before the assertTrue() is fired ?

stmt.executeUpdate("NOTIFY mynotification");


assertTrue(flag.get());

I'm not sure exactly what you mean

Dave Cramer

[hidden email]


From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "List" <[hidden email]>
Sent: Friday, 22 February, 2019 20:03:46
Subject: Re: A method to asynchronously LISTEN ?

Hi Philippe,
So this is old, but I didn't get much response https://github.com/pgjdbc/pgjdbc/pull/579

have a look and see if it works for you. If so we can look at putting it in.

On Sat, 16 Feb 2019 at 03:36, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I checked the documentation and FAQ at jdbc.postgresql.org
Is there a roadmap of feature implementation for the jdbc driver ?

Are there plans to include something similar to the PGNotificationListener found in pgjdbc-ng?
Which does not require to send SELECT to the postgres.

We would if possible only use one postgresql jdbc driver.

I hope I hit the right list for my questions.
Thank you.

Best regards,
Philippe Ebersohl



(null)


Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

David G Johnston
On Tue, Feb 26, 2019 at 12:04 PM Dave Cramer <[hidden email]> wrote:


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


You'd still want an asynchronous API for people but JavaScript introduced the "async/await" feature for a reason.  In this case making it "sync" instead of coding up wait loop seems desirable.  That said its quite possible I'm missing some existing feature as I haven't used this API at all.

David J.

Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Philippe Ebersohl
Hello,
I do not think there is a need for something like conn.listenSync().
We were just intrigued about the test.

In fact the current proposition should just work fine and we would like to test it.
How could we have access to a postgresql-*.jdbc.jar that includes this feature ?

Regards,
Philippe 



From: "David G. Johnston" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "Philippe Ebersohl" <[hidden email]>, "List" <[hidden email]>
Sent: Tuesday, 26 February, 2019 22:17:12
Subject: Re: A method to asynchronously LISTEN ?

On Tue, Feb 26, 2019 at 12:04 PM Dave Cramer <[hidden email]> wrote:


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


You'd still want an asynchronous API for people but JavaScript introduced the "async/await" feature for a reason.  In this case making it "sync" instead of coding up wait loop seems desirable.  That said its quite possible I'm missing some existing feature as I haven't used this API at all.

David J.


Visit us on EuroDUO 2019 in Lisbon
Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Dave Cramer-8


On Wed, 27 Feb 2019 at 05:47, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I do not think there is a need for something like conn.listenSync().
We were just intrigued about the test.

In fact the current proposition should just work fine and we would like to test it.
How could we have access to a postgresql-*.jdbc.jar that includes this feature ?

Regards,
Philippe 

I just rebased it over the current code https://github.com/pgjdbc/pgjdbc/pull/579
You should be able to build it manually using the commandline instructions to get the pull 

git checkout -b davecramer-notify master

then use maven to build it





From: "David G. Johnston" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "Philippe Ebersohl" <[hidden email]>, "List" <[hidden email]>
Sent: Tuesday, 26 February, 2019 22:17:12
Subject: Re: A method to asynchronously LISTEN ?

On Tue, Feb 26, 2019 at 12:04 PM Dave Cramer <[hidden email]> wrote:


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


You'd still want an asynchronous API for people but JavaScript introduced the "async/await" feature for a reason.  In this case making it "sync" instead of coding up wait loop seems desirable.  That said its quite possible I'm missing some existing feature as I haven't used this API at all.

David J.


Visit us on EuroDUO 2019 in Lisbon
Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Philippe Ebersohl
Hello,
we retrieved the sources.


After starting the testNotify() below, we execute from pgadmin : notify mynotification

But the listener is not notified.

Did we miss something ?



public void testNotify() throws SQLException, InterruptedException {
            final AtomicBoolean flag = new AtomicBoolean(false);
            Statement stmt = conn.createStatement();
            ((org.postgresql.PGConnection)conn).addNotificationListener(new org.postgresql.PGNotificationListener() {
              @Override
              public void notification(org.postgresql.PGNotification notification) {
                flag.set(true);

                    System.out.println("Notification received");

              }
            });
            stmt.executeUpdate("LISTEN mynotification");
//            stmt.executeUpdate("NOTIFY mynotification");

            Thread.sleep(30000);
           
            org.postgresql.PGNotification[] notifications = conn.unwrap(org.postgresql.PGConnection.class).getNotifications();
            //assertTrue(flag.get());
            //assertNotNull(notifications);
            //assertEquals(1, notifications.length);
            //assertEquals("mynotification", notifications[0].getName());
            //long endMillis = System.currentTimeMillis();
            //long runtime = endMillis - startMillis;
            //assertNull("There have been notifications, although none have been expected.",notifications);
            //assertTrue("We didn't wait long enough! runtime=" + runtime, runtime > 450);

            stmt.close();
          }


Regards.

Philippe Ebersohl 



From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Wednesday, 27 February, 2019 11:53:59
Subject: Re: A method to asynchronously LISTEN ?



On Wed, 27 Feb 2019 at 05:47, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I do not think there is a need for something like conn.listenSync().
We were just intrigued about the test.

In fact the current proposition should just work fine and we would like to test it.
How could we have access to a postgresql-*.jdbc.jar that includes this feature ?

Regards,
Philippe 

I just rebased it over the current code https://github.com/pgjdbc/pgjdbc/pull/579
You should be able to build it manually using the commandline instructions to get the pull 

git checkout -b davecramer-notify master

then use maven to build it





From: "David G. Johnston" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "Philippe Ebersohl" <[hidden email]>, "List" <[hidden email]>
Sent: Tuesday, 26 February, 2019 22:17:12
Subject: Re: A method to asynchronously LISTEN ?

On Tue, Feb 26, 2019 at 12:04 PM Dave Cramer <[hidden email]> wrote:


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


You'd still want an asynchronous API for people but JavaScript introduced the "async/await" feature for a reason.  In this case making it "sync" instead of coding up wait loop seems desirable.  That said its quite possible I'm missing some existing feature as I haven't used this API at all.

David J.


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon
Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Philippe Ebersohl

Hello,
could you pleas advise what is wrong in our testing ?

We retrieved the git sources, build them.
Modified the testNotify() as shown below.
When performing  "NOTIFY mynotification"  from an SQL client, we do not see  the "Notification received" message as expected.

Thank you.

Regards,

Philippe Ebersohl 




From: "Philippe Ebersohl" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Thursday, 28 February, 2019 10:52:44
Subject: Re: A method to asynchronously LISTEN ?

Hello,
we retrieved the sources.


After starting the testNotify() below, we execute from pgadmin : notify mynotification

But the listener is not notified.

Did we miss something ?



public void testNotify() throws SQLException, InterruptedException {
            final AtomicBoolean flag = new AtomicBoolean(false);
            Statement stmt = conn.createStatement();
            ((org.postgresql.PGConnection)conn).addNotificationListener(new org.postgresql.PGNotificationListener() {
              @Override
              public void notification(org.postgresql.PGNotification notification) {
                flag.set(true);

                    System.out.println("Notification received");

              }
            });
            stmt.executeUpdate("LISTEN mynotification");
//            stmt.executeUpdate("NOTIFY mynotification");

            Thread.sleep(30000);
           
            org.postgresql.PGNotification[] notifications = conn.unwrap(org.postgresql.PGConnection.class).getNotifications();
            //assertTrue(flag.get());
            //assertNotNull(notifications);
            //assertEquals(1, notifications.length);
            //assertEquals("mynotification", notifications[0].getName());
            //long endMillis = System.currentTimeMillis();
            //long runtime = endMillis - startMillis;
            //assertNull("There have been notifications, although none have been expected.",notifications);
            //assertTrue("We didn't wait long enough! runtime=" + runtime, runtime > 450);

            stmt.close();
          }


Regards.

Philippe Ebersohl 



From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Wednesday, 27 February, 2019 11:53:59
Subject: Re: A method to asynchronously LISTEN ?



On Wed, 27 Feb 2019 at 05:47, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I do not think there is a need for something like conn.listenSync().
We were just intrigued about the test.

In fact the current proposition should just work fine and we would like to test it.
How could we have access to a postgresql-*.jdbc.jar that includes this feature ?

Regards,
Philippe 

I just rebased it over the current code https://github.com/pgjdbc/pgjdbc/pull/579
You should be able to build it manually using the commandline instructions to get the pull 

git checkout -b davecramer-notify master

then use maven to build it





From: "David G. Johnston" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "Philippe Ebersohl" <[hidden email]>, "List" <[hidden email]>
Sent: Tuesday, 26 February, 2019 22:17:12
Subject: Re: A method to asynchronously LISTEN ?

On Tue, Feb 26, 2019 at 12:04 PM Dave Cramer <[hidden email]> wrote:


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


You'd still want an asynchronous API for people but JavaScript introduced the "async/await" feature for a reason.  In this case making it "sync" instead of coding up wait loop seems desirable.  That said its quite possible I'm missing some existing feature as I haven't used this API at all.

David J.


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon
Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Dave Cramer-8


On Mon, 11 Mar 2019 at 05:41, Philippe Ebersohl <[hidden email]> wrote:

Hello,
could you pleas advise what is wrong in our testing ?

We retrieved the git sources, build them.
Modified the testNotify() as shown below.
When performing  "NOTIFY mynotification"  from an SQL client, we do not see  the "Notification received" message as expected.

Thank you.

Regards,

Philippe Ebersohl 



Hello Phillipe,

I will look at this as soon as possible. I am currently busy with other things.


Dave Cramer

[hidden email]

 



From: "Philippe Ebersohl" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Thursday, 28 February, 2019 10:52:44
Subject: Re: A method to asynchronously LISTEN ?

Hello,
we retrieved the sources.


After starting the testNotify() below, we execute from pgadmin : notify mynotification

But the listener is not notified.

Did we miss something ?



public void testNotify() throws SQLException, InterruptedException {
            final AtomicBoolean flag = new AtomicBoolean(false);
            Statement stmt = conn.createStatement();
            ((org.postgresql.PGConnection)conn).addNotificationListener(new org.postgresql.PGNotificationListener() {
              @Override
              public void notification(org.postgresql.PGNotification notification) {
                flag.set(true);

                    System.out.println("Notification received");

              }
            });
            stmt.executeUpdate("LISTEN mynotification");
//            stmt.executeUpdate("NOTIFY mynotification");

            Thread.sleep(30000);
           
            org.postgresql.PGNotification[] notifications = conn.unwrap(org.postgresql.PGConnection.class).getNotifications();
            //assertTrue(flag.get());
            //assertNotNull(notifications);
            //assertEquals(1, notifications.length);
            //assertEquals("mynotification", notifications[0].getName());
            //long endMillis = System.currentTimeMillis();
            //long runtime = endMillis - startMillis;
            //assertNull("There have been notifications, although none have been expected.",notifications);
            //assertTrue("We didn't wait long enough! runtime=" + runtime, runtime > 450);

            stmt.close();
          }


Regards.

Philippe Ebersohl 



From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Wednesday, 27 February, 2019 11:53:59
Subject: Re: A method to asynchronously LISTEN ?



On Wed, 27 Feb 2019 at 05:47, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I do not think there is a need for something like conn.listenSync().
We were just intrigued about the test.

In fact the current proposition should just work fine and we would like to test it.
How could we have access to a postgresql-*.jdbc.jar that includes this feature ?

Regards,
Philippe 

I just rebased it over the current code https://github.com/pgjdbc/pgjdbc/pull/579
You should be able to build it manually using the commandline instructions to get the pull 

git checkout -b davecramer-notify master

then use maven to build it





From: "David G. Johnston" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "Philippe Ebersohl" <[hidden email]>, "List" <[hidden email]>
Sent: Tuesday, 26 February, 2019 22:17:12
Subject: Re: A method to asynchronously LISTEN ?

On Tue, Feb 26, 2019 at 12:04 PM Dave Cramer <[hidden email]> wrote:


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


You'd still want an asynchronous API for people but JavaScript introduced the "async/await" feature for a reason.  In this case making it "sync" instead of coding up wait loop seems desirable.  That said its quite possible I'm missing some existing feature as I haven't used this API at all.

David J.


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon
Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Dave Cramer-8
Philippe,

Here's what's going on. The FE/BE protocol is somewhat synchronous and the NOTIFY is not being read until some other activity occurs on the channel.

If you modify your test to do the following it works fine.

public void testNotify() throws SQLException, InterruptedException {
AtomicBoolean flag = new AtomicBoolean(false);
Statement stmt = conn.createStatement();
((PGConnection)conn).addNotificationListener(new PGNotificationListener() {
@Override
public void notification(PGNotification notification) {
System.out.println("Notification Received");
flag.set(true);
}
});
stmt.executeUpdate("LISTEN mynotification");
for (int i=0;i<30; i++) {
stmt.execute("select 1");
Thread.sleep(1000);
}
stmt.close();


On Wed, 13 Mar 2019 at 10:37, Dave Cramer <[hidden email]> wrote:


On Mon, 11 Mar 2019 at 05:41, Philippe Ebersohl <[hidden email]> wrote:

Hello,
could you pleas advise what is wrong in our testing ?

We retrieved the git sources, build them.
Modified the testNotify() as shown below.
When performing  "NOTIFY mynotification"  from an SQL client, we do not see  the "Notification received" message as expected.

Thank you.

Regards,

Philippe Ebersohl 



Hello Phillipe,

I will look at this as soon as possible. I am currently busy with other things.


Dave Cramer

[hidden email]

 



From: "Philippe Ebersohl" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Thursday, 28 February, 2019 10:52:44
Subject: Re: A method to asynchronously LISTEN ?

Hello,
we retrieved the sources.


After starting the testNotify() below, we execute from pgadmin : notify mynotification

But the listener is not notified.

Did we miss something ?



public void testNotify() throws SQLException, InterruptedException {
            final AtomicBoolean flag = new AtomicBoolean(false);
            Statement stmt = conn.createStatement();
            ((org.postgresql.PGConnection)conn).addNotificationListener(new org.postgresql.PGNotificationListener() {
              @Override
              public void notification(org.postgresql.PGNotification notification) {
                flag.set(true);

                    System.out.println("Notification received");

              }
            });
            stmt.executeUpdate("LISTEN mynotification");
//            stmt.executeUpdate("NOTIFY mynotification");

            Thread.sleep(30000);
           
            org.postgresql.PGNotification[] notifications = conn.unwrap(org.postgresql.PGConnection.class).getNotifications();
            //assertTrue(flag.get());
            //assertNotNull(notifications);
            //assertEquals(1, notifications.length);
            //assertEquals("mynotification", notifications[0].getName());
            //long endMillis = System.currentTimeMillis();
            //long runtime = endMillis - startMillis;
            //assertNull("There have been notifications, although none have been expected.",notifications);
            //assertTrue("We didn't wait long enough! runtime=" + runtime, runtime > 450);

            stmt.close();
          }


Regards.

Philippe Ebersohl 



From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Wednesday, 27 February, 2019 11:53:59
Subject: Re: A method to asynchronously LISTEN ?



On Wed, 27 Feb 2019 at 05:47, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I do not think there is a need for something like conn.listenSync().
We were just intrigued about the test.

In fact the current proposition should just work fine and we would like to test it.
How could we have access to a postgresql-*.jdbc.jar that includes this feature ?

Regards,
Philippe 

I just rebased it over the current code https://github.com/pgjdbc/pgjdbc/pull/579
You should be able to build it manually using the commandline instructions to get the pull 

git checkout -b davecramer-notify master

then use maven to build it





From: "David G. Johnston" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "Philippe Ebersohl" <[hidden email]>, "List" <[hidden email]>
Sent: Tuesday, 26 February, 2019 22:17:12
Subject: Re: A method to asynchronously LISTEN ?

On Tue, Feb 26, 2019 at 12:04 PM Dave Cramer <[hidden email]> wrote:


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


You'd still want an asynchronous API for people but JavaScript introduced the "async/await" feature for a reason.  In this case making it "sync" instead of coding up wait loop seems desirable.  That said its quite possible I'm missing some existing feature as I haven't used this API at all.

David J.


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon
Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Philippe Ebersohl
Thanks for the update, I forward it to the devs.

Best regards,
Philippe


From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "List" <[hidden email]>
Sent: Wednesday, 10 April, 2019 16:20:39
Subject: Re: A method to asynchronously LISTEN ?

Philippe,
Here's what's going on. The FE/BE protocol is somewhat synchronous and the NOTIFY is not being read until some other activity occurs on the channel.

If you modify your test to do the following it works fine.

public void testNotify() throws SQLException, InterruptedException {
AtomicBoolean flag = new AtomicBoolean(false);
Statement stmt = conn.createStatement();
((PGConnection)conn).addNotificationListener(new PGNotificationListener() {
@Override
public void notification(PGNotification notification) {
System.out.println("Notification Received");
flag.set(true);
}
});
stmt.executeUpdate("LISTEN mynotification");
for (int i=0;i<30; i++) {
stmt.execute("select 1");
Thread.sleep(1000);
}
stmt.close();


On Wed, 13 Mar 2019 at 10:37, Dave Cramer <[hidden email]> wrote:


On Mon, 11 Mar 2019 at 05:41, Philippe Ebersohl <[hidden email]> wrote:

Hello,
could you pleas advise what is wrong in our testing ?

We retrieved the git sources, build them.
Modified the testNotify() as shown below.
When performing  "NOTIFY mynotification"  from an SQL client, we do not see  the "Notification received" message as expected.

Thank you.

Regards,

Philippe Ebersohl 



Hello Phillipe,

I will look at this as soon as possible. I am currently busy with other things.


Dave Cramer

[hidden email]

 



From: "Philippe Ebersohl" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Thursday, 28 February, 2019 10:52:44
Subject: Re: A method to asynchronously LISTEN ?

Hello,
we retrieved the sources.


After starting the testNotify() below, we execute from pgadmin : notify mynotification

But the listener is not notified.

Did we miss something ?



public void testNotify() throws SQLException, InterruptedException {
            final AtomicBoolean flag = new AtomicBoolean(false);
            Statement stmt = conn.createStatement();
            ((org.postgresql.PGConnection)conn).addNotificationListener(new org.postgresql.PGNotificationListener() {
              @Override
              public void notification(org.postgresql.PGNotification notification) {
                flag.set(true);

                    System.out.println("Notification received");

              }
            });
            stmt.executeUpdate("LISTEN mynotification");
//            stmt.executeUpdate("NOTIFY mynotification");

            Thread.sleep(30000);
           
            org.postgresql.PGNotification[] notifications = conn.unwrap(org.postgresql.PGConnection.class).getNotifications();
            //assertTrue(flag.get());
            //assertNotNull(notifications);
            //assertEquals(1, notifications.length);
            //assertEquals("mynotification", notifications[0].getName());
            //long endMillis = System.currentTimeMillis();
            //long runtime = endMillis - startMillis;
            //assertNull("There have been notifications, although none have been expected.",notifications);
            //assertTrue("We didn't wait long enough! runtime=" + runtime, runtime > 450);

            stmt.close();
          }


Regards.

Philippe Ebersohl 



From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Wednesday, 27 February, 2019 11:53:59
Subject: Re: A method to asynchronously LISTEN ?



On Wed, 27 Feb 2019 at 05:47, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I do not think there is a need for something like conn.listenSync().
We were just intrigued about the test.

In fact the current proposition should just work fine and we would like to test it.
How could we have access to a postgresql-*.jdbc.jar that includes this feature ?

Regards,
Philippe 

I just rebased it over the current code https://github.com/pgjdbc/pgjdbc/pull/579
You should be able to build it manually using the commandline instructions to get the pull 

git checkout -b davecramer-notify master

then use maven to build it





From: "David G. Johnston" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "Philippe Ebersohl" <[hidden email]>, "List" <[hidden email]>
Sent: Tuesday, 26 February, 2019 22:17:12
Subject: Re: A method to asynchronously LISTEN ?

On Tue, Feb 26, 2019 at 12:04 PM Dave Cramer <[hidden email]> wrote:


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


You'd still want an asynchronous API for people but JavaScript introduced the "async/await" feature for a reason.  In this case making it "sync" instead of coding up wait loop seems desirable.  That said its quite possible I'm missing some existing feature as I haven't used this API at all.

David J.


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon

Reply | Threaded
Open this post in threaded view
|

Re: A method to asynchronously LISTEN ?

Philippe Ebersohl
In reply to this post by Dave Cramer-8
Hello,

This is not what was expected, when using the pgjdbc-ng driver there is no need to poll.

Do you think this feature could be added to the pgsql-jdbc driver ?
If not, our devs will have to use both drivers, the pgjdbc-ng for the asynchronous notifications without polling and the pgsql-jdbc for the dbcp.
 
Best regards,

Philippe Ebersohl

I got an example, and the declaration is much alike:


public void listen() throws SQLException {

PGNotificationListener listener = new PGNotificationListener() { 

public void notification(int processId, String channelName, String payload) {

System.out.println("Received Notification: " + processId + ", " + channelName + ", " + payload); 

}

public void closed() { 

// initiate reconnection & restart listening

}

};

Statement statement = conn.createStatement();

statement.execute("LISTEN "+QNAME);

statement.close();

conn.addNotificationListener(listener);

System.out.println("Wait for events");

}


But there is no SELECT involved.
The main just does:

 postgresNG.listen();

Object lock = new Object();

synchronized (lock)

{

lock.wait();

}


And when NOTIFY is issued from pgAdmin for example, the answer is printed immediately by the java program.




From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "List" <[hidden email]>
Sent: Wednesday, 10 April, 2019 16:20:39
Subject: Re: A method to asynchronously LISTEN ?

Philippe,
Here's what's going on. The FE/BE protocol is somewhat synchronous and the NOTIFY is not being read until some other activity occurs on the channel.

If you modify your test to do the following it works fine.

public void testNotify() throws SQLException, InterruptedException {
AtomicBoolean flag = new AtomicBoolean(false);
Statement stmt = conn.createStatement();
((PGConnection)conn).addNotificationListener(new PGNotificationListener() {
@Override
public void notification(PGNotification notification) {
System.out.println("Notification Received");
flag.set(true);
}
});
stmt.executeUpdate("LISTEN mynotification");
for (int i=0;i<30; i++) {
stmt.execute("select 1");
Thread.sleep(1000);
}
stmt.close();


On Wed, 13 Mar 2019 at 10:37, Dave Cramer <[hidden email]> wrote:


On Mon, 11 Mar 2019 at 05:41, Philippe Ebersohl <[hidden email]> wrote:

Hello,
could you pleas advise what is wrong in our testing ?

We retrieved the git sources, build them.
Modified the testNotify() as shown below.
When performing  "NOTIFY mynotification"  from an SQL client, we do not see  the "Notification received" message as expected.

Thank you.

Regards,

Philippe Ebersohl 



Hello Phillipe,

I will look at this as soon as possible. I am currently busy with other things.


Dave Cramer

[hidden email]

 



From: "Philippe Ebersohl" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Thursday, 28 February, 2019 10:52:44
Subject: Re: A method to asynchronously LISTEN ?

Hello,
we retrieved the sources.


After starting the testNotify() below, we execute from pgadmin : notify mynotification

But the listener is not notified.

Did we miss something ?



public void testNotify() throws SQLException, InterruptedException {
            final AtomicBoolean flag = new AtomicBoolean(false);
            Statement stmt = conn.createStatement();
            ((org.postgresql.PGConnection)conn).addNotificationListener(new org.postgresql.PGNotificationListener() {
              @Override
              public void notification(org.postgresql.PGNotification notification) {
                flag.set(true);

                    System.out.println("Notification received");

              }
            });
            stmt.executeUpdate("LISTEN mynotification");
//            stmt.executeUpdate("NOTIFY mynotification");

            Thread.sleep(30000);
           
            org.postgresql.PGNotification[] notifications = conn.unwrap(org.postgresql.PGConnection.class).getNotifications();
            //assertTrue(flag.get());
            //assertNotNull(notifications);
            //assertEquals(1, notifications.length);
            //assertEquals("mynotification", notifications[0].getName());
            //long endMillis = System.currentTimeMillis();
            //long runtime = endMillis - startMillis;
            //assertNull("There have been notifications, although none have been expected.",notifications);
            //assertTrue("We didn't wait long enough! runtime=" + runtime, runtime > 450);

            stmt.close();
          }


Regards.

Philippe Ebersohl 



From: "Dave Cramer" <[hidden email]>
To: "Philippe Ebersohl" <[hidden email]>
Cc: "David G. Johnston" <[hidden email]>, "List" <[hidden email]>
Sent: Wednesday, 27 February, 2019 11:53:59
Subject: Re: A method to asynchronously LISTEN ?



On Wed, 27 Feb 2019 at 05:47, Philippe Ebersohl <[hidden email]> wrote:
Hello,
I do not think there is a need for something like conn.listenSync().
We were just intrigued about the test.

In fact the current proposition should just work fine and we would like to test it.
How could we have access to a postgresql-*.jdbc.jar that includes this feature ?

Regards,
Philippe 

I just rebased it over the current code https://github.com/pgjdbc/pgjdbc/pull/579
You should be able to build it manually using the commandline instructions to get the pull 

git checkout -b davecramer-notify master

then use maven to build it





From: "David G. Johnston" <[hidden email]>
To: "Dave Cramer" <[hidden email]>
Cc: "Philippe Ebersohl" <[hidden email]>, "List" <[hidden email]>
Sent: Tuesday, 26 February, 2019 22:17:12
Subject: Re: A method to asynchronously LISTEN ?

On Tue, Feb 26, 2019 at 12:04 PM Dave Cramer <[hidden email]> wrote:


On Tue, 26 Feb 2019 at 12:29, David G. Johnston <[hidden email]> wrote:
The question being asked is whether executeUpdate method performs synchronous execution of the listener function queue during its execution.

This after sending the command to the server and the server completing execution of the NOTIFY.  This assumes that the server places the notification on the channel for pick-up immediately (which will not be the case within a transaction).

While the client is, IIRC, synchronous, thus the local order of operations can be controlled, the server is asynchronous and thus this test is exposed to timing issues.  Maybe we need something like conn.listenSync() that blocks until a notification payload is received on the connection...?

kind of defeats the asynchronous aspect, no ?


You'd still want an asynchronous API for people but JavaScript introduced the "async/await" feature for a reason.  In this case making it "sync" instead of coding up wait loop seems desirable.  That said its quite possible I'm missing some existing feature as I haven't used this API at all.

David J.


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon


Visit us on EuroDUO 2019 in Lisbon