This article contains some more generalised, submitted OpenSplice questions that may prove useful to others.
See the OpenSplice documentation for more information.
Does OpenSplice support real-time variants of the Java virtual machine?
-
OpenSplice has a C implementation and provides a runtime shared-library for applications.
-
For Java applications we use JNI to provide access to this shared-library from a Java context.
-
The overall approach is to keep the JNI interface as thin as possible.
-
Minimal overhead by Java (JNI) API – These are direct JNI-calls to the (C) shared OpenSplice library that performs all the actions.
-
No JAVA object-creation QoS control, the latency-budget allows for just-in-time bulk-transfer.
-
High efficiency. The Transport-priority allows the application to identify the urgency of the data transfer.
-
Minimised impact of low-priority traffic. The partition selection allows for efficient information-partitioning and multicast-mapping.
-
Minimal overhead by Java (JNI) API Support for Object preallocation by the application.
-
Minimal object-creation by OpenSplice using OMG-DDS waitsets; Java-thread blocks at C-level (like a unix select).Full application control on priority using OMG-DDS listeners; Automatic JVM-attachment to native listener thread.
-
Direct coupling of application code to native thread.
Does OpenSplice support the use of concurrent domains within the same application, and is there a limit to the number of them?
What is the difference between a Partition and a Domain?
In the DDS-standard, there are different means for data-partitioning, one is the concept of a ‘Domain’ and the other is a ‘Partition’.
Domains completely separate DDS-instantiations meaning that information (Topics/types/instances/samples) can have a completely different meaning between domains even if their names suggest otherwise.
In OpenSplice DDS, a Domain is characterised by a shared memory segment that holds
- All the data of that domain in a node.
- A set of applications that have created Domain Participants for that domain
- A set of pluggable services that aid in realising the required and configured functionality that is needed in that domain (with services such as for networking, durability, SOAP-connector, DBMS-connector, etc.).
A DDS ‘Partition’ is a more granular, dynamic and therefore powerful concept in DDS in that any Publisher and/or Subscriber is always related / connected to one or more DDS-partitions.
A DDS-Partition is a QoS policy of Publishers and Subscribers and all readers/writers that belong to a publisher/subscriber share information that is written in those partitions.
Partitions can be created on-the-fly, are characterised by a ‘name’ and subscribers and publishers (but typically subscribers) can even use wildcards in the partition-name to allow connection to dynamic sets of partitions.
Does OpenSplice use metadata?
Yes, the OMG-DDS specification has a clearly defined set of metadata to which OpenSplice conforms, this metadata contains information about the type definitions and QoS used in the system. It is also used for built-in-topics that describe DDS entities such as participants/publishers/subscribers/writers/readers and topics.
How to detect a Node being removed from the reliable protocol.
An error message similar to Node 0x23488dbd (address x.x.x.x) not responding or no heartbeats received, removing it from the reliable protocol may be seen in the ospl log files.
This is a sign of a major issue in your system, typically caused by:
- Networking/Topology issue, in which case there should also be accompanying log-messages stating no heartbeats were received.
- Reactivity of the receiving node is impaired, default settings imply that even after 100 retries during 3 seconds, no acknowledges were received by the sending node.
How can I list all the Topics in a Domain?
You can use Builtin Topics to do this. You need to read all the instances of the “DCPSTopic” topic. Once you have done this you need to invoke participant::get_builtin_subscriber(), then invoke invoke subscriber::lookup_datareader(“DCPSTopic”) and finally just read all samples. The names of the topics are in the “name” field of the DCPSTopic samples.
I need to write a topic sample (volatile, reliable) to the cloud and then immediately exit my application. Is there a way to ensure that the topic sample was actually sent and received by the targeted reader before I exit my application?
Synchronous write is a good option here, you’ll need to set the synchronous option in the ReliabilityQos for the writer and reader to true. Please see ReliabilityQosPolicy in your API language reference guide.
How does OpenSplice DDS deal with timezones? If we are using the source timestamp in our QoS settings and our machines are in different time zones would this cause problems?
The timestamp uses UTC time so the different time zones should have no effect.
Will OpenSplice function without Discovery?
A new DataReader has just been created, but appears to miss the first sample sent.
When you are creating a new datareader there is a small amount of administrative time needed to setup the new object, the create_datareader call does not block until the data reader is completely established. If you are trying to receive samples immediately after calling the create methods then samples maybe lost during this administrative time period. To prevent this we would recommend adding a waitset call for a few seconds to allow the DataReader to set up before receiving the expected samples.