22// Licensed under the MIT License.
33package com .azure .spring .cloud .appconfiguration .config .implementation ;
44
5+ import static com .azure .spring .cloud .appconfiguration .config .implementation .AppConfigurationConstants .PUSH_REFRESH ;
56import java .time .Duration ;
67import java .time .Instant ;
78import java .util .List ;
89import java .util .Map .Entry ;
910
1011import org .slf4j .Logger ;
1112import org .slf4j .LoggerFactory ;
13+ import org .springframework .util .StringUtils ;
1214
1315import com .azure .core .exception .HttpResponseException ;
16+ import com .azure .core .util .Context ;
1417import com .azure .data .appconfiguration .models .ConfigurationSetting ;
1518import com .azure .spring .cloud .appconfiguration .config .implementation .autofailover .ReplicaLookUp ;
1619import com .azure .spring .cloud .appconfiguration .config .implementation .feature .FeatureFlagState ;
1720import com .azure .spring .cloud .appconfiguration .config .implementation .feature .FeatureFlags ;
1821import com .azure .spring .cloud .appconfiguration .config .implementation .properties .AppConfigurationStoreMonitoring ;
22+ import com .azure .spring .cloud .appconfiguration .config .implementation .properties .AppConfigurationStoreMonitoring .PushNotification ;
1923import com .azure .spring .cloud .appconfiguration .config .implementation .properties .FeatureFlagStore ;
2024
2125public class AppConfigurationRefreshUtil {
@@ -50,14 +54,22 @@ RefreshEventData refreshStoresCheck(AppConfigurationReplicaClientFactory clientF
5054 clientFactory .setCurrentConfigStoreClient (originEndpoint , originEndpoint );
5155
5256 AppConfigurationStoreMonitoring monitor = connection .getMonitoring ();
57+
58+ boolean pushRefresh = false ;
59+ PushNotification notification = monitor .getPushNotification ();
60+ if ((notification .getPrimaryToken () != null && StringUtils .hasText (notification .getPrimaryToken ().getName ()))
61+ || (notification .getSecondaryToken () != null && StringUtils .hasText (notification .getPrimaryToken ().getName ()))) {
62+ pushRefresh = true ;
63+ }
64+ Context context = new Context ("refresh" , true ).addData (PUSH_REFRESH , pushRefresh );
5365
5466 List <AppConfigurationReplicaClient > clients = clientFactory .getAvailableClients (originEndpoint );
5567
5668 if (monitor .isEnabled () && StateHolder .getLoadState (originEndpoint )) {
5769 for (AppConfigurationReplicaClient client : clients ) {
5870 try {
5971 refreshWithTime (client , StateHolder .getState (originEndpoint ), monitor .getRefreshInterval (),
60- eventData , replicaLookUp );
72+ eventData , replicaLookUp , context );
6173 if (eventData .getDoRefresh ()) {
6274 clientFactory .setCurrentConfigStoreClient (originEndpoint , client .getEndpoint ());
6375 return eventData ;
@@ -81,7 +93,7 @@ RefreshEventData refreshStoresCheck(AppConfigurationReplicaClientFactory clientF
8193 for (AppConfigurationReplicaClient client : clients ) {
8294 try {
8395 refreshWithTimeFeatureFlags (client , StateHolder .getStateFeatureFlag (originEndpoint ),
84- monitor .getFeatureFlagRefreshInterval (), eventData , replicaLookUp );
96+ monitor .getFeatureFlagRefreshInterval (), eventData , replicaLookUp , context );
8597 if (eventData .getDoRefresh ()) {
8698 clientFactory .setCurrentConfigStoreClient (originEndpoint , client .getEndpoint ());
8799 return eventData ;
@@ -115,10 +127,10 @@ RefreshEventData refreshStoresCheck(AppConfigurationReplicaClientFactory clientF
115127 * @param originEndpoint config store origin endpoint
116128 * @return A refresh should be triggered.
117129 */
118- static boolean refreshStoreCheck (AppConfigurationReplicaClient client , String originEndpoint ) {
130+ static boolean refreshStoreCheck (AppConfigurationReplicaClient client , String originEndpoint , Context context ) {
119131 RefreshEventData eventData = new RefreshEventData ();
120132 if (StateHolder .getLoadState (originEndpoint )) {
121- refreshWithoutTime (client , StateHolder .getState (originEndpoint ).getWatchKeys (), eventData );
133+ refreshWithoutTime (client , StateHolder .getState (originEndpoint ).getWatchKeys (), eventData , context );
122134 }
123135 return eventData .getDoRefresh ();
124136 }
@@ -131,12 +143,12 @@ static boolean refreshStoreCheck(AppConfigurationReplicaClient client, String or
131143 * @return true if a refresh should be triggered.
132144 */
133145 static boolean refreshStoreFeatureFlagCheck (Boolean featureStoreEnabled ,
134- AppConfigurationReplicaClient client ) {
146+ AppConfigurationReplicaClient client , Context context ) {
135147 RefreshEventData eventData = new RefreshEventData ();
136148 String endpoint = client .getEndpoint ();
137149
138150 if (featureStoreEnabled && StateHolder .getStateFeatureFlag (endpoint ) != null ) {
139- refreshWithoutTimeFeatureFlags (client , StateHolder .getStateFeatureFlag (endpoint ), eventData );
151+ refreshWithoutTimeFeatureFlags (client , StateHolder .getStateFeatureFlag (endpoint ), eventData , context );
140152 } else {
141153 LOGGER .debug ("Skipping feature flag refresh check for " + endpoint );
142154 }
@@ -151,10 +163,10 @@ static boolean refreshStoreFeatureFlagCheck(Boolean featureStoreEnabled,
151163 * @param eventData Info for this refresh event.
152164 */
153165 private static void refreshWithTime (AppConfigurationReplicaClient client , State state , Duration refreshInterval ,
154- RefreshEventData eventData , ReplicaLookUp replicaLookUp ) throws AppConfigurationStatusException {
166+ RefreshEventData eventData , ReplicaLookUp replicaLookUp , Context context ) throws AppConfigurationStatusException {
155167 if (Instant .now ().isAfter (state .getNextRefreshCheck ())) {
156168 replicaLookUp .updateAutoFailoverEndpoints ();
157- refreshWithoutTime (client , state .getWatchKeys (), eventData );
169+ refreshWithoutTime (client , state .getWatchKeys (), eventData , context );
158170
159171 StateHolder .getCurrentState ().updateStateRefresh (state , refreshInterval );
160172 }
@@ -168,9 +180,9 @@ private static void refreshWithTime(AppConfigurationReplicaClient client, State
168180 * @param eventData Refresh event info
169181 */
170182 private static void refreshWithoutTime (AppConfigurationReplicaClient client , List <ConfigurationSetting > watchKeys ,
171- RefreshEventData eventData ) throws AppConfigurationStatusException {
183+ RefreshEventData eventData , Context context ) throws AppConfigurationStatusException {
172184 for (ConfigurationSetting watchKey : watchKeys ) {
173- ConfigurationSetting watchedKey = client .getWatchKey (watchKey .getKey (), watchKey .getLabel (), true );
185+ ConfigurationSetting watchedKey = client .getWatchKey (watchKey .getKey (), watchKey .getLabel (), context );
174186
175187 // If there is no result, etag will be considered empty.
176188 // A refresh will trigger once the selector returns a value.
@@ -184,14 +196,14 @@ private static void refreshWithoutTime(AppConfigurationReplicaClient client, Lis
184196 }
185197
186198 private static void refreshWithTimeFeatureFlags (AppConfigurationReplicaClient client , FeatureFlagState state ,
187- Duration refreshInterval , RefreshEventData eventData , ReplicaLookUp replicaLookUp )
199+ Duration refreshInterval , RefreshEventData eventData , ReplicaLookUp replicaLookUp , Context context )
188200 throws AppConfigurationStatusException {
189201 Instant date = Instant .now ();
190202 if (date .isAfter (state .getNextRefreshCheck ())) {
191203 replicaLookUp .updateAutoFailoverEndpoints ();
192204
193205 for (FeatureFlags featureFlags : state .getWatchKeys ()) {
194- if (client .checkWatchKeys (featureFlags .getSettingSelector (), true )) {
206+ if (client .checkWatchKeys (featureFlags .getSettingSelector (), context )) {
195207 String eventDataInfo = ".appconfig.featureflag/*" ;
196208
197209 // Only one refresh Event needs to be call to update all of the
@@ -209,10 +221,10 @@ private static void refreshWithTimeFeatureFlags(AppConfigurationReplicaClient cl
209221 }
210222
211223 private static void refreshWithoutTimeFeatureFlags (AppConfigurationReplicaClient client , FeatureFlagState watchKeys ,
212- RefreshEventData eventData ) throws AppConfigurationStatusException {
224+ RefreshEventData eventData , Context context ) throws AppConfigurationStatusException {
213225
214226 for (FeatureFlags featureFlags : watchKeys .getWatchKeys ()) {
215- if (client .checkWatchKeys (featureFlags .getSettingSelector (), true )) {
227+ if (client .checkWatchKeys (featureFlags .getSettingSelector (), context )) {
216228 String eventDataInfo = ".appconfig.featureflag/*" ;
217229
218230 // Only one refresh Event needs to be call to update all of the
0 commit comments