>  I think the docs for 4.1 still indicate it's set to true by default

Yes, this was wrong. I changed it right after I wrote my reply. Should 
republish soon.

Andrus


> On Oct 11, 2019, at 9:43 AM, Andrew Willerding <awillerd...@itsurcom.com> 
> wrote:
> 
> Thank you Andrus!
> 
> This has been driving me crazy.  I didn't realize this change was made.  I 
> think the docs for 4.1 still indicate it's set to true by default
> 
> https://cayenne.apache.org/docs/4.1/cayenne-guide/#appendix-a-configuration-properties
> 
> *
> 
>   |cayenne.server.contexts_sync_strategy| defines whether peer
>   ObjectContexts should receive snapshot events after commits from
>   other contexts. If true (/default/), the contexts would
>   automatically synchronize their state with peers.
> 
>     o
> 
>       Possible values: true, false
> 
>     o
> 
>       Default value: true
> 
> On 2019-10-11 7:21 a.m., Andrus Adamchik wrote:
>> Hi Andrew,
>> 
>> So I assume those two NotifyQueue are in different ObjectContexts?
>> 
>> Since 4.1 we stopped doing cross-context state synchronization by default. 
>> So when you commit in one context, the same object in other contexts does 
>> not get refreshed until e.g. you run a query. This improves both performance 
>> and consistency in a typical multi-user application. But of course each app 
>> has different requirements. So you may turn synchronization back on when 
>> bootstrapping Cayenne:
>> 
>> SererRuntime runtime = ServerRuntime
>>     .builder()
>>     ...
>>     .addModule(b -> 
>> ServerModule.contributeProperties(b).put(Constants.SERVER_CONTEXTS_SYNC_PROPERTY,
>>  "true"))
>>     .build();
>> 
>> Andrus
>> 
>> 
>>> On Oct 3, 2019, at 2:43 PM, Andrew Willerding <awillerd...@itsurcom.com> 
>>> wrote:
>>> 
>>> Hi,
>>> 
>>> I am getting some strange results in writing/reading with Threads using 
>>> Cayenne and I'm sure it's something I'm not understanding about Cayenne's 
>>> data caching.  I'm hoping to get a solution to force a direct read somehow 
>>> but so far I haven't found anything with Mr. Google.
>>> 
>>> I'm using 4.1.B2.
>>> 
>>> The issue is that I believe that I am writing a value to the database and 
>>> the database contents reflect the update but subsequent reads in other 
>>> Threads are not picking up the new value.  Here's an example in my log file 
>>> where I log the first Thread update to the object and a subsequent read 
>>> from another Thread
>>> 
>>> 2019-10-03,12:38:01:727,INFO 
>>> ,[CAsteriskAMIMgrProxyRemoteIF-Thread-1570],ClientBase,::NotifyQueue - 
>>> PostUpdate NotifyQueue=[Complete](125)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](15)Test call
>>> 2019-10-03,12:38:01:728,INFO 
>>> ,[NotifyTypeHandlerDialer-pool-449-thread-1],ClientBase,::NotifyQueue - 
>>> PostLoad NotifyQueue=[Running](125)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](15)Test call
>>> 
>>>   The first line PostUpdate shows that the NotifyQueue item (125) is 
>>> Complete and when I check the database the value is definitely showing 
>>> Complete.  However the next line from a different thread is reading the 
>>> same NotifyQueue record (125) and it's displaying Running.   I don't 
>>> understand how this is possible.  All indications show the PostUpdate is 
>>> working but PostLoad is not picking up the changed value.
>>> 
>>> Here's a second example with another pair of NotifyQueue items (127,129).  
>>> The Web page picks up the correct status values (Complete) as indicated in 
>>> the log below
>>> 
>>> 2019-10-03,13:31:07:535,INFO 
>>> ,[http-nio-8080-exec-126],ClientBase,::NotifyQueue - PostLoad 
>>> NotifyQueue=[Complete](127)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[New](17)Test call
>>> 2019-10-03,13:31:07:535,INFO 
>>> ,[http-nio-8080-exec-126],ClientBase,::NotifyQueue - PostLoad 
>>> NotifyQueue=[Complete](129)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[New](19)Test call
>>> 
>>> And the background ThreadNotifyEventsForClient again does not pickup the 
>>> updated Complete status (shows Running) more than a few seconds later (as 
>>> opposed to the microseconds in the first logging example).  When I do a 
>>> manual query on the DB, the status is definitely Complete.
>>> 
>>> 2019-10-03,13:31:32:265,INFO 
>>> ,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](17)Test
>>>  call::checkForCompletedQueueItems NotifyQueueCount=1
>>> 2019-10-03,13:31:32:265,DEBUG,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](17)Test
>>>  call::checkForCompletedQueueItems 
>>> NotifyQueueItem=NotifyQueue=[Running](127)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](17)Test call
>>> 2019-10-03,13:31:32:265,DEBUG,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](17)Test
>>>  call::checkForCompletedQueueItems 
>>> INCOMPLETE->NotifyQueue=[Running](127)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](17)Test call DEBUG 
>>> UNCOMMITTED=0
>>> 
>>> 2019-10-03,13:31:32:265,INFO 
>>> ,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](19)Test
>>>  call::checkForCompletedQueueItems NotifyQueueCount=1
>>> 2019-10-03,13:31:32:265,DEBUG,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](19)Test
>>>  call::checkForCompletedQueueItems 
>>> NotifyQueueItem=NotifyQueue=[Running](129)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](19)Test call
>>> 2019-10-03,13:31:32:265,DEBUG,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](19)Test
>>>  call::checkForCompletedQueueItems 
>>> INCOMPLETE->NotifyQueue=[Running](129)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](19)Test call DEBUG 
>>> UNCOMMITTED=0
>>> 2019-10-03,13:31:32:265,INFO 
>>> ,[ThreadNotifyEventsForClient-pool-545-thread-1],NotifyEvent,ThreadNotifyEventsForClient::Callista
>>>  Computer Telephony Inc.::checkForCompletedQueueItems Done
>>> 
>>> 
>>> I have now made a change in my code for the background 
>>> ThreadNotifyEventsForClient from
>>> 
>>> List<NotifyQueue> listQueue = notifyEvent.getListNotifyQueue();
>>> 
>>> to what should be the actual underlying transaction generated by Cayenne
>>> 
>>>             List<NotifyQueue> listQueue = 
>>> ObjectSelect.query(NotifyQueue.class)
>>>                 .where(NotifyQueue.NOTIFY_EVENT.eq(notifyEvent))
>>>                 .select(ClientBaseAdmin.getObjectContext());
>>> 
>>> Here's the extract from the map.xml file for the relationship
>>> 
>>>     <db-relationship name="listNotifyQueue" source="NotifyEvent" 
>>> target="NotifyQueue" toMany="true">
>>>         <db-attribute-pair source="id" target="notifyEventID"/>
>>> 
>>>     <obj-relationship name="listNotifyQueue" source="NotifyEvent" 
>>> target="NotifyQueue" deleteRule="Cascade" 
>>> db-relationship-path="listNotifyQueue"/>
>>> 
>>> 
>>> And guess what.  It works consistently with the explicit code change with a 
>>> difference that I now get a PostLoad event now in the 
>>> ThreadNotifyEventsForClient
>>> 
>>> 
>>> 2019-10-03,14:12:00:103,INFO 
>>> ,[CAsteriskAMIMgrProxyRemoteIF-Thread-5291],ClientBase,::NotifyQueue - 
>>> PostUpdateNotifyQueue=[Complete](133)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](23)Test call
>>> 
>>> 2019-10-03,14:12:00:107,INFO 
>>> ,[ThreadNotifyEventsForClient-pool-758-thread-1],ClientBase,::NotifyQueue - 
>>> PostLoad NotifyQueue=[Complete](133)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](23)Test call
>>> 2019-10-03,14:12:00:107,INFO 
>>> ,[ThreadNotifyEventsForClient-pool-758-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](23)Test
>>>  call::checkForCompletedQueueItems NotifyQueueCount=1
>>> 2019-10-03,14:12:00:107,DEBUG,[ThreadNotifyEventsForClient-pool-758-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](23)Test
>>>  call::checkForCompletedQueueItems 
>>> NotifyQueueItem=NotifyQueue=[Complete](133)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](23)Test call
>>> 2019-10-03,14:12:00:107,INFO 
>>> ,[ThreadNotifyEventsForClient-pool-758-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](23)Test
>>>  call::checkForCompletedQueueItems NotifyEvent has been completed
>>> 2019-10-03,14:12:00:107,DEBUG,[ThreadNotifyEventsForClient-pool-758-thread-1],NotifyEvent,ThreadNotifyEventsForClient::NotifyEvent=[Running](23)Test
>>>  call::checkForCompletedQueueItems Generating NotifyLog for 
>>> NotifyQueue->NotifyQueue=[Complete](133)Test 
>>> call->Phone=416-712-2323::NotifyEvent=[Running](23)Test call
>>> 
>>> 
>>> Can someone explain why this is the case and how I can "fix it" without the 
>>> code change.
>>> 
>>> 
>>> Thanks,
>>> 
>>> Andrew
>>> 
>>> 

Reply via email to