🎄 Happy Holidays! 🥳

Most of Solace is closed December 24–January 1 so our employees can spend time with their families. We will re-open Thursday, January 2, 2024. Please expect slower response times during this period and open a support ticket for anything needing immediate assistance.

Happy Holidays!

Please note: most of Solace is closed December 25–January 2, and will re-open Tuesday, January 3, 2023.

How to get the biggest dump..!

Aaron
Aaron Member, Administrator, Moderator, Employee Posts: 644 admin
edited October 2020 in Tips and Tricks #1

Message.dump() that is..!

One of the most convenient features in the Solace native APIs is the ability to just dump() out the contents of a message to the console for debugging. If you've ever used any of the basic Solace Samples, or used SdkPerf test tool, you have seen this output.

I wanted to find out: what is the largest dump() I could make?? Or, said another way: how many different header fields and elements could I use? So, using the JCSMP API, I tried to populate as many as I could. This is the result:

Destination:                            Topic 'test/direct'
SenderId:                               msg.setSenderId()
AppMessageType:                         msg.setApplicationMessageType()
AppMessageID:                           msg.setApplicationMessageId()
SequenceNumber:                         123456789
CorrelationId:                          msg.setCorrelationId()
SendTimestamp:                          1603692499396 (Mon Oct 26 2020 14:08:19.396)
Priority:                               254
Class Of Service:                       USER_COS_2
DeliveryMode:                           DIRECT
Message Id:                             5
Reply Message
ReplyTo:                                Topic '#P2P/v:sg-sol-3501-vmr/mPuoLl8m/Aarons-Thinkpad/31648/#000f0001/FAeiZoampP/msg.setReplyToSuffix()'
Deliver To One
TimeToLive:                             60000
DMQ Eligible
Eliding Eligible
User Data:                              len=17
  6d 73 67 2e 73 65 74 55    73 65 72 44 61 74 61 28    msg.setUserData(
  29                                                    )

User Property Map:                      2 entries
  Key 'an answer' (Integer): 42
  Key 'what is this' (String): user properties

HTTP Content Type:                      msg.setHTTPContentType
HTTP Content Encoding:                  msg.setHTTPContentEncoding()
Binary Attachment:                      len=23
  1c 17 54 65 78 74 20 4d    65 73 73 61 67 65 20 44    ..Text.Message.D
  69 72 65 63 74 21 00                                  irect!.

XML:                                    len=16
  6d 73 67 2e 77 72 69 74    65 42 79 74 65 73 28 29    msg.writeBytes()

That's a LOT of different things in the message. Did you know all of them? Leave a comment!

Full Java source code after the break.

Comments

  • Aaron
    Aaron Member, Administrator, Moderator, Employee Posts: 644 admin
    edited October 2020 #2
    /*
     * Licensed to the Apache Software Foundation (ASF) under one
     * or more contributor license agreements.  See the NOTICE file
     * distributed with this work for additional information
     * regarding copyright ownership.  The ASF licenses this file
     * to you under the Apache License, Version 2.0 (the
     * "License"); you may not use this file except in compliance
     * with the License.  You may obtain a copy of the License at
     *
     *   http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing,
     * software distributed under the License is distributed on an
     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
     * KIND, either express or implied.  See the License for the
     * specific language governing permissions and limitations
     * under the License.
     */
    
    package com.solace.samples.others;
    
    import java.nio.charset.Charset;
    import java.util.concurrent.atomic.AtomicInteger;
    
    import com.solacesystems.jcsmp.BytesXMLMessage;
    import com.solacesystems.jcsmp.ConsumerFlowProperties;
    import com.solacesystems.jcsmp.DeliveryMode;
    import com.solacesystems.jcsmp.EndpointProperties;
    import com.solacesystems.jcsmp.FlowReceiver;
    import com.solacesystems.jcsmp.JCSMPException;
    import com.solacesystems.jcsmp.JCSMPFactory;
    import com.solacesystems.jcsmp.JCSMPProperties;
    import com.solacesystems.jcsmp.JCSMPSession;
    import com.solacesystems.jcsmp.JCSMPStreamingPublishEventHandler;
    import com.solacesystems.jcsmp.Queue;
    import com.solacesystems.jcsmp.SDTMap;
    import com.solacesystems.jcsmp.TextMessage;
    import com.solacesystems.jcsmp.User_Cos;
    import com.solacesystems.jcsmp.XMLMessageConsumer;
    import com.solacesystems.jcsmp.XMLMessageListener;
    import com.solacesystems.jcsmp.XMLMessageProducer;
    
    public class TestEveryMessageSetting {
    
        private static final Charset UTF_8 = Charset.forName("UTF-8");
        private static AtomicInteger directMessages = new AtomicInteger(0);
        private static AtomicInteger queueMessages = new AtomicInteger(0);
    
        public static void main(String... args) throws JCSMPException, InterruptedException {
    
            // Check command line arguments
            if (args.length < 3) {
                System.out.println("Usage: "+TestEveryMessageSetting.class.getSimpleName()+" <host:port> <message-vpn> <client-username> [client-password]");
                System.out.println();
                System.exit(-1);
            }
    
            System.out.println(TestEveryMessageSetting.class.getSimpleName()+" initializing...");
    
            // Create a JCSMP Session
            final JCSMPProperties properties = new JCSMPProperties();
            properties.setProperty(JCSMPProperties.HOST, args[0]);     // host:port
            properties.setProperty(JCSMPProperties.USERNAME, args[1]); // client-username
            properties.setProperty(JCSMPProperties.VPN_NAME,  args[2]); // message-vpn
            if (args.length > 3) { 
                properties.setProperty(JCSMPProperties.PASSWORD, args[3]); // client-password
            }
            // Make sure that the session is tolerant of the subscription already existing on the queue.
            properties.setProperty(JCSMPProperties.IGNORE_DUPLICATE_SUBSCRIPTION_ERROR, true);
    
            final JCSMPSession session =  JCSMPFactory.onlyInstance().createSession(properties);
    
            session.connect();
            System.out.println("Connected.");
    
            /** Anonymous inner-class for handling publishing events */
            XMLMessageProducer prod = session.getMessageProducer(new JCSMPStreamingPublishEventHandler() {
                @Override
                public void responseReceived(String messageID) {
                    System.out.println("******** Producer received response for msg: " + messageID);
                }
                @Override
                public void handleError(String messageID, JCSMPException e, long timestamp) {
                    System.out.printf("********* Producer received error for msg: %s@%s - %s%n",
                            messageID,timestamp,e);
                }
            });
    
            final XMLMessageConsumer cons = session.getMessageConsumer(new XMLMessageListener() {
                @Override
                public void onReceive(BytesXMLMessage msg) {
                    System.out.printf("========================%nDIRECT MESSAGE #%d RECEIVED:%n%s%n",directMessages.incrementAndGet(),msg.dump());
                }
    
                @Override
                public void onException(JCSMPException e) {
                    System.out.printf("******* Consumer received exception: %s%n",e);
                }
            });
            session.addSubscription(JCSMPFactory.onlyInstance().createTopic("test/>"));
            System.out.println("Connected. Awaiting message...");
            cons.start();
    
            // TEST1
            TextMessage msg = JCSMPFactory.onlyInstance().createMessage(TextMessage.class);
            msg.setText("Text Message Direct!");
            msg.setUserData("msg.setUserData()".getBytes(UTF_8));
            SDTMap map = JCSMPFactory.onlyInstance().createMap();
            map.putString("what is this","user properties");
            map.putInteger("an answer",42);
            msg.setProperties(map);
            msg.setAckImmediately(true);
            msg.setApplicationMessageId("msg.setApplicationMessageId()");
            msg.setApplicationMessageType("msg.setApplicationMessageType()");
            msg.setAsReplyMessage(true);
            msg.setCorrelationId("msg.setCorrelationId()");
            msg.setCorrelationKey(msg);
            msg.setCos(User_Cos.USER_COS_2);  // why not
            msg.setDeliverToOne(true);  // old school
            msg.setDeliveryMode(DeliveryMode.DIRECT);
            msg.setDMQEligible(true);
            msg.setElidingEligible(true);
            msg.setExpiration(System.currentTimeMillis()+(1000*60*60*24));
            msg.setHTTPContentEncoding("msg.setHTTPContentEncoding()");
            msg.setHTTPContentType("msg.setHTTPContentType");
            msg.setPriority(254);
            msg.setReplyTo(JCSMPFactory.onlyInstance().createTopic("msg.setReplyTo()"));
            //msg.setReplyToSuffix("msg.setReplyToSuffix()");  // overwrites previous reply-to with inbox topic
            msg.setSenderId("msg.setSenderId()");
            msg.setSenderTimestamp(System.currentTimeMillis());
            msg.setSequenceNumber(123456789);
            msg.setTimeToLive(1000*60);  // milliseconds
            //msg.writeAttachment("msg.writeAttachment()".getBytes(UTF_8));  // binary payload, overwrites TextMsg body
            msg.writeBytes("msg.writeBytes()".getBytes(UTF_8));  // XML payload, don't use this, just a test
            System.out.println("Sending FULL Direct Text Message");
            System.out.println(msg.dump());
            prod.send(msg,JCSMPFactory.onlyInstance().createTopic("test/direct"));
    
            Thread.sleep(1000);
            System.out.println("Exiting.");
            session.closeSession();
        }
    }