Solace Binding
Configuration reference for the Solace message bus binding.
Overview
The Solace binding provides native integration with Solace PubSub+ message brokers using either Solace's JCSMP (Java) API or CCSMP (C via JNI) API. The JNI binding supports zero-garbage messaging in steady state but is Linux-only, while the Java binding works on all platforms.
For conceptual information about the Solace binding, see Solace Binding.
JNI vs Java Binding Selection
Control which Solace client library is used:
usejni
-
When true, mandates JNI usage (fails if unavailable). When false, never uses JNI.
preferjni
true
When true, silently falls back to JCSMP if JNI unavailable. Ignored if usejni is set.
The JNI binding is only available on Linux platforms and provides zero-garbage messaging capabilities.
Bus Descriptor Format
Solace buses can be configured using a descriptor string or decomposed DDL format.
Descriptor String
solace://<address>:<port>&prop1=val1&propN=valNExample:
Decomposed DDL Format
As Descriptor (Substitution Support)
Solace Provider Properties
Passed Through Properties
Provider properties specified in the bus descriptor are passed through to the Solace connection with the following processing:
Properties described in
SolaceBindingPropertiesare stripped outGeneral bus properties from
MessageBusDescriptorare stripped outRationalized properties (see below) are translated based on JNI vs Java binding and passed through
If
usejni=true: Properties not starting withFLOW_orSESSION_are stripped, rest passed throughIf
usejni=false: Properties not starting withjcsmpare stripped, rest passed through
Neeve does not test properties not explicitly documented on this page or in the javadoc. End users should test any passed-through properties thoroughly.
Rationalized Pass Through Properties
These common properties are automatically translated between JCSMP (Java) and CCSMP (JNI):
vpn_name
-
jcsmp.vpn_name
SESSION_VPN_NAME
username
vpn_name
jcsmp.username
SESSION_USERNAME
password
username
jcsmp.password
SESSION_PASSWORD
publish_window_size
255
jcsmp.pub_ack_window_size
SESSION_PUB_WINDOW_SIZE
reconnect_retry_count
100
jcsmp.CLIENT_CHANNEL_PROPERTIES.ReconnectRetries
SESSION_RECONNECT_RETRIES
connect_retry_count
3
jcsmp.CLIENT_CHANNEL_PROPERTIES.ConnectRetries
SESSION_CONNECT_RETRIES
tcp_nodelay
auto-tuned
jcsmp.CLIENT_CHANNEL_PROPERTIES.tcpNoDelay
SESSION_TCP_NODELAY
reapply_subscriptions
true
jcsmp.REAPPLY_SUBSCRIPTIONS
SESSION_REAPPLY_SUBSCRIPTIONS
ignore_subscriptions_error
true
jcsmp.IGNORE_DUPLICATE_SUBSCRIPTION_ERROR
SESSION_IGNORE_DUP_SUBSCRIPTION_ERROR
(address from descriptor)
-
jcsmp.HOST
SESSION_HOST
Additional Properties
See SolaceBindingProperties javadoc for the complete list of binding-specific properties.
Auto Tuning
When not explicitly set, these properties are automatically configured based on nv.optimizefor:
Binding Property
nv.optimizefor=latency
nv.optimizefor=throughput
No Optimization
tcp_nodelay
true
false
false
detached_sends_queue_wait_strategy
Blocking
detached_dispatch_queue_wait_strategy
Blocking
Session Configuration
By default, the binding creates two separate sessions — one for consuming (suffixed with -IN) and one for producing (suffixed with -OUT) — to avoid network flow control deadlocks and improve throughput.
single_session
false
Use a single session for both publishing and consuming. Default uses separate consumer and producer sessions to avoid network flow control deadlocks. Single session uses fewer threads and resources and is suitable for unidirectional messaging.
client_name
username or queue name
Unique client name to identify the session on the appliance. Suffixed with -IN and -OUT unless single_session=true. If use_default_queue_name_as_default_client_id is set, the default queue name is used instead.
session_open_retry_count
5
Number of retry attempts to establish a session after transient errors. Permanent errors (e.g., invalid client name, dynamic clients not allowed, endpoint property mismatch) are not retried.
session_open_retry_interval
1
Interval in seconds between session open retry attempts.
consumer_cpu_affinity_mask
0
CPU affinity mask for the Solace consumer session's Context receiver thread. Not to be confused with the detached dispatcher thread.
producer_cpu_affinity_mask
0
CPU affinity mask for the Solace producer session's Context receiver thread. Not to be confused with the detached sender thread.
Queue Configuration
A Solace queue must be provisioned for the binding to support guaranteed messaging. The queue holds messages for the application while it is disconnected.
queue_name
X-SMA-{name}-{userName}
Solace queue name for guaranteed messaging. When not specified, a default name is generated from the bus name and user name. When set to blank (empty string), no queue is used.
use_default_queue_name
true
Whether to use the auto-generated default queue name when queue_name is not specified. Disabling this without setting queue_name means no queue is used, compromising guaranteed messaging QoS.
use_default_queue_name_as_default_client_id
false
Use the default queue name as the client name when client_name is not explicitly set.
provision_queue
true
Attempt to provision the queue on a best-effort basis. Requires endpoint management to be enabled on the appliance. If the queue cannot be provisioned, a warning is logged.
queue_quota
2048
Queue quota in MB when provisioning a queue (default 2 GB).
Detached Sends
The binding can create a detached sender thread to offload message marshalling and Solace API send calls from the application thread, improving throughput.
Talon AepEngine users should note that this is separate from the detached send specified for the AEP bus. Enabling this property in conjunction with detached send in AEP results in two detached send threads.
detached_sends
false
Create a detached sender thread for published messages. Offloads message marshalling and Solace API calls to improve throughput.
detached_sends_queue_depth
1024
Disruptor ring buffer queue depth for the detached sender.
detached_sends_queue_wait_strategy
auto-tuned
Wait strategy for the detached sends disruptor queue (e.g., BusySpinWaitStrategy, YieldingWaitStrategy, BlockingWaitStrategy). See Auto Tuning.
detached_sends_cpu_affinity_mask
0
CPU affinity mask for the detached sender thread.
Detached Dispatch
The binding can create a detached dispatch thread for message deserialization and dispatch, allowing the Solace receiver thread to exclusively handle I/O work.
detached_dispatch
false
Create a detached dispatch thread for received messages. Offloads deserialization and dispatch from the Solace receiver thread to improve throughput.
detached_dispatch_queue_depth
128
Disruptor ring buffer queue depth for the detached dispatcher.
detached_dispatch_queue_wait_strategy
auto-tuned
Wait strategy for the detached dispatch disruptor queue (e.g., BusySpinWaitStrategy, YieldingWaitStrategy, BlockingWaitStrategy). See Auto Tuning.
dispatcher_cpu_affinity_mask
0
CPU affinity mask for the detached dispatcher thread.
Message Handling
set_key_on_receipt
false
Sets the topic on a per-message basis. Accessible via message.getMessageKeyAsRaw().
fail_on_inbound_message_handling_fault
false
Fail the binding unconditionally when an inbound message handling fault occurs. When false, an UnhandledMessageEvent is dispatched, leaving the application to decide.
treat_non_x_inbound_as_fault
true
Treat receipt of non-X (non-SMA) messages as a fault. When false, non-X messages are handled gracefully.
Orphan Subscription Checks
When a Solace bus binding has a queue name specified, it can detect "orphan" subscriptions - subscriptions on the queue that don't match those issued by the application (presumably left over from an earlier session).
Policies
None
Appliance is not queried for subscriptions (default).
Ignore
Query appliance and trace orphan subscriptions at info level. Report to subscription validator if registered.
LogExceptionAndContinue
Query appliance and log exception if orphans found.
NoOrphan
Query appliance and throw exception from binding start method if orphans found.
Unsubscribe
Query appliance and automatically unsubscribe orphan subscriptions from the queue.
Configuration
To perform subscription checks, SEMP must be enabled:
enable_semp
optional
false
Enable Solace SEMP over messaging requests. Required for subscription checks. Requires appliance has SEMP over messaging enabled and user is authorized. NOTE: SEMP operations are experimental and not recommended for production without rigorous testing.
orphan_subscription_check
optional
None
Orphan subscription check policy. Performed after subscriptions created but before messaging started. Requires enable_semp=true for policies other than None.
orphan_subscription_check_batch_size
optional
200
Batch size for sequenced fetch of subscriptions during orphan subscription check. Used when the subscription count exceeds what can be returned in a single response.
discard_semp_prestart_messages
optional
true
Discard BestEffort messages received before SEMP checks complete during binding startup. Prevents the dispatch thread from blocking on SEMP requests. Only disable if the bus's event handler will not block on messages received before start() returns.
semp_version
recommended
soltr/7_1_1
SEMP version. Must match messaging appliance version. If not set, version auto-detected on first request.
semp_request_timeout
recommended
10000
Timeout for SEMP requests in milliseconds. Test under load to ensure sufficient.
subscription_validator
unsupported
-
Legacy property for custom subscription validation. Use only with Neeve support guidance.
SEMP Operations Warning: SEMP operations are experimental. Not recommended for production without rigorous end-user testing. Solace may drop SEMP over messaging support in future versions. Reliance on SEMP may limit ability to connect to appliances with incompatible SEMP models.
Enforcing Max Queue Bind Count
When using Guaranteed messaging, queues can be provisioned with max bind count of 1 to ensure only one application instance can bind. The binding can enforce this via SEMP:
enable_semp
optional
false
Must be enabled (see above).
enforce_max_bind_count
optional
0
Set to positive value to enforce match against provisioned queue's max bind count. When set, binding issues SEMP request at start to verify queue's max bind count matches this value. Ensures exclusive connectivity with enforce_max_bind_count=1. Ignored if no queue configured or value ≤ 0. Requires SEMP enabled.
Since 3.8: enforce_max_bind_count provides protection against network partitioning by ensuring two instances cannot both consume messages.
Trace Logging
The Solace binding logs trace messages using two loggers:
The nv.sma Logger
nv.sma LoggerControls trace level and messages emitted by the binding code itself (not the Solace client library).
The nv.sol Logger
nv.sol LoggerControls trace level and messages emitted by the Solace client runtime.
JNI Enabled (CCSMP)
When using JNI, the binding:
Maps
nv.sollogger level to CCSMP trace level (see table below)Registers callback with CCSMP to intercept trace messages
Logs CCSMP messages via
nv.sollogger
nv.sol to CCSMP Mapping:
SEVERE
ERROR
WARNING
WARNING
INFO, CONFIG
NOTICE
FINE, FINER, DIAGNOSE, VERBOSE
INFO
FINEST, DEBUG, ALL
DEBUG
CCSMP to nv.sol Mapping (for logged messages):
CRITICAL, ERROR
SEVERE
WARNING
WARNING
NOTICE
INFO
INFO
FINE
DEBUG
FINEST
JNI Disabled (JCSMP)
When using JCSMP, the binding:
Maps
nv.sollogger level to setcom.solacesystems.jcsmplogger levelAssumes all JCSMP logging uses the
com.solacesystems.jcsmplogger
nv.sol to com.solacesystems.jcsmp Mapping:
SEVERE
SEVERE
WARNING
WARNING
INFO
INFO
CONFIG
CONFIG
FINE
FINE
FINER
FINER
DIAGNOSE, VERBOSE, FINEST
FINEST
DEBUG, ALL
ALL
See Trace Logging for information on configuring loggers.
See Also
Solace Binding - Conceptual overview
Configuring Bus Connections - General bus configuration
Solace Documentation - Solace PubSub+ information
Last updated