driver-sync/src/examples/documentation/CausalConsistencyExamples.java
public static void main(final String[] args) {
        setupDatabase();
        MongoClient client = MongoClients.create();

        // Start Causal Consistency Example 1
        // Example 1: Use a causally consistent session to ensure that the update occurs before the insert.
        ClientSession session1 = client.startSession(ClientSessionOptions.builder().causallyConsistent(true).build());
        Date currentDate = new Date();
        MongoCollection<Document> items = client.getDatabase("test")
                .withReadConcern(ReadConcern.MAJORITY)
                .withWriteConcern(WriteConcern.MAJORITY.withWTimeout(1000, TimeUnit.MILLISECONDS))
                .getCollection("test");

        items.updateOne(session1, eq("sku", "111"), set("end", currentDate));

        Document document = new Document("sku", "nuts-111")
                .append("name", "Pecans")
                .append("start", currentDate);
        items.insertOne(session1, document);
        // End Causal Consistency Example 1

        // Start Causal Consistency Example 2
        // Example 2: Advance the cluster time and the operation time to that of the other session to ensure that
        // this client is causally consistent with the other session and read after the two writes.
        ClientSession session2 = client.startSession(ClientSessionOptions.builder().causallyConsistent(true).build());
        session2.advanceClusterTime(session1.getClusterTime());
        session2.advanceOperationTime(session1.getOperationTime());

        items = client.getDatabase("test")
                .withReadPreference(ReadPreference.secondary())
                .withReadConcern(ReadConcern.MAJORITY)
                .withWriteConcern(WriteConcern.MAJORITY.withWTimeout(1000, TimeUnit.MILLISECONDS))
                .getCollection("items");

        for (Document item: items.find(session2, eq("end", BsonNull.VALUE))) {
            System.out.println(item);
        }
        // End Causal Consistency Example 2
    }
public static void main(final String[] args) {
        setupDatabase();
        MongoClient client = MongoClients.create();

        // Start Causal Consistency Example 1
        // Example 1: Use a causally consistent session to ensure that the update occurs before the insert.
        ClientSession session1 = client.startSession(ClientSessionOptions.builder().causallyConsistent(true).build());
        Date currentDate = new Date();
        MongoCollection<Document> items = client.getDatabase("test")
                .withReadConcern(ReadConcern.MAJORITY)
                .withWriteConcern(WriteConcern.MAJORITY.withWTimeout(1000, TimeUnit.MILLISECONDS))
                .getCollection("test");

        items.updateOne(session1, eq("sku", "111"), set("end", currentDate));

        Document document = new Document("sku", "nuts-111")
                .append("name", "Pecans")
                .append("start", currentDate);
        items.insertOne(session1, document);
        // End Causal Consistency Example 1

        // Start Causal Consistency Example 2
        // Example 2: Advance the cluster time and the operation time to that of the other session to ensure that
        // this client is causally consistent with the other session and read after the two writes.
        ClientSession session2 = client.startSession(ClientSessionOptions.builder().causallyConsistent(true).build());
        session2.advanceClusterTime(session1.getClusterTime());
        session2.advanceOperationTime(session1.getOperationTime());

        items = client.getDatabase("test")
                .withReadPreference(ReadPreference.secondary())
                .withReadConcern(ReadConcern.MAJORITY)
                .withWriteConcern(WriteConcern.MAJORITY.withWTimeout(1000, TimeUnit.MILLISECONDS))
                .getCollection("items");

        for (Document item: items.find(session2, eq("end", BsonNull.VALUE))) {
            System.out.println(item);
        }
        // End Causal Consistency Example 2
    }
Run this main method to see the output of this quick example.

@param args takes an optional single argument for the connection string