Re: A method to asynchronously LISTEN ?

From: Dave Cramer <pg(at)fastcrypt(dot)com>
To: Philippe Ebersohl <philippe(dot)ebersohl(at)dalim(dot)com>
Cc: List <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: A method to asynchronously LISTEN ?
Date: 2019-04-10 14:20:39
Message-ID: CADK3HHLQUFeWt0jW+S8EEFK9wfcvPOvrJJvQWesxyGvstJGRcA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

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

Dave Cramer

davec(at)postgresintl(dot)com
www.postgresintl.com

On Wed, 13 Mar 2019 at 10:37, Dave Cramer <pg(at)fastcrypt(dot)com> wrote:

>
>
> On Mon, 11 Mar 2019 at 05:41, Philippe Ebersohl <
> philippe(dot)ebersohl(at)dalim(dot)com> 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
>
> davec(at)postgresintl(dot)com
> www.postgresintl.com
>
>
>
>>
>>
>> ------------------------------
>> *From: *"Philippe Ebersohl" <philippe(dot)ebersohl(at)dalim(dot)com>
>> *To: *"Dave Cramer" <pg(at)fastcrypt(dot)com>
>> *Cc: *"David G. Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, "List" <
>> pgsql-jdbc(at)postgresql(dot)org>
>> *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" <pg(at)fastcrypt(dot)com>
>> *To: *"Philippe Ebersohl" <philippe(dot)ebersohl(at)dalim(dot)com>
>> *Cc: *"David G. Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, "List" <
>> pgsql-jdbc(at)postgresql(dot)org>
>> *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 <
>> philippe(dot)ebersohl(at)dalim(dot)com> 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
>> git pull https://github.com/davecramer/pgjdbc.git notify
>>
>> then use maven to build it
>>
>>
>> Dave Cramer
>>
>> davec(at)postgresintl(dot)com
>> www.postgresintl.com
>>
>>
>>
>>>
>>> ------------------------------
>>> *From: *"David G. Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>
>>> *To: *"Dave Cramer" <pg(at)fastcrypt(dot)com>
>>> *Cc: *"Philippe Ebersohl" <philippe(dot)ebersohl(at)dalim(dot)com>, "List" <
>>> pgsql-jdbc(at)postgresql(dot)org>
>>> *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 <pg(at)fastcrypt(dot)com> wrote:
>>>
>>>>
>>>>
>>>> On Tue, 26 Feb 2019 at 12:29, David G. Johnston <
>>>> david(dot)g(dot)johnston(at)gmail(dot)com> 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.
>>>
>>>
>>> [image: Visit us on EuroDUO 2019 in Lisbon] <https://euroduo.dalim.com/>
>>>
>>
>>
>> [image: Visit us on EuroDUO 2019 in Lisbon] <https://euroduo.dalim.com/>
>>
>>
>> [image: Visit us on EuroDUO 2019 in Lisbon] <https://euroduo.dalim.com/>
>>
>

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Philippe Ebersohl 2019-04-12 20:03:21 Re: A method to asynchronously LISTEN ?
Previous Message Mark Rotteveel 2019-04-10 12:43:32 Re: ResultSet.getObject(..., LocalTime.class) not working with Postgres timetz type