> 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 >>> >>>