@@ -122,6 +122,8 @@ private static UInteger nextSubscriptionId() {
122122 private final Map <UInteger , Subscription > subscriptions = Maps .newConcurrentMap ();
123123 private final List <Subscription > transferred = Lists .newCopyOnWriteArrayList ();
124124
125+ private final AtomicLong monitoredItemCount = new AtomicLong (0L );
126+
125127 private final Session session ;
126128 private final OpcUaServer server ;
127129
@@ -190,6 +192,7 @@ public void createSubscription(ServiceRequest service) {
190192 eventItems -> server .getAddressSpaceManager ().onEventItemsDeleted (eventItems )
191193 );
192194
195+ monitoredItemCount .getAndUpdate (count -> count - monitoredItems .size ());
193196 server .getMonitoredItemCount ().getAndUpdate (count -> count - monitoredItems .size ());
194197
195198 monitoredItems .clear ();
@@ -267,6 +270,7 @@ public void deleteSubscription(ServiceRequest service) throws UaException {
267270
268271 results [i ] = StatusCode .GOOD ;
269272
273+ monitoredItemCount .getAndUpdate (count -> count - deletedItems .size ());
270274 server .getMonitoredItemCount ().getAndUpdate (count -> count - deletedItems .size ());
271275 } else {
272276 results [i ] = new StatusCode (StatusCodes .Bad_SubscriptionIdInvalid );
@@ -348,13 +352,20 @@ public void createMonitoredItems(ServiceRequest service) throws UaException {
348352
349353 List <BaseMonitoredItem <?>> monitoredItems = new ArrayList <>();
350354
355+ long globalMax = server .getConfig ()
356+ .getLimits ().getMaxMonitoredItems ().longValue ();
357+
358+ long sessionMax = server .getConfig ()
359+ .getLimits ().getMaxMonitoredItemsPerSession ().longValue ();
360+
351361 for (int i = 0 ; i < itemsToCreate .size (); i ++) {
352362 MonitoredItemCreateRequest createRequest = itemsToCreate .get (i );
353363
354364 try {
355- long maxMonitoredItems = server .getConfig ().getLimits ().getMaxMonitoredItems ().longValue ();
365+ long globalCount = server .getMonitoredItemCount ().incrementAndGet ();
366+ long sessionCount = monitoredItemCount .incrementAndGet ();
356367
357- if (server . getMonitoredItemCount (). incrementAndGet () <= maxMonitoredItems ) {
368+ if (globalCount <= globalMax && sessionCount <= sessionMax ) {
358369 BaseMonitoredItem <?> monitoredItem = createMonitoredItem (
359370 createRequest ,
360371 subscription ,
@@ -375,6 +386,7 @@ public void createMonitoredItems(ServiceRequest service) throws UaException {
375386 throw new UaException (StatusCodes .Bad_TooManyMonitoredItems );
376387 }
377388 } catch (UaException e ) {
389+ monitoredItemCount .decrementAndGet ();
378390 server .getMonitoredItemCount ().decrementAndGet ();
379391
380392 createResults [i ] = new MonitoredItemCreateResult (
@@ -979,6 +991,7 @@ public void deleteMonitoredItems(ServiceRequest service) throws UaException {
979991
980992 deleteResults [i ] = StatusCode .GOOD ;
981993
994+ monitoredItemCount .decrementAndGet ();
982995 server .getMonitoredItemCount ().decrementAndGet ();
983996 }
984997 }
@@ -1250,6 +1263,7 @@ public void sessionClosed(boolean deleteSubscriptions) {
12501263 eventItems -> server .getAddressSpaceManager ().onEventItemsDeleted (eventItems )
12511264 );
12521265
1266+ monitoredItemCount .getAndUpdate (count -> count - deletedItems .size ());
12531267 server .getMonitoredItemCount ().getAndUpdate (count -> count - deletedItems .size ());
12541268 }
12551269
@@ -1293,6 +1307,7 @@ public void addSubscription(Subscription subscription) {
12931307 eventItems -> server .getAddressSpaceManager ().onEventItemsDeleted (eventItems )
12941308 );
12951309
1310+ monitoredItemCount .getAndUpdate (count -> count - monitoredItems .size ());
12961311 server .getMonitoredItemCount ().getAndUpdate (count -> count - monitoredItems .size ());
12971312
12981313 monitoredItems .clear ();
@@ -1312,6 +1327,8 @@ public Subscription removeSubscription(UInteger subscriptionId) {
13121327
13131328 if (subscription != null ) {
13141329 subscription .setStateListener (null );
1330+
1331+ monitoredItemCount .getAndUpdate (count -> count - subscription .getMonitoredItems ().size ());
13151332 }
13161333
13171334 return subscription ;
0 commit comments