This is an automated email from the ASF dual-hosted git repository.
jbertram pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/main by this push:
new 99b9d87 ARTEMIS-2934 Add option to suppress SESSION notifications
new fb0e4a5 This closes #3947
99b9d87 is described below
commit 99b9d87bfde31dc30c8f3715974ea3a2a5b0ab1e
Author: AntonRoskvist <[email protected]>
AuthorDate: Wed Feb 9 11:22:51 2022 +0100
ARTEMIS-2934 Add option to suppress SESSION notifications
---
.../api/config/ActiveMQDefaultConfiguration.java | 8 +++++++
.../artemis/core/config/Configuration.java | 8 +++++++
.../core/config/impl/ConfigurationImpl.java | 12 ++++++++++
.../deployers/impl/FileConfigurationParser.java | 3 +++
.../core/server/impl/ServerSessionImpl.java | 3 +++
.../resources/schema/artemis-configuration.xsd | 10 +++++++++
.../core/config/impl/FileConfigurationTest.java | 1 +
.../resources/ConfigurationTest-full-config.xml | 1 +
docs/user-manual/en/management.md | 15 +++++++++++++
.../integration/management/NotificationTest.java | 26 ++++++++++++++++++++++
10 files changed, 87 insertions(+)
diff --git
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
index b9b9928..cbaa235 100644
---
a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
+++
b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
@@ -647,6 +647,9 @@ public final class ActiveMQDefaultConfiguration {
// How often (in ms) to scan for expired MQTT sessions
private static long DEFAULT_MQTT_SESSION_SCAN_INTERVAL = 500;
+ // If SESSION-notifications should be suppressed or not
+ public static boolean DEFAULT_SUPPRESS_SESSION_NOTIFICATIONS = false;
+
/**
* If true then the ActiveMQ Artemis Server will make use of any Protocol
Managers that are in available on the classpath. If false then only the core
protocol will be available, unless in Embedded mode where users can inject
their own Protocol Managers.
*/
@@ -1772,4 +1775,9 @@ public final class ActiveMQDefaultConfiguration {
public static long getMqttSessionScanInterval() {
return DEFAULT_MQTT_SESSION_SCAN_INTERVAL;
}
+
+ public static boolean getDefaultSuppressSessionNotifications() {
+ return DEFAULT_SUPPRESS_SESSION_NOTIFICATIONS;
+ }
+
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
index 20fcbfd..69d0bda 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
@@ -1393,4 +1393,12 @@ public interface Configuration {
*/
long getMqttSessionScanInterval();
+ /**
+ * Returns whether suppression of session-notifications is enabled for this
server. <br>
+ * Default value is {@link
org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration#DEFAULT_SUPPRESS_SESSION_NOTIFICATIONS}.
+ */
+ boolean isSuppressSessionNotifications();
+
+ Configuration setSuppressSessionNotifications(boolean
suppressSessionNotifications);
+
}
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
index 68d1a1d..ff7d511 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
@@ -387,6 +387,7 @@ public class ConfigurationImpl implements Configuration,
Serializable {
private long mqttSessionScanInterval =
ActiveMQDefaultConfiguration.getMqttSessionScanInterval();
+ private boolean suppressSessionNotifications =
ActiveMQDefaultConfiguration.getDefaultSuppressSessionNotifications();
/**
* Parent folder for all data folders.
@@ -2690,6 +2691,17 @@ public class ConfigurationImpl implements Configuration,
Serializable {
return this;
}
+ @Override
+ public boolean isSuppressSessionNotifications() {
+ return suppressSessionNotifications;
+ }
+
+ @Override
+ public Configuration setSuppressSessionNotifications(boolean
suppressSessionNotifications) {
+ this.suppressSessionNotifications = suppressSessionNotifications;
+ return this;
+ }
+
// extend property utils with ability to auto-fill and locate from
collections
// collection entries are identified by the name() property
private static class CollectionAutoFillPropertiesUtil extends
PropertyUtilsBean {
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index 907b170..9fb7689 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -323,6 +323,7 @@ public final class FileConfigurationParser extends
XMLConfigurationUtil {
private static final String ENABLE_INGRESS_TIMESTAMP =
"enable-ingress-timestamp";
+ private static final String SUPPRESS_SESSION_NOTIFICATIONS =
"suppress-session-notifications";
private boolean validateAIO = false;
@@ -769,6 +770,8 @@ public final class FileConfigurationParser extends
XMLConfigurationUtil {
config.setPageSyncTimeout(getInteger(e, "page-sync-timeout",
config.getJournalBufferTimeout_NIO(), Validators.GE_ZERO));
+ config.setSuppressSessionNotifications(getBoolean(e,
"suppress-session-notifications", config.isSuppressSessionNotifications()));
+
parseAddressSettings(e, config);
parseResourceLimits(e, config);
diff --git
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
index 97c712d..8a9d7c3 100644
---
a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
+++
b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
@@ -474,6 +474,9 @@ public class ServerSessionImpl implements ServerSession,
FailureListener {
}
private void sendSessionNotification(final CoreNotificationType type)
throws Exception {
+ if (server.getConfiguration().isSuppressSessionNotifications()) {
+ return;
+ }
final TypedProperties props = new TypedProperties();
if (this.getConnectionID() != null) {
props.putSimpleStringProperty(ManagementHelper.HDR_CONNECTION_NAME,
SimpleString.toSimpleString(this.getConnectionID().toString()));
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index 8f8a60f..e418d86 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -1000,6 +1000,16 @@
</xsd:annotation>
</xsd:element>
+ <xsd:element name="suppress-session-notifications" type="xsd:boolean"
default="false" maxOccurs="1" minOccurs="0">
+ <xsd:annotation>
+ <xsd:documentation>
+ Whether or not to suppress SESSION_CREATED and
SESSION_CLOSED notifications.
+ Set to true to reduce notification overhead. However, these
are required to
+ enforce unique client ID utilization in a cluster for MQTT
clients.
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:element>
+
<xsd:element name="security-settings" maxOccurs="1" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
diff --git
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
index 7a21cfe..8834c17 100644
---
a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
+++
b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/FileConfigurationTest.java
@@ -136,6 +136,7 @@ public class FileConfigurationTest extends
ConfigurationImplTest {
Assert.assertEquals("somedir", conf.getBindingsDirectory());
Assert.assertEquals(false, conf.isCreateBindingsDir());
Assert.assertEquals(true, conf.isAmqpUseCoreSubscriptionNaming());
+ Assert.assertEquals(false, conf.isSuppressSessionNotifications());
Assert.assertEquals("max concurrent io", 17,
conf.getPageMaxConcurrentIO());
Assert.assertEquals(true, conf.isReadWholePage());
diff --git
a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
index c331dfa..c2abdc8 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
@@ -67,6 +67,7 @@
<critical-analyzer-check-period>333</critical-analyzer-check-period>
<critical-analyzer-timeout>777</critical-analyzer-timeout>
<critical-analyzer>false</critical-analyzer>
+ <suppress-session-notifications>false</suppress-session-notifications>
<remoting-incoming-interceptors>
<class-name>org.apache.activemq.artemis.tests.unit.core.config.impl.TestInterceptor1</class-name>
<class-name>org.apache.activemq.artemis.tests.unit.core.config.impl.TestInterceptor2</class-name>
diff --git a/docs/user-manual/en/management.md
b/docs/user-manual/en/management.md
index f725e03..e6f61c4 100644
--- a/docs/user-manual/en/management.md
+++ b/docs/user-manual/en/management.md
@@ -723,6 +723,21 @@ configured in `broker.xml`:
By default, the address is `activemq.notifications`.
+#### Suppressing Session Notifications
+
+Some messaging patterns can generate a lot of `SESSION_CREATED` and
+`SESSION_CLOSED` notifications. In a clustered environment this will come with
+some computational overhead. If these notifications are not otherwise used they
+can be disabled through:
+
+```xml
+<suppress-session-notifications>true</suppress-session-notifications>
+```
+
+The only time these notifications are *required* is in a cluster with MQTT
+clients where unique client ID utilization needs to be enforced. Default value
+is `false`
+
#### Receiving Notification Messages
Apache ActiveMQ Artemis's Core JMS Client can be used to receive notifications:
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/NotificationTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/NotificationTest.java
index e6e66cd..04be9b2 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/NotificationTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/NotificationTest.java
@@ -194,6 +194,32 @@ public class NotificationTest extends ActiveMQTestBase {
}
@Test
+ public void testSuppressSessionNotifications() throws Exception {
+ server.getConfiguration().setSuppressSessionNotifications(false);
+ ClientSessionFactory sf = createSessionFactory(locator);
+
+ NotificationTest.flush(notifConsumer);
+ ClientSession mySession = sf.createSession("myUser", "myPassword",
false, true, true, locator.isPreAcknowledge(), locator.getAckBatchSize());
+
+ mySession.start();
+ ClientMessage[] notifications = NotificationTest.consumeMessages(1,
notifConsumer);
+ Assert.assertEquals(SESSION_CREATED.toString(),
notifications[0].getObjectProperty(ManagementHelper.HDR_NOTIFICATION_TYPE).toString());
+ mySession.close();
+ notifications = NotificationTest.consumeMessages(1, notifConsumer);
+ Assert.assertEquals(SESSION_CLOSED.toString(),
notifications[0].getObjectProperty(ManagementHelper.HDR_NOTIFICATION_TYPE).toString());
+
+ NotificationTest.flush(notifConsumer);
+ server.getConfiguration().setSuppressSessionNotifications(true);
+ mySession = sf.createSession("myUser", "myPassword", false, true, true,
locator.isPreAcknowledge(), locator.getAckBatchSize());
+
+ mySession.start();
+ NotificationTest.consumeMessages(0, notifConsumer);
+ mySession.close();
+ NotificationTest.consumeMessages(0, notifConsumer);
+
+ }
+
+ @Test
public void testCONSUMER_CLOSED() throws Exception {
ClientSessionFactory sf = createSessionFactory(locator);
ClientSession mySession = sf.createSession("myUser", "myPassword",
false, true, true, locator.isPreAcknowledge(), locator.getAckBatchSize());