From db1fda2c42c5218c02252ace821d472931d2244a Mon Sep 17 00:00:00 2001 From: Jamieson Walker Date: Thu, 2 Oct 2025 11:00:33 -0500 Subject: [PATCH 1/6] Added new JCSMP Serdes tutorials Included JSON tutorial but left out AVRO and generic as they are essentially identical --- gatsby-config.js | 2 +- package-lock.json | 530 +++++++++++------- .../tutorials/jcsmp/schema-registry-serdes.md | 113 ++++ 3 files changed, 437 insertions(+), 208 deletions(-) create mode 100644 src/pages/tutorials/jcsmp/schema-registry-serdes.md diff --git a/gatsby-config.js b/gatsby-config.js index cc83a92..59d81d7 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -258,7 +258,7 @@ module.exports = { options: { name: `JCSMP-Samples`, remote: `https://github.com/SolaceSamples/solace-samples-java-jcsmp`, - commit: '7ce4d7edfb53d03e44a8b45a405aa53ed10348ef', + commit: '7333ce5eb44953f41fae402b58045f69134b603b', } }, { diff --git a/package-lock.json b/package-lock.json index d22a646..e654dfd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -297,12 +297,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -622,17 +624,19 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -659,12 +663,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "license": "MIT", "dependencies": { - "@babel/template": "^7.25.0", - "@babel/types": "^7.25.6" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" }, "engines": { "node": ">=6.9.0" @@ -749,11 +754,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -2224,24 +2230,23 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", - "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -2265,13 +2270,13 @@ } }, "node_modules/@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -6351,45 +6356,86 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/bare-events": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", - "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", - "optional": true + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.7.0.tgz", + "integrity": "sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==", + "license": "Apache-2.0" }, "node_modules/bare-fs": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", - "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.4.5.tgz", + "integrity": "sha512-TCtu93KGLu6/aiGWzMr12TmSRS6nKdfhAnzTQRbXoSWxkbb9eRd53jQ51jG7g1gYjjtto3hbBrrhzg6djcgiKg==", + "license": "Apache-2.0", "optional": true, "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } } }, "node_modules/bare-os": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", - "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", - "optional": true + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", + "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } }, "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", "optional": true, "dependencies": { - "bare-os": "^2.1.0" + "bare-os": "^3.0.1" } }, "node_modules/bare-stream": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.0.tgz", - "integrity": "sha512-pVRWciewGUeCyKEuRxwv06M079r+fRjAQjBEK2P6OYGrO43O+Z0LrPZZEjlc4mB6C2RpZ9AxJ1s7NLEtOHO6eA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", + "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.2.2.tgz", + "integrity": "sha512-g+ueNGKkrjMazDG3elZO1pNs3HY5+mMmOet1jtKyhOaCnkLzitxf26z7hoAEkDNgdNmnc1KIlt/dw6Po6xZMpA==", + "license": "Apache-2.0", "optional": true, "dependencies": { - "b4a": "^1.6.6", - "streamx": "^2.20.0" + "bare-path": "^3.0.0" } }, "node_modules/base": { @@ -6410,9 +6456,10 @@ } }, "node_modules/base-x": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", - "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.11.tgz", + "integrity": "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } @@ -6640,9 +6687,10 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6877,6 +6925,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/call-me-maybe": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", @@ -7233,9 +7294,10 @@ } }, "node_modules/clipboardy/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -7620,30 +7682,23 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { "node": ">= 0.8.0" } }, - "node_modules/compression/node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/compression/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -7657,10 +7712,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -7868,9 +7927,10 @@ } }, "node_modules/create-gatsby": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/create-gatsby/-/create-gatsby-3.13.1.tgz", - "integrity": "sha512-CCg8Vz/iQs1cgMEzyRlVGMvNs8ivE/2w+TL6yS56FVe1JjOou8nKYHzxnWxRmBUtC7rTfjxVaTESIotuYBsltQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/create-gatsby/-/create-gatsby-3.15.0.tgz", + "integrity": "sha512-EjScC6GRDvL/mgbURFxv7gCkJmNqU1q+pptKx2ry11JbSzx1vvFIFXpiID3JxuM3fCzPcqh2GnCPUk+PU7lvLg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13" }, @@ -7903,10 +7963,11 @@ } }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -8787,6 +8848,20 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -9033,12 +9108,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -9100,9 +9173,10 @@ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==" }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -9111,13 +9185,15 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.2.4", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -9752,9 +9828,10 @@ } }, "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -9953,6 +10030,15 @@ "node": ">=0.8.x" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/exec-sh": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", @@ -9985,9 +10071,10 @@ } }, "node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -10228,16 +10315,17 @@ "dev": true }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -10251,7 +10339,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -10266,6 +10354,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-http-proxy": { @@ -10313,9 +10405,10 @@ } }, "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10334,9 +10427,10 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" }, "node_modules/express/node_modules/qs": { "version": "6.13.0", @@ -11158,12 +11252,15 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -11515,10 +11612,11 @@ } }, "node_modules/gatsby-cli": { - "version": "5.13.3", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-5.13.3.tgz", - "integrity": "sha512-JQTeivvZWuhxE1HRey2sRhwUmkCrs5478fiLR0XRFGin4X1ggCmrQx/DBkJP1TgktdPfNU8t987+slSnO2XzMA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-5.15.0.tgz", + "integrity": "sha512-wTUAc2rNr39s7PDO1EaFOBbFmgfuEJ4hdJfh0b/0zd5FMHep+8Z7Kp6/B9KWhHOhHFkFasL7jgZozin4y3QGdg==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.18.6", "@babel/core": "^7.20.12", @@ -11536,13 +11634,12 @@ "clipboardy": "^4.0.0", "common-tags": "^1.8.2", "convert-hrtime": "^3.0.0", - "create-gatsby": "^3.13.1", + "create-gatsby": "^3.15.0", "envinfo": "^7.10.0", "execa": "^5.1.1", "fs-exists-cached": "^1.0.0", - "fs-extra": "^11.1.1", - "gatsby-core-utils": "^4.13.1", - "gatsby-telemetry": "^4.13.1", + "fs-extra": "^11.2.0", + "gatsby-core-utils": "^4.15.0", "hosted-git-info": "^3.0.8", "is-valid-path": "^0.1.1", "joi": "^17.9.2", @@ -11570,18 +11667,19 @@ } }, "node_modules/gatsby-core-utils": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.13.1.tgz", - "integrity": "sha512-w7G6SsQr8T2q+AJ1MxvRNGocCt+wjc22MiRLj2Zi3Ijpjszbr818JxwI4+aPt8WOSHlKT5SYCHICnEvcYPm9gg==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.15.0.tgz", + "integrity": "sha512-fxzHbCvQm1u74DSjy7G4PVqEcWb7sOCFg3kFFVUqVKe3hDCm6s1M/gRSvpm3/3fm74HhgLsmQ54Qaf54Ckyn9w==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", "ci-info": "2.0.0", "configstore": "^5.0.1", "fastq": "^1.15.0", "file-type": "^16.5.4", - "fs-extra": "^11.1.1", + "fs-extra": "^11.2.0", "got": "^11.8.6", - "hash-wasm": "^4.9.0", + "hash-wasm": "^4.11.0", "import-from": "^4.0.0", "lmdb": "2.5.3", "lock": "^1.1.0", @@ -12551,15 +12649,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -12576,6 +12680,19 @@ "node": ">=4" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -12863,11 +12980,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13248,9 +13366,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -17882,6 +18001,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/math-random": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", @@ -18641,15 +18769,16 @@ "optional": true }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -19351,9 +19480,10 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -20084,9 +20214,10 @@ } }, "node_modules/password-prompt/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -20248,9 +20379,10 @@ "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==" }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -21020,9 +21152,10 @@ } }, "node_modules/prebuild-install/node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "license": "MIT", "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -21352,11 +21485,6 @@ } ] }, - "node_modules/queue-tick": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" - }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -21554,9 +21682,10 @@ } }, "node_modules/react-dev-utils/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -22048,11 +22177,6 @@ "node": ">=4" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/regenerator-transform": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", @@ -24167,16 +24291,14 @@ } }, "node_modules/streamx": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", - "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==", + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", + "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "license": "MIT", "dependencies": { + "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", - "queue-tick": "^1.0.1", "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" } }, "node_modules/strict-uri-encode": { @@ -24712,16 +24834,17 @@ } }, "node_modules/tar-fs": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", - "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "license": "MIT", "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" } }, "node_modules/tar-stream": { @@ -25059,9 +25182,10 @@ } }, "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "license": "MIT", "engines": { "node": ">=14.14" } @@ -25072,14 +25196,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", diff --git a/src/pages/tutorials/jcsmp/schema-registry-serdes.md b/src/pages/tutorials/jcsmp/schema-registry-serdes.md new file mode 100644 index 0000000..bd80768 --- /dev/null +++ b/src/pages/tutorials/jcsmp/schema-registry-serdes.md @@ -0,0 +1,113 @@ +--- +layout: features +title: Schema Registry Serialize/Deserialize (SERDES) +summary: Learn to serialize and deserialize messages using JSON Schema with the Schema Registry. +links: + - label: HelloWorldJCSMPJsonSchemaSerde.java + link: /blob/master/src/main/java/com/solace/samples/jcsmp/features/serdes/jsonschema/HelloWorldJCSMPJsonSchemaSerde.java + - label: JsonSchemaSerializeProducer.java + link: /blob/master/src/main/java/com/solace/samples/jcsmp/features/serdes/jsonschema/JsonSchemaSerializeProducer.java + - label: JsonSchemaDeserializeConsumerToPojo.java + link: /blob/master/src/main/java/com/solace/samples/jcsmp/features/serdes/jsonschema/JsonSchemaDeserializeConsumerToPojo.java + - label: feedback + link: https://github.com/SolaceDev/solace-dev-tutorials/blob/master/src/pages/tutorials/jcsmp/schema-registry-serdes.md +--- + +This feature exploration shows how to use the Solace Schema Registry with JSON Schema serializers and deserializers (SERDES) to automatically validate and manage event schemas when publishing and consuming events. AVRO and generic SERDES are also availble in JCSMP and work in a very similar way. We will not explore those examples specifically in this tutorial but there are samples available in the JCSMP Samples repository. + +## Feature Overview + +The Solace Schema Registry provides a centralized repository for managing message schemas, enabling schema validation, versioning, and evolution across your event-driven applications. The Schema Registry SERDES integration with JCSMP allows you to serialize and deserialize messages while automatically validating them against registered schemas. + +Key benefits include: +* **Automatic Schema Validation**: Messages are validated against registered schemas during serialization and deserialization +* **Type Safety**: Serialize from and deserialize to Plain Old Java Objects (POJOs) with compile-time type checking +* **Schema Evolution**: Manage schema versions and support backward/forward compatibility +* **Centralized Management**: Store and manage schemas in a centralized registry accessible by all applications + +The Schema Registry SERDES library supports both JSON Schema and Apache Avro formats. This tutorial focuses on JSON Schema serialization and deserialization, but Avro support is also available in the sample repository. For generic serialization and deserialization examples, see the complete sample code in the GitHub repository. + +## Prerequisites + +* A Solace PubSub+ broker (version 10.5 or later) with Schema Registry deployed +* Access to the Schema Registry with appropriate credentials +* JSON Schema files uploaded to the Schema Registry +* The [Client Profile](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm) must be configured to support your messaging requirements +For guidance on schema registry setup complete the [Schema registry codelab](https://codelabs.solace.dev/codelabs/schema-registry/?index=..%2F..index#0) + +For more information about the Solace Schema Registry, refer to the [Schema Registry Overview](https://docs.solace.com/Schema-Registry/schema-registry-overview.htm) documentation. + +NOTE: The Schema Registry SERDES library requires the following Gradle dependencies: +```gradle +implementation(platform('com.solace:solace-schema-registry-serdes-bom:1.+')) +implementation 'com.solace:solace-schema-registry-jsonschema-serde' +``` + +## Configuring the Schema Registry Connection + +Before using the serializers and deserializers, you need to configure the connection to the Schema Registry. The configuration uses environment variables or system properties: + +`embed:JCSMP-Samples/src/main/java/com/solace/samples/jcsmp/features/serdes/jsonschema/JsonSchemaSerializeProducer.java#L129-140` + + +## JSON Schema Serialization + +To serialize messages using JSON Schema, create a `JsonSchemaSerializer` and configure it with your Schema Registry connection details. The serializer validates your Java objects against the registered schema before converting them to JSON. + +### Creating and Configuring the Serializer + +`embed:JCSMP-Samples/src/main/java/com/solace/samples/jcsmp/features/serdes/jsonschema/JsonSchemaSerializeProducer.java#L69-112` + +If the data doesn't conform to the registered schema, a `JsonSchemaValidationException` will be thrown during serialization. + +## JSON Schema Deserialization + +Deserialization works in reverse - it validates incoming JSON messages against the registered schema and converts them to Java objects. + +### Deserializing to JsonNode + +For flexible JSON handling, you can deserialize to Jackson's `JsonNode`: + +`embed:JCSMP-Samples/src/main/java/com/solace/samples/jcsmp/features/serdes/jsonschema/JsonSchemaDeserializeConsumerToJsonNode.java#L69-112` + + +### Deserializing to POJOs + +For type-safe deserialization directly to Java objects, configure your JSON Schema with the `customJavaType` property. This allows the deserializer to automatically map JSON to your POJO: + +`embed:JCSMP-Samples/src/main/java/com/solace/samples/jcsmp/features/serdes/jsonschema/JsonSchemaDeserializeConsumerToPojo.java#L72-108` + +## Error Handling + +When working with Schema Registry SERDES, handle these common exceptions: + +* **JsonSchemaValidationException**: Thrown when data doesn't conform to the registered schema +* **RuntimeException**: May be thrown for deserialization errors or encoding issues +* **JCSMPException**: Standard JCSMP exceptions for connection and messaging issues + +```java +try { + byte[] data = serializer.serialize(topic, payload); +} catch (JsonSchemaValidationException e) { + System.err.println("Validation error: " + e.getMessage()); + // Handle invalid data - fix schema or data +} catch (Exception e) { + System.err.println("Serialization error: " + e.getMessage()); + // Handle other serialization issues +} +``` + +## Additional SERDES Support + +This tutorial demonstrates JSON Schema serialization and deserialization. The Solace Schema Registry SERDES library also provides: + +* **Apache Avro SERDES**: For binary serialization with Avro schemas +* **Generic Serializers/Deserializers**: For working with multiple schema formats dynamically + +For complete examples of these features, see the [SERDES samples](https://github.com/SolaceSamples/solace-samples-java-jcsmp/tree/master/src/main/java/com/solace/samples/jcsmp/features/serdes) in the GitHub repository. + +## Learn More + +* Related Source Code: [Schema Registry JSON SERDES Samples](https://github.com/SolaceSamples/solace-samples-java-jcsmp/tree/master/src/main/java/com/solace/samples/jcsmp/features/serdes/jsonschema) +* [Solace Schema Registry Documentation](https://docs.solace.com/Schema-Registry/schema-registry-overview.htm) +* [Schema Registry SERDES GitHub Repository](https://github.com/SolaceSamples/solace-samples-java-jcsmp/tree/master/src/main/java/com/solace/samples/jcsmp/features/serdes) From 46395475997b85ec06182a4685dc84e295b65d3e Mon Sep 17 00:00:00 2001 From: Jamieson Walker Date: Thu, 2 Oct 2025 11:03:37 -0500 Subject: [PATCH 2/6] Updated with images and links --- src/pages/tutorials/jcsmp/image.png | Bin 0 -> 80072 bytes .../tutorials/jcsmp/schema-registry-serdes.md | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 src/pages/tutorials/jcsmp/image.png diff --git a/src/pages/tutorials/jcsmp/image.png b/src/pages/tutorials/jcsmp/image.png new file mode 100644 index 0000000000000000000000000000000000000000..39064e32f9aa4dd65ba8b878669e5f788ce511af GIT binary patch literal 80072 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 z�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 literal 0 HcmV?d00001 diff --git a/src/pages/tutorials/jcsmp/schema-registry-serdes.md b/src/pages/tutorials/jcsmp/schema-registry-serdes.md index bd80768..bfbffe4 100644 --- a/src/pages/tutorials/jcsmp/schema-registry-serdes.md +++ b/src/pages/tutorials/jcsmp/schema-registry-serdes.md @@ -19,6 +19,8 @@ This feature exploration shows how to use the Solace Schema Registry with JSON S The Solace Schema Registry provides a centralized repository for managing message schemas, enabling schema validation, versioning, and evolution across your event-driven applications. The Schema Registry SERDES integration with JCSMP allows you to serialize and deserialize messages while automatically validating them against registered schemas. +![Schema Registry Flow](image.png) + Key benefits include: * **Automatic Schema Validation**: Messages are validated against registered schemas during serialization and deserialization * **Type Safety**: Serialize from and deserialize to Plain Old Java Objects (POJOs) with compile-time type checking @@ -32,7 +34,7 @@ The Schema Registry SERDES library supports both JSON Schema and Apache Avro for * A Solace PubSub+ broker (version 10.5 or later) with Schema Registry deployed * Access to the Schema Registry with appropriate credentials * JSON Schema files uploaded to the Schema Registry -* The [Client Profile](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm) must be configured to support your messaging requirements +* There must be a suitable [Client Profile](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm) configured on your broker For guidance on schema registry setup complete the [Schema registry codelab](https://codelabs.solace.dev/codelabs/schema-registry/?index=..%2F..index#0) For more information about the Solace Schema Registry, refer to the [Schema Registry Overview](https://docs.solace.com/Schema-Registry/schema-registry-overview.htm) documentation. From b0827941d0199a27449a6955387903745182164c Mon Sep 17 00:00:00 2001 From: Jamieson Walker Date: Thu, 2 Oct 2025 11:10:29 -0500 Subject: [PATCH 3/6] Update src/pages/tutorials/jcsmp/schema-registry-serdes.md hand crafted spelling errors Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/pages/tutorials/jcsmp/schema-registry-serdes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/tutorials/jcsmp/schema-registry-serdes.md b/src/pages/tutorials/jcsmp/schema-registry-serdes.md index bfbffe4..d70ac04 100644 --- a/src/pages/tutorials/jcsmp/schema-registry-serdes.md +++ b/src/pages/tutorials/jcsmp/schema-registry-serdes.md @@ -13,7 +13,7 @@ links: link: https://github.com/SolaceDev/solace-dev-tutorials/blob/master/src/pages/tutorials/jcsmp/schema-registry-serdes.md --- -This feature exploration shows how to use the Solace Schema Registry with JSON Schema serializers and deserializers (SERDES) to automatically validate and manage event schemas when publishing and consuming events. AVRO and generic SERDES are also availble in JCSMP and work in a very similar way. We will not explore those examples specifically in this tutorial but there are samples available in the JCSMP Samples repository. +This feature exploration shows how to use the Solace Schema Registry with JSON Schema serializers and deserializers (SERDES) to automatically validate and manage event schemas when publishing and consuming events. AVRO and generic SERDES are also available in JCSMP and work in a very similar way. We will not explore those examples specifically in this tutorial but there are samples available in the JCSMP Samples repository. ## Feature Overview From 7bd30cc8ff1d192f89db9213166e2e9c95dace41 Mon Sep 17 00:00:00 2001 From: Jamieson Walker Date: Thu, 2 Oct 2025 11:16:39 -0500 Subject: [PATCH 4/6] improved image naming --- src/pages/tutorials/jcsmp/schema-registry-serdes.md | 2 +- .../jcsmp/{image.png => serdesProcess.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename src/pages/tutorials/jcsmp/{image.png => serdesProcess.png} (100%) diff --git a/src/pages/tutorials/jcsmp/schema-registry-serdes.md b/src/pages/tutorials/jcsmp/schema-registry-serdes.md index bfbffe4..e8d12a4 100644 --- a/src/pages/tutorials/jcsmp/schema-registry-serdes.md +++ b/src/pages/tutorials/jcsmp/schema-registry-serdes.md @@ -19,7 +19,7 @@ This feature exploration shows how to use the Solace Schema Registry with JSON S The Solace Schema Registry provides a centralized repository for managing message schemas, enabling schema validation, versioning, and evolution across your event-driven applications. The Schema Registry SERDES integration with JCSMP allows you to serialize and deserialize messages while automatically validating them against registered schemas. -![Schema Registry Flow](image.png) +![Schema Registry Flow](serdesProcess.png) Key benefits include: * **Automatic Schema Validation**: Messages are validated against registered schemas during serialization and deserialization diff --git a/src/pages/tutorials/jcsmp/image.png b/src/pages/tutorials/jcsmp/serdesProcess.png similarity index 100% rename from src/pages/tutorials/jcsmp/image.png rename to src/pages/tutorials/jcsmp/serdesProcess.png From 8eb572459cfdd5a870cb6aa27865803f4429fbe0 Mon Sep 17 00:00:00 2001 From: Jamieson Walker Date: Thu, 2 Oct 2025 16:53:30 -0500 Subject: [PATCH 5/6] Modified PubSub+ branding to be in line with our new naming scheme --- src/components/404.js | 2 +- src/components/footer.js | 12 +++---- src/components/resources.js | 10 +++--- src/pages/404.js | 2 +- src/pages/tutorials/c/message-replay.md | 6 ++-- .../tutorials/c/persistence-with-queues.md | 22 ++++++------ src/pages/tutorials/c/publish-subscribe.md | 16 ++++----- src/pages/tutorials/c/request-reply.md | 14 ++++---- .../tutorials/c/topic-to-queue-mapping.md | 12 +++---- .../common-assets/helloWorld-intro.md | 2 +- src/pages/tutorials/common-assets/initC.md | 10 +++--- .../tutorials/common-assets/solaceApi.md | 2 +- .../common-assets/solaceMessaging-part1.md | 12 +++---- .../common-assets/solaceMessaging-part2.md | 12 +++---- .../dotnet/persistence-with-queues.md | 2 +- .../tutorials/dotnet/publish-subscribe.md | 2 +- .../dotnet/topic-to-queue-mapping.md | 2 +- src/pages/tutorials/go/_howtos.yml | 2 +- .../topic-to-queue-mapping.md | 2 +- .../durable-topic-subscriber.md | 4 +-- .../topic-to-queue-mapping.md | 2 +- .../java-mqtt-paho/publish-subscribe.md | 2 +- src/pages/tutorials/java/_howtos.yml | 4 +-- .../tutorials/javarto/publish-subscribe.md | 2 +- .../javascript/confirmed-delivery.md | 2 +- .../tutorials/javascript/dte-consumer.md | 2 +- .../tutorials/javascript/message-replay.md | 6 ++-- .../javascript/persistence-with-queues.md | 4 +-- .../tutorials/javascript/publish-subscribe.md | 2 +- .../tutorials/jcsmp/active-flow-indication.md | 2 +- src/pages/tutorials/jcsmp/browsing-queues.md | 2 +- src/pages/tutorials/jcsmp/message-replay.md | 6 ++-- .../tutorials/jcsmp/message-selectors.md | 2 +- .../jcsmp/persistence-with-queues.md | 2 +- .../tutorials/jcsmp/publish-subscribe.md | 2 +- .../tutorials/jcsmp/schema-registry-serdes.md | 2 +- .../tutorials/jcsmp/topic-to-queue-mapping.md | 2 +- src/pages/tutorials/jcsmp/transactions.md | 2 +- src/pages/tutorials/jcsmp/ttl-and-dmq.md | 2 +- src/pages/tutorials/jms/publish-subscribe.md | 2 +- .../tutorials/jms/topic-to-queue-mapping.md | 2 +- src/pages/tutorials/jms/using-jndi.md | 4 +-- .../nodejs-amqp/topic-to-queue-mapping.md | 2 +- .../tutorials/nodejs/confirmed-delivery.md | 2 +- .../nodejs/persistence-with-queues.md | 4 +-- .../tutorials/nodejs/publish-subscribe.md | 2 +- .../nodejs/topic-to-queue-mapping.md | 12 +++---- src/pages/tutorials/openmama/hello-world.md | 2 +- .../rest-messaging/publish-subscribe.md | 34 +++++++++--------- .../semp/messagevpn-with-queue-java.md | 2 +- .../semp/messagevpn-with-queue-python.md | 2 +- .../semp/messagevpn-with-queue-ruby.md | 2 +- src/pages/tutorials/semp/tutorials.yml | 2 +- .../spring/spring-boot-autoconfigure.md | 6 ++-- .../tutorials/spring/spring-cloud-stream.md | 2 +- src/pages/tutorials/tanzu/java-app.md | 20 +++++------ .../tanzu/spring-cloud-autoconf-java.md | 36 +++++++++---------- src/pages/tutorials/tanzu/spring-cloud.md | 26 +++++++------- 58 files changed, 181 insertions(+), 181 deletions(-) diff --git a/src/components/404.js b/src/components/404.js index c4e7b5f..ed18c0a 100644 --- a/src/components/404.js +++ b/src/components/404.js @@ -30,7 +30,7 @@ solace.dev is the homebase where developers start building all of the things
  • - docs.solace.com houses all PubSub+ Event Broker technical documentation + docs.solace.com houses all Solace Event Broker technical documentation
  • Explore success stories within your Industry or the Environment you’re interested in diff --git a/src/components/footer.js b/src/components/footer.js index b0f7ee1..ac151b2 100644 --- a/src/components/footer.js +++ b/src/components/footer.js @@ -32,7 +32,7 @@ const Footer = () => ( target="_blank" rel="noopener noreferrer" > - PubSub+ Platform + Solace Platform
  • @@ -41,7 +41,7 @@ const Footer = () => ( target="_blank" rel="noopener noreferrer" > - PubSub+ Event Broker + Solace Event Broker
  • @@ -50,7 +50,7 @@ const Footer = () => ( target="_blank" rel="noopener noreferrer" > - PubSub+ Event Broker: Software + Solace Event Broker Software
  • @@ -59,7 +59,7 @@ const Footer = () => ( target="_blank" rel="noopener noreferrer" > - PubSub+ Event Broker: Appliance + Solace Event Broker Appliance
  • @@ -68,7 +68,7 @@ const Footer = () => ( target="_blank" rel="noopener noreferrer" > - PubSub+ Event Broker: Cloud + Solace Cloud
  • @@ -77,7 +77,7 @@ const Footer = () => ( target="_blank" rel="noopener noreferrer" > - PubSub+ Event Portal + Solace Event Portal
  • diff --git a/src/components/resources.js b/src/components/resources.js index 25d3582..ea0baae 100644 --- a/src/components/resources.js +++ b/src/components/resources.js @@ -26,7 +26,7 @@ const Resources = (props) => {
    Developer Community
    -
    Technical community for PubSub+.
    +
    Technical community for Solace.
    Learn More
    @@ -72,7 +72,7 @@ const Resources = (props) => {
    Codelabs & Workshops
    - Get guided, hands on coding experience with PubSub+ Codelabs. + Get guided, hands on coding experience with Solace Codelabs.
    Learn More
    @@ -94,7 +94,7 @@ const Resources = (props) => {
    Free Courses
    - Learn the fundamentals of PubSub+ at your own pace. + Learn the fundamentals of Solace at your own pace.
    Learn More
    @@ -119,7 +119,7 @@ const Resources = (props) => { {" "} SDKPerf is a command line tool for validating performance, checking configuration, and exploring features associated with - your PubSub+ message broker. + your Solace message broker.
    Learn More
    @@ -131,7 +131,7 @@ const Resources = (props) => {
    Queue Browser
    Get all the information you need to use JMS ToolBox with - PubSub+. + Solace.
    Learn More
    diff --git a/src/pages/404.js b/src/pages/404.js index 415dd5b..6fd1095 100644 --- a/src/pages/404.js +++ b/src/pages/404.js @@ -77,7 +77,7 @@ const NotFoundPage = () => ( > docs.solace.com {" "} - houses all PubSub+ Event Broker technical documentation + houses all Solace Event Broker technical documentation Q/ 3. Now start a replay from the message broker. The flow event callback monitors for a replay start event. When the message broker initiates a replay, the flow will see a `SOLCLIENT_FLOW_EVENT_DOWN_ERROR` event with SubCode `SOLCLIENT_SUBCODE_REPLAY_STARTED`. This means an administrator has initiated a replay, and the application must destroy and re-create the flow to receive the replayed messages. This will replay all logged messages including the live one published in step 2. -![Screenshot: Initiating Replay using Solace PubSub+ Manager](../../../images/screenshots/initiate-replay.png) +![Screenshot: Initiating Replay using Broker Manager](../../../images/screenshots/initiate-replay.png) ## Learn More diff --git a/src/pages/tutorials/c/persistence-with-queues.md b/src/pages/tutorials/c/persistence-with-queues.md index 589545c..2db620c 100644 --- a/src/pages/tutorials/c/persistence-with-queues.md +++ b/src/pages/tutorials/c/persistence-with-queues.md @@ -13,19 +13,19 @@ links: --- -This tutorial builds on the basic concepts introduced in the [publish/subscribe tutorial](../publish-subscribe/), and will show you how to send and receive persistent messages from a PubSub+ queue in a point to point fashion. +This tutorial builds on the basic concepts introduced in the [publish/subscribe tutorial](../publish-subscribe/), and will show you how to send and receive persistent messages from a Solace queue in a point to point fashion. ## Assumptions This tutorial assumes the following: * You are familiar with Solace PubSub+ [core concepts](https://docs.solace.com/PubSub-Basics/Core-Concepts.htm). -* You have access to PubSub+ messaging with the following configuration details: - * Connectivity information for a PubSub+ message-VPN configured for guaranteed messaging support +* You have access to Solace messaging with the following configuration details: + * Connectivity information for a Solace message-VPN configured for guaranteed messaging support * Enabled client username and password * Client-profile enabled with guaranteed messaging permissions. -One simple way to get access to Solace messaging quickly is to create a messaging service in Solace PubSub+ Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to Solace messaging below. +One simple way to get access to Solace messaging quickly is to create a messaging service in Solace Solace Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to Solace messaging below. ## Goals @@ -52,9 +52,9 @@ Durable endpoints are not auto created on Solace message routers. However there * Using the management interface * Using the APIs -Using the Solace PubSub+ APIs to provision an endpoint can be a convenient way of getting started quickly without needing to become familiar with the management interface. This is why it is used in this tutorial. However it should be noted that the management interface provides more options to control the queue properties. So generally it becomes the preferred method over time. +Using the Solace Solace Messaging APIs to provision an endpoint can be a convenient way of getting started quickly without needing to become familiar with the management interface. This is why it is used in this tutorial. However it should be noted that the management interface provides more options to control the queue properties. So generally it becomes the preferred method over time. -Provisioning an endpoint through the API requires the “Guaranteed Endpoint Create” permission in the client-profile. You can confirm this is enabled by looking at the client profile in PubSub+ Manager. If it is correctly set you will see the following: +Provisioning an endpoint through the API requires the “Guaranteed Endpoint Create” permission in the client-profile. You can confirm this is enabled by looking at the client profile in Broker Manager. If it is correctly set you will see the following: ![Screenshot: Persistence](../../../images/screenshots/persistence-tutorial-image-3.png) @@ -112,7 +112,7 @@ Now it is time to send a message to the queue. ![Diagram: Sending a Message to a Queue](../../../images/diagrams/sending-message-to-queue.png) -To send a message, you must create a message and a queue destination. This tutorial will send a PubSub+ binary message with contents "Hello world!". Then you must send the message to the PubSub+ message router. +To send a message, you must create a message and a queue destination. This tutorial will send a PubSub+ binary message with contents "Hello world!". Then you must send the message to the Solace Event Broker. ```cpp @@ -145,7 +145,7 @@ To send a message, you must create a message and a queue destination. This tutor ``` -The message is transferred to the PubSub+ message router asynchronously, but if all goes well, it will be waiting for your consumer on the queue. +The message is transferred to the Solace Event Broker asynchronously, but if all goes well, it will be waiting for your consumer on the queue. ## Receiving a message from a queue @@ -153,11 +153,11 @@ Now it is time to receive the messages sent to your queue. ![Diagram: Receiving a Message from a Queue](../../../images/diagrams/receiving-message-from-queue.png) -You still need to connect a session just as you did with the publisher. With a connected session, you then need to bind to the PubSub+ message router queue with a flow receiver. Flow receivers allow applications to receive messages from a PubSub+ guaranteed message flow. Flows encapsulate all of the acknowledgement behaviour required for guaranteed messaging. Conveniently flow receivers have the same interface as message consumers but flows also require some additional properties on creation. +You still need to connect a session just as you did with the publisher. With a connected session, you then need to bind to the Solace Event Broker queue with a flow receiver. Flow receivers allow applications to receive messages from a PubSub+ guaranteed message flow. Flows encapsulate all of the acknowledgement behaviour required for guaranteed messaging. Conveniently flow receivers have the same interface as message consumers but flows also require some additional properties on creation. A flow requires properties. At its most basic, the flow properties require the endpoint (our newly provisioned or existing queue) and an ack mode. In this example you’ll use the client ack mode where the application will explicitly acknowledge each message. -Flows are created from PubSub+ session objects just as direct message consumers are. +Flows are created from Solace session objects just as direct message consumers are. Notice `flowMessageReceiveCallback` and `flowEventCallback` callbacks that are passed in when creating a flow. These callbacks will be invoked when a message arrives to the endpoint (the queue) or a flow events occurs. @@ -227,7 +227,7 @@ Combining the example source code shown above results in the following source co ### Running the Samples -If you start the `QueuePublisher` with the required arguments of your PubSub+ messaging, if will publish the message to the specified queue. In the example below, a message is published to a queue `q1` +If you start the `QueuePublisher` with the required arguments of your Solace messaging, if will publish the message to the specified queue. In the example below, a message is published to a queue `q1` ```sh bin$ . /setenv.sh bin$ ./QueuePublisher diff --git a/src/pages/tutorials/c/publish-subscribe.md b/src/pages/tutorials/c/publish-subscribe.md index f1b59f1..a413fd5 100644 --- a/src/pages/tutorials/c/publish-subscribe.md +++ b/src/pages/tutorials/c/publish-subscribe.md @@ -14,18 +14,18 @@ links: link: https://github.com/SolaceDev/solace-dev-tutorials/blob/master/src/pages/tutorials/c/publish-subscribe.md --- -This tutorial will introduce you to the fundamentals of the Solace PubSub+ API by connecting a client, adding a topic subscription and sending a message matching this topic subscription. This forms the basis for any publish / subscribe message exchange. +This tutorial will introduce you to the fundamentals of the Solace Solace Messaging API by connecting a client, adding a topic subscription and sending a message matching this topic subscription. This forms the basis for any publish / subscribe message exchange. ## Assumptions This tutorial assumes the following: * You are familiar with Solace PubSub+ [core concepts](https://docs.solace.com/PubSub-Basics/Core-Concepts.htm). -* You have access to PubSub+ messaging with the following configuration details: - * Connectivity information for a PubSub+ message-VPN +* You have access to Solace messaging with the following configuration details: + * Connectivity information for a Solace message-VPN * Enabled client username and password -One simple way to get access to PubSub+ messaging quickly is to create a messaging service in PubSub+ Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to PubSub+ messaging below. +One simple way to get access to Solace messaging quickly is to create a messaging service in Solace Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to Solace messaging below. ## Goals @@ -72,7 +72,7 @@ Now it is time to send a message to the waiting consumer. ![Diagram: Sending a Message](../../../images/diagrams/pub-sub-sending-message-300x134.png) -To send a message, you must create a message and a topic destination. This tutorial will send a PubSub+ binary message with contents "Hello world!". Then you must send the message to the PubSub+ message router. +To send a message, you must create a message and a topic destination. This tutorial will send a PubSub+ binary message with contents "Hello world!". Then you must send the message to the Solace Event Broker. ```cpp /* Message */ @@ -104,9 +104,9 @@ solClient_msg_free ( &msg_p ); In the SolClient API, messages are allocated and freed from an internal API message pool for greatest performance and efficiency. Therefore as shown, messages must be acquired by calls to solClient_msg_alloc and then later freed back to the pool by calls to solClient_msg_free. -The minimum properties required to create a SolClient message that can be sent is to set the delivery mode, queue or topic destination, and message contents as shown in the above code. Once the message is created it is sent to the PubSub+ message router with a call to solClient_session_sendMsg. +The minimum properties required to create a SolClient message that can be sent is to set the delivery mode, queue or topic destination, and message contents as shown in the above code. Once the message is created it is sent to the Solace Event Broker with a call to solClient_session_sendMsg. -At this point the producer has sent a message to the PubSub+ message router and your waiting consumer will have received the message and printed its contents to the screen. +At this point the producer has sent a message to the Solace Event Broker and your waiting consumer will have received the message and printed its contents to the screen. ## Summarizing @@ -125,7 +125,7 @@ The OS source code simply provides platform abstraction. The subscriber sample m ### Running the Samples -If you start the `TopicSubscriber` with the required arguments of your PubSub+ messaging, it will connect and wait for a message. +If you start the `TopicSubscriber` with the required arguments of your Solace messaging, it will connect and wait for a message. ```sh bin$ . ./setenv.sh diff --git a/src/pages/tutorials/c/request-reply.md b/src/pages/tutorials/c/request-reply.md index f611797..8ad9039 100644 --- a/src/pages/tutorials/c/request-reply.md +++ b/src/pages/tutorials/c/request-reply.md @@ -20,11 +20,11 @@ This tutorial outlines both roles in the request-response message exchange patte This tutorial assumes the following: * You are familiar with Solace PubSub+ [core concepts](https://docs.solace.com/PubSub-Basics/Core-Concepts.htm). -* You have access to PubSub+ messaging with the following configuration details: - * Connectivity information for a PubSub+ message-VPN +* You have access to Solace messaging with the following configuration details: + * Connectivity information for a Solace message-VPN * Enabled client username and password -One simple way to get access to Solace messaging quickly is to create a messaging service in Solace PubSub+ Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to PubSub+ messaging below. +One simple way to get access to Solace messaging quickly is to create a messaging service in Solace Solace Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to Solace messaging below. The build instructions in this tutorial assume you are using a Linux shell. If your environment differs, adapt the instructions. @@ -35,20 +35,20 @@ The goal of this tutorial is to understand the following: * On the requestor side: 1. How to create a request 2. How to receive a response - 3. How to use the Solace PubSub+ API to correlate the request and response + 3. How to use the Solace Solace Messaging API to correlate the request and response * On the replier side: 1. How to detect a request expecting a reply 2. How to generate a reply message ## Overview -Request-reply messaging is supported by the PubSub+ message router for all delivery modes. For direct messaging, the Solace PubSub+ APIs provide the Requestor object for convenience. This object makes it easy to send a request and wait for the reply message. It is a convenience object that makes use of the API provided “inbox” topic that is automatically created for each PubSub+ client and automatically correlates requests with replies using the message correlation ID. (See Message Correlation below for more details). On the reply side another convenience method enables applications to easily send replies for specific requests. Direct messaging request reply is the delivery mode that is illustrated in this sample. +Request-reply messaging is supported by the Solace Event Broker for all delivery modes. For direct messaging, the Solace Solace Messaging APIs provide the Requestor object for convenience. This object makes it easy to send a request and wait for the reply message. It is a convenience object that makes use of the API provided “inbox” topic that is automatically created for each PubSub+ client and automatically correlates requests with replies using the message correlation ID. (See Message Correlation below for more details). On the reply side another convenience method enables applications to easily send replies for specific requests. Direct messaging request reply is the delivery mode that is illustrated in this sample. It is also possible to use guaranteed messaging for request reply scenarios. In this case the replier can listen on a queue for incoming requests and the requestor can use a temporary endpoint to attract replies. The requestor and replier must manually correlate the messages. This is explained further in the [Solace PubSub+ documentation](https://docs.solace.com/Solace-PubSub-Messaging-APIs/API-Developer-Guide/Request-Reply-Messaging.htm) and shown in the API samples named `RRGuaranteedRequestor` and `RRGuaranteedReplier`. ### Message Correlation -For request-reply messaging to be successful it must be possible for the requestor to correlate the request with the subsequent reply. PubSub+ messages support two fields that are needed to enable request-reply correlation. The reply-to field can be used by the requestor to indicate a PubSub+ Topic or Queue where the reply should be sent. A natural choice for this is often the unique `P2PInboxInUse` topic which is an auto-generated unique topic per client which is accessible as a session property. The second requirement is to be able to detect the reply message from the stream of incoming messages. This is accomplished using the correlation-id field. This field will transit the PubSub+ messaging system unmodified. Repliers can include the same correlation-id in a reply message to allow the requestor to detect the corresponding reply. The figure below outlines this exchange. +For request-reply messaging to be successful it must be possible for the requestor to correlate the request with the subsequent reply. PubSub+ messages support two fields that are needed to enable request-reply correlation. The reply-to field can be used by the requestor to indicate a PubSub+ Topic or Queue where the reply should be sent. A natural choice for this is often the unique `P2PInboxInUse` topic which is an auto-generated unique topic per client which is accessible as a session property. The second requirement is to be able to detect the reply message from the stream of incoming messages. This is accomplished using the correlation-id field. This field will transit the Solace messaging system unmodified. Repliers can include the same correlation-id in a reply message to allow the requestor to detect the corresponding reply. The figure below outlines this exchange. ![Diagram: Request/Reply Messaging](../../../images/diagrams/Request-Reply_diagram-1.png) @@ -164,7 +164,7 @@ The full source code for this example is available in [GitHub](https://github.co ### Running the Samples -First start the `BasicReplier` so that it is up and listening for requests. Then you can use the `BasicRequestor` sample to send requests and receive replies. Pass your PubSub+ messaging router connection properties as parameters. +First start the `BasicReplier` so that it is up and listening for requests. Then you can use the `BasicRequestor` sample to send requests and receive replies. Pass your Solace messaging router connection properties as parameters. ```sh bin$ . ./setenv.sh diff --git a/src/pages/tutorials/c/topic-to-queue-mapping.md b/src/pages/tutorials/c/topic-to-queue-mapping.md index c27c710..56b8f1c 100644 --- a/src/pages/tutorials/c/topic-to-queue-mapping.md +++ b/src/pages/tutorials/c/topic-to-queue-mapping.md @@ -1,7 +1,7 @@ --- layout: tutorials title: Topic to Queue Mapping -summary: Learn how to map topics to PubSub+ queues. +summary: Learn how to map topics to Solace queues. icon: I_dev_topic2q.svg links: - label: TopicToQueueMapping.c @@ -20,25 +20,25 @@ The following diagram illustrates this feature. ![Diagram: C Queue Mapping](../../../images/diagrams/topic-to-queue-mapping-detail.png) -If you have a durable queue named `Q`, it will receive messages published directly to the queue destination named `Q`. However, it is also possible to add subscriptions to this queue in the form of topics. This example adds topics `A` and `B`. Once these subscriptions are added, the queue will start receiving messages published to the topic destinations `A` and `B`. When you combine this with the wildcard support provided by PubSub+ topics this opens up a number of interesting use cases. +If you have a durable queue named `Q`, it will receive messages published directly to the queue destination named `Q`. However, it is also possible to add subscriptions to this queue in the form of topics. This example adds topics `A` and `B`. Once these subscriptions are added, the queue will start receiving messages published to the topic destinations `A` and `B`. When you combine this with the wildcard support provided by Solace topics this opens up a number of interesting use cases. ## Assumptions This tutorial assumes the following: -* You have access to PubSub+ messaging with the following configuration details: - * Connectivity information for a PubSub+ message-VPN configured for guaranteed messaging support +* You have access to Solace messaging with the following configuration details: + * Connectivity information for a Solace message-VPN configured for guaranteed messaging support * Enabled client username and password * Client-profile enabled with guaranteed messaging permissions. -One simple way to get access to PubSub+ messaging quickly is to create a messaging service in PubSub+ Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to PubSub+ messaging below. +One simple way to get access to Solace messaging quickly is to create a messaging service in Solace Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to Solace messaging below. ## Goals The goal of this tutorial is to understand the following: * How to add topic subscriptions to a queue. Two ways are shown in this case. -* How to interrogate the PubSub+ message router to confirm capabilities. +* How to interrogate the Solace Event Broker to confirm capabilities. * How to delete a queue. diff --git a/src/pages/tutorials/common-assets/helloWorld-intro.md b/src/pages/tutorials/common-assets/helloWorld-intro.md index bcdebc7..6852544 100644 --- a/src/pages/tutorials/common-assets/helloWorld-intro.md +++ b/src/pages/tutorials/common-assets/helloWorld-intro.md @@ -16,4 +16,4 @@ However, as you can tell from this [Wikipedia article](https://en.wikipedia.org/ - **Asynchronous messaging:** use of callback handlers - **Connection lifecycle management:** connect once, and stay online for the lifetime of the app -This Hello World sample application will connect to a Solace PubSub+ Event Broker, and publish/subscribe in a loop. Let's begin! \ No newline at end of file +This Hello World sample application will connect to a Solace Event Broker, and publish/subscribe in a loop. Let's begin! \ No newline at end of file diff --git a/src/pages/tutorials/common-assets/initC.md b/src/pages/tutorials/common-assets/initC.md index af11f1f..54eb7cb 100644 --- a/src/pages/tutorials/common-assets/initC.md +++ b/src/pages/tutorials/common-assets/initC.md @@ -1,6 +1,6 @@ -## Connecting to the Solace PubSub+ message router +## Connecting to the Solace Event Broker -In order to send or receive messages, an application must connect a PubSub+ session. The PubSub+ session is the basis for all client communication with the PubSub+ message router. +In order to send or receive messages, an application must connect a Solace session. The Solace session is the basis for all client communication with the Solace Event Broker. In the Solace messaging API for C (SolClient), a few distinct steps are required to create and connect a Solace session. @@ -65,7 +65,7 @@ solClient_context_create ( SOLCLIENT_CONTEXT_PROPS_DEFAULT_WITH_CREATE_THREAD, ### Session Creation -Finally a session is needed to actually connect to the PubSub+ message router. This is accomplished by creating a properties array and connecting the session. +Finally a session is needed to actually connect to the Solace Event Broker. This is accomplished by creating a properties array and connecting the session. ```cpp /* Session */ @@ -114,6 +114,6 @@ solClient_session_connect ( session_p ); printf ( "Connected.\n" ); ``` -When creating the session, the factory method takes the session properties, the session pointer and information about the session callback functions. The API then creates the session within the supplied context and returns a reference in the session pointer. The final call to solClient_session_connect establishes the connection to the PubSub+ message router which makes the session ready for use. +When creating the session, the factory method takes the session properties, the session pointer and information about the session callback functions. The API then creates the session within the supplied context and returns a reference in the session pointer. The final call to solClient_session_connect establishes the connection to the Solace Event Broker which makes the session ready for use. -At this point your client is connected to the PubSub+ message router. You can use PubSub+ Manager to view the client connection and related details. +At this point your client is connected to the Solace Event Broker. You can use Broker Manager to view the client connection and related details. diff --git a/src/pages/tutorials/common-assets/solaceApi.md b/src/pages/tutorials/common-assets/solaceApi.md index b8196ce..f978588 100644 --- a/src/pages/tutorials/common-assets/solaceApi.md +++ b/src/pages/tutorials/common-assets/solaceApi.md @@ -1,5 +1,5 @@ -## Obtaining the Solace PubSub+ API +## Obtaining the Solace Messaging API The latest versions of all Solace APIs can be downloaded from the [solace downloads page](https://www.solace.com/downloads/). Otherwise, check the public samples repository of the API where the library is already packaged as a gzipped tar file. Note: always check for the latest API version! \ No newline at end of file diff --git a/src/pages/tutorials/common-assets/solaceMessaging-part1.md b/src/pages/tutorials/common-assets/solaceMessaging-part1.md index 4a4ec21..8e353ea 100644 --- a/src/pages/tutorials/common-assets/solaceMessaging-part1.md +++ b/src/pages/tutorials/common-assets/solaceMessaging-part1.md @@ -1,7 +1,7 @@ ## Get Solace Messaging -This tutorial requires access Solace PubSub+ messaging and requires that you know several connectivity properties about your Solace messaging. Specifically you need to know the following: +This tutorial requires access Solace messaging and requires that you know several connectivity properties about your Solace messaging. Specifically you need to know the following: @@ -12,12 +12,12 @@ This tutorial requires access Solace PubSub+ messaging and requires that you kno - + - + @@ -31,11 +31,11 @@ This tutorial requires access Solace PubSub+ messaging and requires that you kno
    Host StringThis is the address clients use when connecting to the PubSub+ messaging to send and receive messages. (Format: DNS_NAME:Port or IP:Port)This is the address clients use when connecting to the Solace messaging to send and receive messages. (Format: DNS_NAME:Port or IP:Port)
    Message VPN StringThe PubSub+ message router Message VPN that this client should connect to. The Solace message router Message VPN that this client should connect to.
    Client Username
    -There are several ways you can get access to PubSub+ Messaging and find these required properties. +There are several ways you can get access to Solace Messaging and find these required properties. -### Option 1: Use PubSub+ Cloud +### Option 1: Use Solace Cloud -* Follow [these instructions](https://solace.com/products/platform/cloud/) to quickly spin up a cloud-based PubSub+ messaging service for your applications. +* Follow [these instructions](https://solace.com/products/platform/cloud/) to quickly spin up a cloud-based Solace messaging service for your applications. * The messaging connectivity information is found in the service details in the connectivity tab (shown below). You will need: * Host:Port (use the SMF URI) * Message VPN diff --git a/src/pages/tutorials/common-assets/solaceMessaging-part2.md b/src/pages/tutorials/common-assets/solaceMessaging-part2.md index e11b154..81e17d8 100644 --- a/src/pages/tutorials/common-assets/solaceMessaging-part2.md +++ b/src/pages/tutorials/common-assets/solaceMessaging-part2.md @@ -1,17 +1,17 @@ -### Option 2: Start a PubSub+ Software +### Option 2: Start a Solace Event Broker Software -* Follow [these instructions](https://docs.solace.com/Basics/Getting-Started-Try-Broker.htm) to start the PubSub+ Software in leading Clouds, Container Platforms or Hypervisors. The tutorials outline where to download and how to install the PubSub+ Software. +* Follow [these instructions](https://docs.solace.com/Basics/Getting-Started-Try-Broker.htm) to start the Solace Event Broker Software in leading Clouds, Container Platforms or Hypervisors. The tutorials outline where to download and how to install the Solace Event Broker Software. * The messaging connectivity information are the following: * Host: (IP address assigned to the VMR in tutorial instructions) * Message VPN: default * Client Username: sampleUser (can be any value) * Client Password: samplePassword (can be any value) - Note: By default, the PubSub+ Software "default" message VPN has authentication disabled. + Note: By default, the Solace Event Broker Software "default" message VPN has authentication disabled. -### Option 3: Get access to a PubSub+ Appliance +### Option 3: Get access to a Solace Event Broker Appliance -* Contact your PubSub+ appliance administrators and obtain the following: - * A PubSub+ Message-VPN where you can produce and consume direct and persistent messages +* Contact your Solace Event Broker Appliance administrators and obtain the following: + * A Solace Message-VPN where you can produce and consume direct and persistent messages * The host name or IP address of the Solace appliance hosting your Message-VPN * A username and password to access the Solace appliance diff --git a/src/pages/tutorials/dotnet/persistence-with-queues.md b/src/pages/tutorials/dotnet/persistence-with-queues.md index 68584cc..1360aba 100644 --- a/src/pages/tutorials/dotnet/persistence-with-queues.md +++ b/src/pages/tutorials/dotnet/persistence-with-queues.md @@ -54,7 +54,7 @@ Durable endpoints are not auto created on Solace message routers. However there Using the Solace APIs to provision an endpoint can be a convenient way of getting started quickly without needing to become familiar with the management interface. This is why it is used in this tutorial. However it should be noted that the management interface provides more options to control the queue properties. So generally it becomes the preferred method over time. -Provisioning an endpoint through the API requires the “Guaranteed Endpoint Create” permission in the client-profile. You can confirm this is enabled by looking at the client profile in PubSub+ Manager. If it is correctly set you will see the following: +Provisioning an endpoint through the API requires the “Guaranteed Endpoint Create” permission in the client-profile. You can confirm this is enabled by looking at the client profile in Broker Manager. If it is correctly set you will see the following: ![Screenshot: Persistence](../../../images/screenshots/persistence-tutorial-image-3.png) diff --git a/src/pages/tutorials/dotnet/publish-subscribe.md b/src/pages/tutorials/dotnet/publish-subscribe.md index 24106a3..53a72d0 100644 --- a/src/pages/tutorials/dotnet/publish-subscribe.md +++ b/src/pages/tutorials/dotnet/publish-subscribe.md @@ -85,7 +85,7 @@ using (ISession session = context.CreateSession(sessionProps, HandleMessage, nul } ``` -At this point your client is connected to the Solace message router. You can use PubSub+ Manager to view the client connection and related details. +At this point your client is connected to the Solace message router. You can use Broker Manager to view the client connection and related details. ## Receiving a message diff --git a/src/pages/tutorials/dotnet/topic-to-queue-mapping.md b/src/pages/tutorials/dotnet/topic-to-queue-mapping.md index 2bb391a..0fe56ff 100644 --- a/src/pages/tutorials/dotnet/topic-to-queue-mapping.md +++ b/src/pages/tutorials/dotnet/topic-to-queue-mapping.md @@ -146,7 +146,7 @@ using (IMessage message = ContextFactory.Instance.CreateMessage()) } ``` -These messages are now on your queue. You can validate this through PubSub+ Manager by inspecting the queue. Now receive the messages using a flow consumer as outlined in detail in previous tutorials. +These messages are now on your queue. You can validate this through Broker Manager by inspecting the queue. Now receive the messages using a flow consumer as outlined in detail in previous tutorials. ```csharp Flow = session.CreateFlow(new FlowProperties() diff --git a/src/pages/tutorials/go/_howtos.yml b/src/pages/tutorials/go/_howtos.yml index cabc522..ee0db95 100644 --- a/src/pages/tutorials/go/_howtos.yml +++ b/src/pages/tutorials/go/_howtos.yml @@ -17,7 +17,7 @@ description: Sample code showing how to build a Direct Processor link: https://github.com/SolaceSamples/solace-samples-go/blob/main/patterns/direct_processor.go - title: Secure connection - description: Sample code showing how to have a secure connection to Solace PubSub+ Broker + description: Sample code showing how to have a secure connection to Solace Event Broker link: https://github.com/SolaceSamples/solace-samples-go/blob/main/howtos/secure_connection.go - title: Update Service Properties - Oauth Token description: Sample code showing how to change Oauth Tokens by updating the Service Properties diff --git a/src/pages/tutorials/java-amqp-qpid-jms1/topic-to-queue-mapping.md b/src/pages/tutorials/java-amqp-qpid-jms1/topic-to-queue-mapping.md index 38d78fd..75bfff4 100644 --- a/src/pages/tutorials/java-amqp-qpid-jms1/topic-to-queue-mapping.md +++ b/src/pages/tutorials/java-amqp-qpid-jms1/topic-to-queue-mapping.md @@ -26,7 +26,7 @@ If you have a durable queue named “Q”, it will receive messages published di JMS is a standard programmatic interface with a design goal of being messaging middleware agnostic. As such, the JMS interface does not provide a way for applications to directly take advantage of the Solace Topic to Queue Mapping feature. However JMS applications wishing to take advantage of this Solace feature have a few options. -One option is to use a management interface to administratively configure the topic to queue mapping, by adding topic subscriptions to the queue. This can either be done through the CLI or PubSub+ Manager application; or the SEMP programmatic management API. The SEMP API enables applications to fully configure Solace messaging. Applications can use this API by logging into the Solace message router using a Message-VPN admin account. This concept is introduced in the [Technology – Messaging Platform Features](https://solace.com/products/tech/) and further details are available in the [Solace Message Router Product Documentation](https://docs.solace.com/SEMP/Using-Legacy-SEMP.htm). +One option is to use a management interface to administratively configure the topic to queue mapping, by adding topic subscriptions to the queue. This can either be done through the CLI or Broker Manager application; or the SEMP programmatic management API. The SEMP API enables applications to fully configure Solace messaging. Applications can use this API by logging into the Solace message router using a Message-VPN admin account. This concept is introduced in the [Technology – Messaging Platform Features](https://solace.com/products/tech/) and further details are available in the [Solace Message Router Product Documentation](https://docs.solace.com/SEMP/Using-Legacy-SEMP.htm). ## Summary diff --git a/src/pages/tutorials/java-amqp-qpid-jms2/durable-topic-subscriber.md b/src/pages/tutorials/java-amqp-qpid-jms2/durable-topic-subscriber.md index 290262c..eb512d3 100644 --- a/src/pages/tutorials/java-amqp-qpid-jms2/durable-topic-subscriber.md +++ b/src/pages/tutorials/java-amqp-qpid-jms2/durable-topic-subscriber.md @@ -22,9 +22,9 @@ no consumer associated with it. To create a durable subscription, you must first create a JMS connection as with all JMS samples. See the [publish/subscribe tutorial](../publish-subscribe/) for more details if you need. -A durable subscription requires that you create a durable consumer given a subscription name and topic. The subscription name will be the name used for the Durable Topic Endpoint in the Solace PubSub+ messaging service and the topic name is what will attract the messages you wish to receive. +A durable subscription requires that you create a durable consumer given a subscription name and topic. The subscription name will be the name used for the Durable Topic Endpoint in the Solace Solace messaging service and the topic name is what will attract the messages you wish to receive. -One aspect that is unusual with Qpid JMS is that a client ID is required to create a durable consumer. Therefore, you must set this on the context. Keep in mind that client IDs must be unique within the Solace PubSub+ messaging service. +One aspect that is unusual with Qpid JMS is that a client ID is required to create a durable consumer. Therefore, you must set this on the context. Keep in mind that client IDs must be unique within the Solace Solace messaging service. The following code snippet outlines this. diff --git a/src/pages/tutorials/java-amqp-qpid-jms2/topic-to-queue-mapping.md b/src/pages/tutorials/java-amqp-qpid-jms2/topic-to-queue-mapping.md index cf9e6a5..f677ff3 100644 --- a/src/pages/tutorials/java-amqp-qpid-jms2/topic-to-queue-mapping.md +++ b/src/pages/tutorials/java-amqp-qpid-jms2/topic-to-queue-mapping.md @@ -26,7 +26,7 @@ If you have a durable queue named “Q”, it will receive messages published di JMS is a standard programmatic interface with a design goal of being messaging middleware agnostic. As such, the JMS interface does not provide a way for applications to directly take advantage of the Solace Topic to Queue Mapping feature. However JMS applications wishing to take advantage of this Solace feature have a few options. -One option is to use a management interface to administratively configure the topic to queue mapping, by adding topic subscriptions to the queue. This can either be done through the CLI or PubSub+ Manager application; or the SEMP programmatic management API. The SEMP API enables applications to fully configure Solace messaging. Applications can use this API by logging into Solace messaging using a Message-VPN admin account. This concept is introduced in the [Technology – Messaging Platform Features](https://solace.com/products/tech/) and further details are available in the [Solace Message Router Product Documentation](https://docs.solace.com/SEMP/Using-Legacy-SEMP.htm). +One option is to use a management interface to administratively configure the topic to queue mapping, by adding topic subscriptions to the queue. This can either be done through the CLI or Broker Manager application; or the SEMP programmatic management API. The SEMP API enables applications to fully configure Solace messaging. Applications can use this API by logging into Solace messaging using a Message-VPN admin account. This concept is introduced in the [Technology – Messaging Platform Features](https://solace.com/products/tech/) and further details are available in the [Solace Message Router Product Documentation](https://docs.solace.com/SEMP/Using-Legacy-SEMP.htm). ## Summary diff --git a/src/pages/tutorials/java-mqtt-paho/publish-subscribe.md b/src/pages/tutorials/java-mqtt-paho/publish-subscribe.md index 01f8f61..9a7b6b2 100644 --- a/src/pages/tutorials/java-mqtt-paho/publish-subscribe.md +++ b/src/pages/tutorials/java-mqtt-paho/publish-subscribe.md @@ -62,7 +62,7 @@ mqttClient.connect(connOpts); A MQTT client can maintain state information between sessions. The state information is used to ensure delivery and receipt of messages, and include subscriptions created by an MQTT client. This tutorial sets the "clean session" flag to true, via the `MqttConnectOptions` class, to clear the state information after each session disconnect. -At this point your client is connected to the Solace messaging. You can use PubSub+ Manager to view the client connection and related details. +At this point your client is connected to the Solace messaging. You can use Broker Manager to view the client connection and related details. ## Receive a message diff --git a/src/pages/tutorials/java/_howtos.yml b/src/pages/tutorials/java/_howtos.yml index aa53f7c..2656d57 100644 --- a/src/pages/tutorials/java/_howtos.yml +++ b/src/pages/tutorials/java/_howtos.yml @@ -7,8 +7,8 @@ - title: Access API Metrics description: Sample code showing how to access API metrics link: https://github.com/SolaceSamples/solace-samples-java/blob/main/src/main/java/com/solace/samples/java/snippets/HowToAccessApiMetrics.java -- title: Access PubSub+ Service - description: Sample code showing how to access PubSub+ service +- title: Access Solace Service + description: Sample code showing how to access Solace service link: https://github.com/SolaceSamples/solace-samples-java/blob/main/src/main/java/com/solace/samples/java/snippets/HowToAccessPubSubPlusService.java - title: Configure Authentication description: Sample code showing how to configure authentication diff --git a/src/pages/tutorials/javarto/publish-subscribe.md b/src/pages/tutorials/javarto/publish-subscribe.md index c67175a..d17f4ed 100644 --- a/src/pages/tutorials/javarto/publish-subscribe.md +++ b/src/pages/tutorials/javarto/publish-subscribe.md @@ -136,7 +136,7 @@ sessionHandle.connect(); Similar to the creating a Context, a new instance of `SessionHandle` must be created first and then allocated using the previously created `contextHandle` instance. The bounded `SessionHandle`, session properties, the message callback, and the session callback functions are passed as parameters. The final call to `SessionHandle.connect` establishes the connection to the Solace message router which makes the session ready for use. -At this point your client is connected to the Solace message router. You can use PubSub+ Manager to view the client connection and related details. +At this point your client is connected to the Solace message router. You can use Broker Manager to view the client connection and related details. ## Receiving a message diff --git a/src/pages/tutorials/javascript/confirmed-delivery.md b/src/pages/tutorials/javascript/confirmed-delivery.md index 9ccc90b..08e7b21 100644 --- a/src/pages/tutorials/javascript/confirmed-delivery.md +++ b/src/pages/tutorials/javascript/confirmed-delivery.md @@ -46,7 +46,7 @@ const correlationKey = { ## Implementing Confirmed Delivery -This tutorial’s sample application will send guaranteed messages to a durable queue pre-configured on the Solace message router. You can use Solace PubSub+ Manager, SEMP or CLI to create a durable queue. This tutorial assumes that the queue named `tutorial/queue` has been created. +This tutorial’s sample application will send guaranteed messages to a durable queue pre-configured on the Solace message router. You can use Broker Manager, SEMP or CLI to create a durable queue. This tutorial assumes that the queue named `tutorial/queue` has been created. The structure of the code is similar to the Persistence with Queues tutorial's Queue Producer with the additions of several messages being sent and the acknowledgements logged for each message that comes back from the Solace message router. diff --git a/src/pages/tutorials/javascript/dte-consumer.md b/src/pages/tutorials/javascript/dte-consumer.md index da7887c..98bf217 100644 --- a/src/pages/tutorials/javascript/dte-consumer.md +++ b/src/pages/tutorials/javascript/dte-consumer.md @@ -17,7 +17,7 @@ The example code builds on the Consumer in the [QueueConsumer](../persistence-wi A topic endpoint attracts messages published to a topic for which the topic endpoint has a matching topic subscription. The topic subscription for the topic endpoint is specified in the client request to bind a Flow to that topic endpoint. -Durable queues and topic endpoints are provisioned objects on the message broker that have a life span independent of a particular client session. They also survive a message broker restart and are preserved as part of the message broker configuration for backup and restoration purposes. Administrators can provision durable queues and topic endpoints through the Solace CLI, SEMP, or PubSub+ Manager; client applications can dynamically provision durable endpoints through the Solace messaging APIs. +Durable queues and topic endpoints are provisioned objects on the message broker that have a life span independent of a particular client session. They also survive a message broker restart and are preserved as part of the message broker configuration for backup and restoration purposes. Administrators can provision durable queues and topic endpoints through the Solace CLI, SEMP, or Broker Manager; client applications can dynamically provision durable endpoints through the Solace messaging APIs. ## Prerequisite diff --git a/src/pages/tutorials/javascript/message-replay.md b/src/pages/tutorials/javascript/message-replay.md index 9207b92..32f7411 100644 --- a/src/pages/tutorials/javascript/message-replay.md +++ b/src/pages/tutorials/javascript/message-replay.md @@ -25,11 +25,11 @@ It's important to note that when initiating replay, the message broker will disc ## Prerequisite -A replay log must be created on the message broker for the Message VPN using [Message Replay CLI configuration](https://docs.solace.com/Configuring-and-Managing/Msg-Replay-Config.htm) or using [Solace PubSub+ Manager](https://docs.solace.com/Solace-PubSub-Manager/PubSub-Manager-Overview.htm) administration console. Another option for configuration is to use the [SEMP API](https://docs.solace.com/SEMP/Using-SEMP.htm). +A replay log must be created on the message broker for the Message VPN using [Message Replay CLI configuration](https://docs.solace.com/Configuring-and-Managing/Msg-Replay-Config.htm) or using [Broker Manager](https://docs.solace.com/Solace-PubSub-Manager/PubSub-Manager-Overview.htm) administration console. Another option for configuration is to use the [SEMP API](https://docs.solace.com/SEMP/Using-SEMP.htm). NOTE: Message Replay is supported on Solace PubSub+ 3530 and 3560 appliances running release 9.1 and greater, and on the Solace PubSub+ software message broker running release 9.1 and greater. Solace JavaScript API version 10.2.1 or later is required. -![Screenshot: Configuring Replay Log using Solace PubSub+ Manager](../../../images/screenshots/config-replay-log.png) +![Screenshot: Configuring Replay Log using Broker Manager](../../../images/screenshots/config-replay-log.png) ## Code @@ -167,7 +167,7 @@ You can now run this sample and observe the following, particularly the "message 3. Now start a replay from the message broker. The "MessageReplay" flow event handler monitors for a replay start event. When the message broker initiates a replay, the flow will see a DOWN_ERROR event with cause REPLAY_STARTED. This means an administrator has initiated a replay, and the application must destroy and re-create the flow to receive the replayed messages. This will replay all logged messages including the live one published in step 2. -![Screenshot: Initiating Replay using Solace PubSub+ Manager](../../../images/screenshots/initiate-replay.png) +![Screenshot: Initiating Replay using Broker Manager](../../../images/screenshots/initiate-replay.png) ## Learn More diff --git a/src/pages/tutorials/javascript/persistence-with-queues.md b/src/pages/tutorials/javascript/persistence-with-queues.md index fd59866..312da4d 100644 --- a/src/pages/tutorials/javascript/persistence-with-queues.md +++ b/src/pages/tutorials/javascript/persistence-with-queues.md @@ -37,7 +37,7 @@ The goal of this tutorial is to understand the following: A difference with the publish/subscribe tutorial is that for guaranteed messaging a physical endpoint resource – a durable queue, associated with the queue destination – needs to be created on the Solace message router, which will persist the messages until consumed. -You can use Solace PubSub+ Manager, SEMP or CLI to create a durable queue. This tutorial assumes that the queue named `tutorial/queue` has been created. Ensure the queue is enabled for both Incoming and Outgoing messages and set the Permission to at least "Consume". +You can use Broker Manager, SEMP or CLI to create a durable queue. This tutorial assumes that the queue named `tutorial/queue` has been created. Ensure the queue is enabled for both Incoming and Outgoing messages and set the Permission to at least "Consume". `markdown:loadAndInitSolaceApi.md` @@ -74,7 +74,7 @@ try { } ``` -At this point your JavaScript application is connected as a client to the Solace message router. You can use PubSub+ Manager to view this client connection and related details. +At this point your JavaScript application is connected as a client to the Solace message router. You can use Broker Manager to view this client connection and related details. #### Session Events diff --git a/src/pages/tutorials/javascript/publish-subscribe.md b/src/pages/tutorials/javascript/publish-subscribe.md index 8fedd3f..2c9ac3a 100644 --- a/src/pages/tutorials/javascript/publish-subscribe.md +++ b/src/pages/tutorials/javascript/publish-subscribe.md @@ -67,7 +67,7 @@ try { subscriber.log(error.toString()); } ``` -At this point your browser is connected as a client to the Solace message router. You can use PubSub+ Manager to view this client connection and related details. +At this point your browser is connected as a client to the Solace message router. You can use Broker Manager to view this client connection and related details. ## Session Events diff --git a/src/pages/tutorials/jcsmp/active-flow-indication.md b/src/pages/tutorials/jcsmp/active-flow-indication.md index 01f3b60..2be6a69 100644 --- a/src/pages/tutorials/jcsmp/active-flow-indication.md +++ b/src/pages/tutorials/jcsmp/active-flow-indication.md @@ -23,7 +23,7 @@ Using the Active Flow Indication, a client application can learn if it is the pr The [Client Profile](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm) must be configured to [allow receiving guaranteed messages](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm#Allow-G-Msg-Receives). -NOTE: This is the default configuration in PubSub+ Cloud messaging services. +NOTE: This is the default configuration in Solace Cloud messaging services. ## Code diff --git a/src/pages/tutorials/jcsmp/browsing-queues.md b/src/pages/tutorials/jcsmp/browsing-queues.md index f220f35..e2c1472 100644 --- a/src/pages/tutorials/jcsmp/browsing-queues.md +++ b/src/pages/tutorials/jcsmp/browsing-queues.md @@ -21,7 +21,7 @@ A Browser could be used by an application to pre-screen messages by detecting me The [Client Profile](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm) must be configured to [allow receiving guaranteed messages](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm#Allow-G-Msg-Receives) -NOTE: This is the default configuration in PubSub+ Cloud messaging services. +NOTE: This is the default configuration in Solace Cloud messaging services. ## Code diff --git a/src/pages/tutorials/jcsmp/message-replay.md b/src/pages/tutorials/jcsmp/message-replay.md index 0428476..786d65a 100644 --- a/src/pages/tutorials/jcsmp/message-replay.md +++ b/src/pages/tutorials/jcsmp/message-replay.md @@ -23,11 +23,11 @@ It's important to note that when initiating replay, the message broker will disc ## Prerequisite -A replay log must be created on the message broker for the Message VPN using [Message Replay CLI configuration](https://docs.solace.com/Configuring-and-Managing/Msg-Replay-Config.htm) or using [Solace PubSub+ Manager](https://docs.solace.com/Solace-PubSub-Manager/PubSub-Manager-Overview.htm) administration console. Another option for configuration is to use the [SEMP API](https://docs.solace.com/SEMP/Using-SEMP.htm). +A replay log must be created on the message broker for the Message VPN using [Message Replay CLI configuration](https://docs.solace.com/Configuring-and-Managing/Msg-Replay-Config.htm) or using [Broker Manager](https://docs.solace.com/Solace-PubSub-Manager/PubSub-Manager-Overview.htm) administration console. Another option for configuration is to use the [SEMP API](https://docs.solace.com/SEMP/Using-SEMP.htm). NOTE: Message Replay is supported on Solace PubSub+ 3530 and 3560 appliances running release 9.1 and greater, and on the Solace PubSub+ software message broker running release 9.1 and greater. Solace Java API version 10.5 or later is required. -![Screenshot: Configuring Replay Log using Solace PubSub+ Manager](../../../images/screenshots/config-replay-log.png) +![Screenshot: Configuring Replay Log using Broker Manager](../../../images/screenshots/config-replay-log.png) ## Code @@ -220,7 +220,7 @@ $ ./build/staged/bin/queueProducer @ [ 3. Now start a replay from the message broker. The flow event handler monitors for a replay start event. When the message broker initiates a replay, the flow will see a DOWN_ERROR event with cause 'Replay Started'. This means an administrator has initiated a replay, and the application must destroy and re-create the flow to receive the replayed messages. This will replay all logged messages including the live one published in step 2. -![Screenshot: Initiating Replay using Solace PubSub+ Manager](../../../images/screenshots/initiate-replay.png) +![Screenshot: Initiating Replay using Broker Manager](../../../images/screenshots/initiate-replay.png) ## Learn More * Related Source Code: [MessageReplay.java](https://github.com/SolaceSamples/solace-samples-java-jcsmp/blob/master/src/main/java/com/solace/samples/jcsmp/features/MessageReplay.java) diff --git a/src/pages/tutorials/jcsmp/message-selectors.md b/src/pages/tutorials/jcsmp/message-selectors.md index 94014a3..2b1895b 100644 --- a/src/pages/tutorials/jcsmp/message-selectors.md +++ b/src/pages/tutorials/jcsmp/message-selectors.md @@ -21,7 +21,7 @@ When a selector is used, a client only receives a message if the selector evalua The [Client Profile](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm) must be configured to [allow receiving guaranteed messages](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm#Allow-G-Msg-Receives). -NOTE: This is the default configuration in PubSub+ Cloud messaging services. +NOTE: This is the default configuration in Solace Cloud messaging services. ## Code diff --git a/src/pages/tutorials/jcsmp/persistence-with-queues.md b/src/pages/tutorials/jcsmp/persistence-with-queues.md index 221401b..630aee3 100644 --- a/src/pages/tutorials/jcsmp/persistence-with-queues.md +++ b/src/pages/tutorials/jcsmp/persistence-with-queues.md @@ -52,7 +52,7 @@ Durable endpoints are not auto created on Solace message routers. However there Using the Solace APIs to provision an endpoint can be a convenient way of getting started quickly without needing to become familiar with the management interface. This is why it is used in this tutorial. However it should be noted that the management interface provides more options to control the queue properties. So generally it becomes the preferred method over time. -Provisioning an endpoint through the API requires the “Guaranteed Endpoint Create” permission in the client-profile. You can confirm this is enabled by looking at the client profile in PubSub+ Manager. If it is correctly set you will see the following: +Provisioning an endpoint through the API requires the “Guaranteed Endpoint Create” permission in the client-profile. You can confirm this is enabled by looking at the client profile in Broker Manager. If it is correctly set you will see the following: ![Screenshot: Provisioning an endpoint through the API](../../../images/screenshots/persistence-tutoral-image-3.png) diff --git a/src/pages/tutorials/jcsmp/publish-subscribe.md b/src/pages/tutorials/jcsmp/publish-subscribe.md index 25c0e96..b4b6fe6 100644 --- a/src/pages/tutorials/jcsmp/publish-subscribe.md +++ b/src/pages/tutorials/jcsmp/publish-subscribe.md @@ -42,7 +42,7 @@ final JCSMPSession session = JCSMPFactory.onlyInstance().createSession(propertie session.connect(); ``` -At this point your client is connected to the Solace message router. You can use PubSub+ Manager to view the client connection and related details. +At this point your client is connected to the Solace message router. You can use Broker Manager to view the client connection and related details. ## Receiving a message diff --git a/src/pages/tutorials/jcsmp/schema-registry-serdes.md b/src/pages/tutorials/jcsmp/schema-registry-serdes.md index bb9c154..f90761b 100644 --- a/src/pages/tutorials/jcsmp/schema-registry-serdes.md +++ b/src/pages/tutorials/jcsmp/schema-registry-serdes.md @@ -31,7 +31,7 @@ The Schema Registry SERDES library supports both JSON Schema and Apache Avro for ## Prerequisites -* A Solace PubSub+ broker (version 10.5 or later) with Schema Registry deployed +* A Solace Event Broker (version 10.5 or later) with Schema Registry deployed * Access to the Schema Registry with appropriate credentials * JSON Schema files uploaded to the Schema Registry * There must be a suitable [Client Profile](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm) configured on your broker diff --git a/src/pages/tutorials/jcsmp/topic-to-queue-mapping.md b/src/pages/tutorials/jcsmp/topic-to-queue-mapping.md index 1ddee14..ed88051 100644 --- a/src/pages/tutorials/jcsmp/topic-to-queue-mapping.md +++ b/src/pages/tutorials/jcsmp/topic-to-queue-mapping.md @@ -114,7 +114,7 @@ for (int i = 1; i <= count; i++) { } ``` -These messages are now on your queue. You can validate this through PubSub+ Manager by inspecting the queue. Now receive the messages using a flow consumer as outlined in detail in previous tutorials. +These messages are now on your queue. You can validate this through Broker Manager by inspecting the queue. Now receive the messages using a flow consumer as outlined in detail in previous tutorials. ```java ConsumerFlowProperties flow_prop = new ConsumerFlowProperties(); diff --git a/src/pages/tutorials/jcsmp/transactions.md b/src/pages/tutorials/jcsmp/transactions.md index 149c404..51a5b22 100644 --- a/src/pages/tutorials/jcsmp/transactions.md +++ b/src/pages/tutorials/jcsmp/transactions.md @@ -23,7 +23,7 @@ This feature can be used to guarantee that a message is not removed from the mes The [Client Profile](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm) must be configured to [allow transacted sessions](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm#Allow-Trans-Sess). -NOTE: This is the default configuration in PubSub+ Cloud messaging services. +NOTE: This is the default configuration in Solace Cloud messaging services. ## Code diff --git a/src/pages/tutorials/jcsmp/ttl-and-dmq.md b/src/pages/tutorials/jcsmp/ttl-and-dmq.md index 15c0edf..8a66991 100644 --- a/src/pages/tutorials/jcsmp/ttl-and-dmq.md +++ b/src/pages/tutorials/jcsmp/ttl-and-dmq.md @@ -23,7 +23,7 @@ This feature is very useful in real-time applications where receiving a stale me The [Client Profile](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm) must be configured to [allow receiving guaranteed messages](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm#Allow-G-Msg-Receives) and [allow creating guaranteed messages](https://docs.solace.com/Configuring-and-Managing/Configuring-Client-Profiles.htm#Allow-G-Msg-Creates). -NOTE: This is the default configuration in PubSub+ Cloud messaging services. +NOTE: This is the default configuration in Solace Cloud messaging services. ## Code diff --git a/src/pages/tutorials/jms/publish-subscribe.md b/src/pages/tutorials/jms/publish-subscribe.md index 87defcb..560dfe6 100644 --- a/src/pages/tutorials/jms/publish-subscribe.md +++ b/src/pages/tutorials/jms/publish-subscribe.md @@ -81,7 +81,7 @@ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); This tutorial uses an auto acknowledgement session. This is the simplest to use. However, it often makes sense to customize the acknowledgement mode in JMS to suit your application needs. Solace supports all of the JMS acknowledgement modes and introduces an extension which allows applications to individually acknowledge each message which we believe is a significant improvement of the behaviour of the default JMS client acknowledgement. Learn more in the [Solace JMS Documentation - Managing Sessions](https://docs.solace.com/Solace-JMS-API/Managing-Sessions.htm). -At this point your client is connected to Solace messaging. You can use PubSub+ Manager to view the client connection and related details. +At this point your client is connected to Solace messaging. You can use Broker Manager to view the client connection and related details. ## Receiving a message diff --git a/src/pages/tutorials/jms/topic-to-queue-mapping.md b/src/pages/tutorials/jms/topic-to-queue-mapping.md index a31ec6f..b451c39 100644 --- a/src/pages/tutorials/jms/topic-to-queue-mapping.md +++ b/src/pages/tutorials/jms/topic-to-queue-mapping.md @@ -22,7 +22,7 @@ If you have a durable queue named “Q”, it will receive messages published di JMS is a standard programmatic interface with a design goal of being messaging middleware agnostic. As such, the JMS interface does not provide a way for applications to directly take advantage of the Solace Topic to Queue Mapping feature. However JMS applications wishing to take advantage of this Solace feature have a few options. -One option is to use a management interface to administratively configure the topic to queue mapping, by adding topic subscriptions to the queue. This can either be done through the CLI or PubSub+ Manager application; or the SEMP programmatic management API. The SEMP API enables applications to fully configure Solace message routers. Applications can use this API by logging in to the Solace message router using a Message-VPN admin account. This concept is introduced in the [Technology – Messaging Platform Features](https://solace.com/products/tech/) and further details are available in the [Solace Message Router Product Documentation](https://docs.solace.com/SEMP/Using-Legacy-SEMP.htm). +One option is to use a management interface to administratively configure the topic to queue mapping, by adding topic subscriptions to the queue. This can either be done through the CLI or Broker Manager application; or the SEMP programmatic management API. The SEMP API enables applications to fully configure Solace message routers. Applications can use this API by logging in to the Solace message router using a Message-VPN admin account. This concept is introduced in the [Technology – Messaging Platform Features](https://solace.com/products/tech/) and further details are available in the [Solace Message Router Product Documentation](https://docs.solace.com/SEMP/Using-Legacy-SEMP.htm). A second option is to consider using a Solace Java API session directly for this part of your application. This is outlined in the [Java API version of this tutorial](/jcsmp/topic-to-queue-mapping/). This would involve opening a second client connection using a Java API Session and then mapping the required topics onto the desired queue. Then this Java API session can be closed. diff --git a/src/pages/tutorials/jms/using-jndi.md b/src/pages/tutorials/jms/using-jndi.md index 5ee02c2..a9e5c20 100644 --- a/src/pages/tutorials/jms/using-jndi.md +++ b/src/pages/tutorials/jms/using-jndi.md @@ -88,7 +88,7 @@ There are several ways to manage Solace messaging including: * Command Line Interface (CLI) * the Solace Element Management Protocol (SEMP) RESTful API -* the GUI-based PubSub+ Manager application. +* the GUI-based Broker Manager application. For simplicity in this tutorial, the following CLI script is provided. It will do the following: @@ -157,7 +157,7 @@ Password: See the [Solace Documentation - Solace Router CLI](https://docs.solace.com/Solace-CLI/Using-Solace-CLI.htm) for more details. -To learn how to use the SEMP API, refer to the [Solace Element Management Protocol (SEMP) tutorials](https://docs.solace.com/SEMP/Using-SEMP.htm). To learn about the PubSub+ Manager application, refer to the [Solace Documentation - PubSub+ Manager Overview](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm) and the application's online Help. +To learn how to use the SEMP API, refer to the [Solace Element Management Protocol (SEMP) tutorials](https://docs.solace.com/SEMP/Using-SEMP.htm). To learn about the Broker Manager application, refer to the [Solace Documentation - Broker Manager Overview](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm) and the application's online Help. ## Step 2: Obtaining a JMS ConnectionFactory object using JNDI diff --git a/src/pages/tutorials/nodejs-amqp/topic-to-queue-mapping.md b/src/pages/tutorials/nodejs-amqp/topic-to-queue-mapping.md index 1041c21..73695d6 100644 --- a/src/pages/tutorials/nodejs-amqp/topic-to-queue-mapping.md +++ b/src/pages/tutorials/nodejs-amqp/topic-to-queue-mapping.md @@ -24,7 +24,7 @@ If you have a durable queue named “Q”, it will receive messages published di AMQP is a standard protocol with a design goal of being messaging middleware agnostic. As such, it does not provide a way for applications to directly take advantage of the Solace Topic to Queue Mapping feature. -However Node.js applications wishing to take advantage of this Solace feature can use a management interface to administratively configure the topic to queue mapping, by adding topic subscriptions to the queue. This can either be done through the CLI or PubSub+ Manager application; or the SEMP programmatic management API. The SEMP API enables applications to fully configure Solace messaging. +However Node.js applications wishing to take advantage of this Solace feature can use a management interface to administratively configure the topic to queue mapping, by adding topic subscriptions to the queue. This can either be done through the CLI or Broker Manager application; or the SEMP programmatic management API. The SEMP API enables applications to fully configure Solace messaging. Applications can use this API by logging into Solace messaging using a Message-VPN admin account. This concept is introduced in the [Technology – Messaging Platform Features](https://solace.com/products/tech/) and further details are available in the [Solace Message Router Product Documentation](https://docs.solace.com/SEMP/Using-SEMP.htm). diff --git a/src/pages/tutorials/nodejs/confirmed-delivery.md b/src/pages/tutorials/nodejs/confirmed-delivery.md index 55ce175..dbedc7e 100644 --- a/src/pages/tutorials/nodejs/confirmed-delivery.md +++ b/src/pages/tutorials/nodejs/confirmed-delivery.md @@ -46,7 +46,7 @@ const correlationKey = { ## Implementing Confirmed Delivery -This tutorial’s sample application will send guaranteed messages to a durable queue pre-configured on the Solace message router. You can use Solace PubSub+ Manager, SEMP or CLI to create a durable queue. This tutorial assumes that the queue named `tutorial/queue` has been created. +This tutorial’s sample application will send guaranteed messages to a durable queue pre-configured on the Solace message router. You can use Broker Manager, SEMP or CLI to create a durable queue. This tutorial assumes that the queue named `tutorial/queue` has been created. The structure of the code is similar to the Persistence with Queues tutorial's Queue Producer with the additions of several messages being sent and the acknowledgements logged for each message that comes back from the Solace message router. diff --git a/src/pages/tutorials/nodejs/persistence-with-queues.md b/src/pages/tutorials/nodejs/persistence-with-queues.md index 828852e..7ec0dd6 100644 --- a/src/pages/tutorials/nodejs/persistence-with-queues.md +++ b/src/pages/tutorials/nodejs/persistence-with-queues.md @@ -32,7 +32,7 @@ The goal of this tutorial is to understand the following: A difference with the publish/subscribe tutorial is that for guaranteed messaging a physical endpoint resource – a durable queue, associated with the queue destination – needs to be created on the Solace message router, which will persist the messages until consumed. -You can use Solace PubSub+ Manager, SEMP or CLI to create a durable queue. This tutorial assumes that the queue named `tutorial/queue` has been created. Ensure the queue is enabled for both Incoming and Outgoing messages and set the Permission to at least "Consume". +You can use Broker Manager, SEMP or CLI to create a durable queue. This tutorial assumes that the queue named `tutorial/queue` has been created. Ensure the queue is enabled for both Incoming and Outgoing messages and set the Permission to at least "Consume". `markdown:loadAndInitSolaceApi.md` @@ -69,7 +69,7 @@ try { } ``` -At this point your Node.js application is connected as a client to the Solace message router. You can use PubSub+ Manager to view this client connection and related details. +At this point your Node.js application is connected as a client to the Solace message router. You can use Broker Manager to view this client connection and related details. #### Session Events diff --git a/src/pages/tutorials/nodejs/publish-subscribe.md b/src/pages/tutorials/nodejs/publish-subscribe.md index 6216bcf..7372bfa 100644 --- a/src/pages/tutorials/nodejs/publish-subscribe.md +++ b/src/pages/tutorials/nodejs/publish-subscribe.md @@ -65,7 +65,7 @@ try { } ``` -At this point your Node.js application is connected as a client to the Solace message router. You can use PubSub+ Manager to view this client connection and related details. +At this point your Node.js application is connected as a client to the Solace message router. You can use Broker Manager to view this client connection and related details. ## Session Events diff --git a/src/pages/tutorials/nodejs/topic-to-queue-mapping.md b/src/pages/tutorials/nodejs/topic-to-queue-mapping.md index 5c1b16c..26ac786 100644 --- a/src/pages/tutorials/nodejs/topic-to-queue-mapping.md +++ b/src/pages/tutorials/nodejs/topic-to-queue-mapping.md @@ -266,9 +266,9 @@ The following is the output of the tutorial’s `GuaranteedConsumer.js` applicat ```bash $ node GuaranteedConsumer.js ws://192.168.133.64 testuser@default passw [16:08:25] *** Consumer to queue "tutorial/queue" is ready to connect *** -[16:08:25] Connecting to Solace PubSub+ Event Broker using url: ws://localhost:8008 +[16:08:25] Connecting to Solace Event Broker using url: ws://localhost:8008 [16:08:25] Client username: default -[16:08:25] Solace PubSub+ Event Broker VPN name: default +[16:08:25] Solace Event Broker VPN name: default [16:08:25] Press Ctrl-C to exit [16:08:25] === Successfully connected and ready to start the message subscriber. === [16:08:25] Starting subscriber for queue: tutorial/queue @@ -291,14 +291,14 @@ The following is the output of the tutorial’s `GuaranteedPublisher.js` applica ```bash $ node GuaranteedPublisher.js ws://192.168.133.64 testuser@default passw [16:09:20] *** publisher to topic "solace/samples/nodejs/pers" is ready to connect *** -[16:09:20] Connecting to Solace PubSub+ Event Broker using url: ws://localhost:8008 +[16:09:20] Connecting to Solace Event Broker using url: ws://localhost:8008 [16:09:20] Client username: default -[16:09:20] Solace PubSub+ Event Broker VPN name: default +[16:09:20] Solace Event Broker VPN name: default [16:09:20] === Successfully connected and ready to publish messages. === [16:09:20] Publishing message "Sample Message" to topic "solace/samples/nodejs/pers/1675939160521"... [16:09:20] Message sent with correlation key: 1675939160521 -[16:09:21] Delivery of message to PubSub+ Broker with correlation key = 1675939160521 confirmed. -[16:09:21] Disconnecting from Solace PubSub+ Event Broker... +[16:09:21] Delivery of message to Solace Event Broker with correlation key = 1675939160521 confirmed. +[16:09:21] Disconnecting from Solace Event Broker... [16:09:21] Disconnected. ``` diff --git a/src/pages/tutorials/openmama/hello-world.md b/src/pages/tutorials/openmama/hello-world.md index e05cc1a..a4da1c6 100644 --- a/src/pages/tutorials/openmama/hello-world.md +++ b/src/pages/tutorials/openmama/hello-world.md @@ -275,7 +275,7 @@ int main(int argc, const char** argv) } ``` -Now our program runs without any errors and it successfully connects to **Solace messaging**. If you sleep the main thread before the `mamaTransport_destroy(transport)` call, you can see use **PubSub+ Manager** to see this program as a client connected to **Solace messaging**. +Now our program runs without any errors and it successfully connects to **Solace messaging**. If you sleep the main thread before the `mamaTransport_destroy(transport)` call, you can see use **Broker Manager** to see this program as a client connected to **Solace messaging**. #### Create publisher diff --git a/src/pages/tutorials/rest-messaging/publish-subscribe.md b/src/pages/tutorials/rest-messaging/publish-subscribe.md index 30b8a58..155fbfd 100644 --- a/src/pages/tutorials/rest-messaging/publish-subscribe.md +++ b/src/pages/tutorials/rest-messaging/publish-subscribe.md @@ -1,7 +1,7 @@ --- layout: tutorials title: Publish / Subscribe -summary: Learn how to pub/sub using Solace REST Messaging with a Solace PubSub+ Broker. +summary: Learn how to pub/sub using Solace REST Messaging with a Solace Event Broker. icon: I_dev_P+S.svg links: - label: feedback @@ -15,8 +15,8 @@ This tutorial will introduce you to the fundamentals of the Solace REST messagin This tutorial assumes the following: * You are familiar with Solace [core concepts](https://docs.solace.com/PubSub-Basics/Core-Concepts.htm). -* You have access to a running Solace PubSub+ Broker with the following configuration: - * Connectivity information for a Solace PubSub+ Broker +* You have access to a running Solace Event Broker with the following configuration: + * Connectivity information for a Solace Event Broker * Enabled client username and password * Enabled guaranteed messaging support (needed for REST consumers) * Client-profile enabled with guaranteed messaging permissions @@ -36,7 +36,7 @@ The goal of this tutorial is to demonstrate the most basic messaging interaction ## Solace REST Messaging API Introduction -As outlined in the [Online REST Messaging Documentation](https://docs.solace.com/Open-APIs-Protocols/REST-get-start.htm), the REST Messaging API enable users to send messages to, and asynchronously receive messages from a Solace PubSub+ Broker over HTTP using a RESTful API. +As outlined in the [Online REST Messaging Documentation](https://docs.solace.com/Open-APIs-Protocols/REST-get-start.htm), the REST Messaging API enable users to send messages to, and asynchronously receive messages from a Solace Event Broker over HTTP using a RESTful API. The Solace API uses HTTP POST requests to allow clients to publish message to a Message VPN. The Solace API follows the asynchronous notification pattern and uses an HTTP POST from a Message VPN to the client to deliver messages. This means that pub and sub messages are sent on different HTTP connections than they are received as shown in the following figure. @@ -61,14 +61,14 @@ There is no API to obtain. The Solace REST messaging API is a wireline RESTful H ## Receiving a message -Since Solace PubSub+ is a multi-protocol translation broker, messages can be received using any of the other Solace APIs (e.g., JMS or MQTT) which would be a lot less complicated to use when compared to REST Deliver point based setup. +Since Solace is a multi-protocol translation broker, messages can be received using any of the other Solace APIs (e.g., JMS or MQTT) which would be a lot less complicated to use when compared to REST Deliver point based setup. In this tutorial will show how to setup a subscriber to receive published messages. ![Diagram: Receiving a Message](../../../images/diagrams/pub-sub-receiving-message-300x134.png) -On the consumer side, the Solace REST messaging API depends on a guaranteed messaging queue. As such it is a requirement for REST consumers that Solace PubSub+ Broker support guaranteed messaging and have this feature configured as outlined in the [Assumptions](#Assumptions) section above. +On the consumer side, the Solace REST messaging API depends on a guaranteed messaging queue. As such it is a requirement for REST consumers that Solace Event Broker support guaranteed messaging and have this feature configured as outlined in the [Assumptions](#Assumptions) section above. In order to receive REST messages from Solace Message VPN, you must configure a Guaranteed messaging queue and a REST delivery point. The queue is used to attract messages to the consumer application. The REST delivery point is the Solace message router component that delivers the messages from the queue to the consumer application asynchronously through HTTP POST requests. This is explained in detail in the [REST Messaging Concepts](https://docs.solace.com/Open-APIs-Protocols/REST-get-start.htm). This tutorial will walk you through the required Solace Message VPN configuration required to create a queue and REST delivery point to connect to your REST consumer application. @@ -105,7 +105,7 @@ Server running at http://:/ Again in your environment, the RC\_HOST and RC\_PORT will be the host/IP and port that your server is listening on. For example http://49.210.148.187 :10000/ or with a public DNS name http://myhost.mydomain.com:10000 (for example). -If running Solace PubSub+ Broker locally, a “localhost” or a local DHCP IP for host name won’t work, since the PubSub+ Broker is usually run on a different subnet. You have to use your computer’s actual (local) IP address. +If running Solace Event Broker locally, a “localhost” or a local DHCP IP for host name won’t work, since the Solace Event Broker is usually run on a different subnet. You have to use your computer’s actual (local) IP address. **Note:** Even though this tutorial is illustrating how to publish direct messages, for REST delivery points, the messages are always consumed from a queue. Direct messages get promoted in the queue, and are delivered to the REST consumer as Guaranteed messages. For more information on this see the [Features – Topic Matching and Message Delivery Modes](https://docs.solace.com/PubSub-Basics/Topic-Matching-and-Delivery-Modes.htm). @@ -160,11 +160,11 @@ In the script below, update VPNNAME to match that of your Solace Message VPN, an The REST Delivery Point configuration can be affected on a Message VPN in different ways. Here is the list of options available for us. - [Option 1: Using PubSub+ Broker Manager](#Option-1-Using-PubSub-Broker-Manager) + [Option 1: Using Solace Event Broker Manager](#Option-1-Using-PubSub-Broker-Manager) [Option 2: Using SEMP and Postman](#Option-2-Using-SEMP-and-Postman) [Option 3: Using SEMP and curl](#Option-3-Using-SEMP-and-codecurlcode) [Option 4: Using Solace CLI](#Option-4-Using-Solace-CLI) -### Option 1: Using PubSub+ Broker Manager +### Option 1: Using Solace Event Broker Manager - Create a Queue by name **Q/rdp1/input** @@ -267,11 +267,11 @@ A final, configured RDP settings would look like this. ![RDP Configuration](../../../images/screenshots/brokerman-rdp-configured.png) -To know more about PubSub+ Broker Manager check out [PubSub+ Broker Manager overview](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm). +To know more about Solace Event Broker Manager check out [Solace Event Broker Manager overview](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm). ### Option 2: Using SEMP and Postman -Solace Element Management Protocol version 2 (SEMP v2) is a RESTful API that you can use to configure Solace PubSub+ event brokers. It complements Solace's CLI and PubSub+ Manager, and provides a programmable way to configure Solace PubSub+ event brokers. +Solace Element Management Protocol version 2 (SEMP v2) is a RESTful API that you can use to configure Solace event brokers. It complements Solace's CLI and Broker Manager, and provides a programmable way to configure Solace event brokers. 1. Download SEMP v2 specification @@ -302,7 +302,7 @@ Where the CLOUD_BROKER_HOST is the host name of where the Cloud Broker is runnin 4. Note the SEMP v2 URL and access credentials
    - **For PubSub+ Software Broker** - the SEMP requests can be posted to the following URL + **For Solace Event Broker Software Broker** - the SEMP requests can be posted to the following URL ``` http://:8080/SEMP/v2/config ``` @@ -313,7 +313,7 @@ Where the CLOUD_BROKER_HOST is the host name of where the Cloud Broker is runnin ![SEMP - Software Broker](../../../images/screenshots/enable-sempv2-software.png) - **For PubSub+ Cloud Broker** - select the Broker Service, Select the **Manage** tab and locate the *SEMP - REST API* section. Note the URL to SEMP spec + **For Solace Cloud Broker** - select the Broker Service, Select the **Manage** tab and locate the *SEMP - REST API* section. Note the URL to SEMP spec ``` https://CLOUD_BROKER_HOST:943/SEMP/v2/config ``` @@ -329,7 +329,7 @@ Where the CLOUD_BROKER_HOST is the host name of where the Cloud Broker is runnin
    5. Execute the following SEMP POST requests to create resources associated with REST Delivery Point.
    - The following steps demonstrate invoking SEMP REST API against a PubSub+ Cloud Broker as identified by the host CLOUD\_BROKER\_HOST and a Message VPN identified by VPN_NAME. For PubSub+ Software Broker, use the host on which the software Broker is running. + The following steps demonstrate invoking SEMP REST API against a Solace Cloud Broker as identified by the host CLOUD\_BROKER\_HOST and a Message VPN identified by VPN_NAME. For Solace Event Broker Software Broker, use the host on which the software Broker is running.
    Ensure that the REST requests are appropriately updated with user credentials and the APIs are invoked as POST requests. @@ -568,7 +568,7 @@ curl \ ### Option 4: Using Solace CLI -The Solace Command Line Interface (CLI) is a text-based, interactive shell for configuring and monitoring Solace event brokers (available for Solace PubSub+ Software and Appliance Brokers). It allows a user to perform event broker administration, configuration and provisioning, and network troubleshooting tasks. The CLI automatically starts after the event broker powers up. +The Solace Command Line Interface (CLI) is a text-based, interactive shell for configuring and monitoring Solace event brokers (available for Solace Event Broker Software and Appliance Brokers). It allows a user to perform event broker administration, configuration and provisioning, and network troubleshooting tasks. The CLI automatically starts after the event broker powers up. Reference guides to the Solace CLI can be found in these locations: [Appliance CLI Commands](https://docs.solace.com/Solace-CLI/CLI-Reference/APPL_CLI_Commands.html) and [Software Event Broker CLI Commands](https://docs.solace.com/Solace-CLI/CLI-Reference/VMR_CLI_Commands.html). @@ -628,7 +628,7 @@ Password: ``` BROKER_HOST is the host name where the Broker is running. -At this the REST delivery point is configured and should be operational and connected to your REST consumer application. You can verify this using PubSub+ Manager or through the following CLI command. +At this the REST delivery point is configured and should be operational and connected to your REST consumer application. You can verify this using Broker Manager or through the following CLI command. ``` solace(configure)# show message-vpn VPNNAME rest rest-delivery-point * @@ -675,7 +675,7 @@ To send a message you can use the following command. $ curl -X POST -d "Hello World REST" http://BROKER_HOST:BROKER_REST_PORT/solace/samples/rest -H "content-type: text/plain" ``` -You will need to update HOST and PORT to match your Solace PubSub+ Broker HOST and configured REST service port. This will send a message with contents “Hello World REST” as a Solace text message using the direct delivery mode. The “content-type” headers and “Solace-delivery-mode” are optional. If they are omitted then the Solace REST messaging default delivery mode of “persistent” will be used and the message contents will be treated as binary. +You will need to update HOST and PORT to match your Solace Event Broker HOST and configured REST service port. This will send a message with contents “Hello World REST” as a Solace text message using the direct delivery mode. The “content-type” headers and “Solace-delivery-mode” are optional. If they are omitted then the Solace REST messaging default delivery mode of “persistent” will be used and the message contents will be treated as binary. You can also add credentials to the request by updating the cURL command to the following: diff --git a/src/pages/tutorials/semp/messagevpn-with-queue-java.md b/src/pages/tutorials/semp/messagevpn-with-queue-java.md index e9f6b89..1956a94 100644 --- a/src/pages/tutorials/semp/messagevpn-with-queue-java.md +++ b/src/pages/tutorials/semp/messagevpn-with-queue-java.md @@ -69,7 +69,7 @@ Now we can start to implement the tasks as building blocks for the sample manage ### Create a new message-VPN -The first task is to create a new message-VPN with a name. Consulting the Solace documentation by following above [Message-VPN](https://docs.solace.com/Configuring-and-Managing/Configuring-VPNs.htm) link, we determine that it shall be configured for basic internal authentication, have storage size increased for persistent message queues from default 0 and have it enabled. Tip: the [PubSub+ Manager](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm) GUI tool can be used to show the default values for new created objects. +The first task is to create a new message-VPN with a name. Consulting the Solace documentation by following above [Message-VPN](https://docs.solace.com/Configuring-and-Managing/Configuring-VPNs.htm) link, we determine that it shall be configured for basic internal authentication, have storage size increased for persistent message queues from default 0 and have it enabled. Tip: the [Broker Manager](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm) GUI tool can be used to show the default values for new created objects. To understand how to implement this, let’s consult the [SEMP online API documentation](https://docs.solace.com/SEMP/SEMP-API-Ref.htm): - scrolling down to msgVPN and opening the `List Operations` link will show the color-coded options for all available operations. Clicking on `POST /msgVpns - Creates a Message VPN object` will open up the details. Scrolling down to `MsgVpn {`, here we can find the names of the attributes and we can derive the setter/getter Java method names. For example we look up the attribute `MaxMsgSpoolUsage` and derive the setter method to be `setMaxMsgSpoolUsage(int)`. diff --git a/src/pages/tutorials/semp/messagevpn-with-queue-python.md b/src/pages/tutorials/semp/messagevpn-with-queue-python.md index b9b2645..2ae0718 100644 --- a/src/pages/tutorials/semp/messagevpn-with-queue-python.md +++ b/src/pages/tutorials/semp/messagevpn-with-queue-python.md @@ -85,7 +85,7 @@ self.api_instance = semp_client.MsgVpnApi() ### Create a new message-VPN -The first task is to create a new message-VPN with a name. Consulting the Solace documentation by following above [Message-VPN](https://docs.solace.com/Configuring-and-Managing/Configuring-VPNs.htm) link, we determine that it shall be configured for basic internal authentication, have the storage size increased for persistent message queues from default 0 and have it enabled. Tip: the [PubSub+ Manager](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm) GUI tool can be used to show the default values for new created objects. +The first task is to create a new message-VPN with a name. Consulting the Solace documentation by following above [Message-VPN](https://docs.solace.com/Configuring-and-Managing/Configuring-VPNs.htm) link, we determine that it shall be configured for basic internal authentication, have the storage size increased for persistent message queues from default 0 and have it enabled. Tip: the [Broker Manager](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm) GUI tool can be used to show the default values for new created objects. To understand how to implement this, let’s consult the [SEMP online API documentation](https://docs.solace.com/SEMP/SEMP-API-Ref.htm): - scrolling down to msgVPN and opening the `List Operations` link will show the color-coded options for all available operations. Clicking on `POST /msgVpns - Creates a Message VPN object` will open up the details. Scrolling down to `MsgVpn {`, here we can find the names of the attributes and we can derive the Python instance variable names using the rule: lowercase with words separated by underscores. For example, we look up the attribute `maxMsgSpoolUsage (integer)` and determine the instance variable name to be `max_msg_spool_usage`. diff --git a/src/pages/tutorials/semp/messagevpn-with-queue-ruby.md b/src/pages/tutorials/semp/messagevpn-with-queue-ruby.md index 3f87846..473a152 100644 --- a/src/pages/tutorials/semp/messagevpn-with-queue-ruby.md +++ b/src/pages/tutorials/semp/messagevpn-with-queue-ruby.md @@ -90,7 +90,7 @@ end ### Create a new message-VPN -The first task is to create a new message-VPN with a name. Consulting the Solace documentation by following above [Message-VPN](https://docs.solace.com/Configuring-and-Managing/Configuring-VPNs.htm) link, we determine that it shall be configured for basic internal authentication, have the storage size increased for persistent message queues from default 0 and have it enabled. Tip: the [PubSub+ Manager](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm) GUI tool can be used to show the default values for new created objects. +The first task is to create a new message-VPN with a name. Consulting the Solace documentation by following above [Message-VPN](https://docs.solace.com/Configuring-and-Managing/Configuring-VPNs.htm) link, we determine that it shall be configured for basic internal authentication, have the storage size increased for persistent message queues from default 0 and have it enabled. Tip: the [Broker Manager](https://docs.solace.com/Broker-Manager/PubSub-Manager-Overview.htm) GUI tool can be used to show the default values for new created objects. To understand how to implement this, let’s consult the [SEMP online API documentation](https://docs.solace.com/SEMP/SEMP-API-Ref.htm): - scrolling down to msgVPN and opening the `List Operations` link will show the color-coded options for all available operations. Clicking on `POST /msgVpns - Creates a Message VPN object` will open up the details. Scrolling down to `MsgVpn {`, here we can find the names of the attributes and we can derive the Ruby instance variable names using the rule: lowercase with words separated by underscores. For example, we look up the attribute `maxMsgSpoolUsage (integer)` and determine the instance variable name to be `max_msg_spool_usage`. Additionally, you can explore the SEMP Ruby Client Library specific documentation included in the `solace-sample-semp/ruby/docs` folder once you build the ruby project. diff --git a/src/pages/tutorials/semp/tutorials.yml b/src/pages/tutorials/semp/tutorials.yml index d192719..3b54c7c 100644 --- a/src/pages/tutorials/semp/tutorials.yml +++ b/src/pages/tutorials/semp/tutorials.yml @@ -1,5 +1,5 @@ - title: SEMP Tutorials - summary: SEMP is a RESTful management API for configuring and administrating your Solace PubSub+ event broker. + summary: SEMP is a RESTful management API for configuring and administrating your Solace Event Broker. icon: semp.svg buttons: doclink: https://docs.solace.com/SEMP/Using-SEMP.htm#mc-main-content diff --git a/src/pages/tutorials/spring/spring-boot-autoconfigure.md b/src/pages/tutorials/spring/spring-boot-autoconfigure.md index 2a62db5..cca0cad 100644 --- a/src/pages/tutorials/spring/spring-boot-autoconfigure.md +++ b/src/pages/tutorials/spring/spring-boot-autoconfigure.md @@ -57,7 +57,7 @@ In order for us to run our sender/receiver we need to first create the Queue tha We will be creating a queue named "SpringTestQueue". * If using Solace Cloud, create the queue by following these instructions: [Create Queue](https://solace.com/cloud-learning/group_getting_started/ggs_queue.html) -* If using a local docker instance login to the PubSub+ Manager at localhost:8080/#/login. Once logged in choose your message VPN, click "Queues" on the left, and click the "+Queue" button on the top right to create your queue. +* If using a local docker instance login to the Broker Manager at localhost:8080/#/login. Once logged in choose your message VPN, click "Queues" on the left, and click the "+Queue" button on the top right to create your queue. * If using an appliance, ask your administrator to create the queue for you. * You can also create a queue from the CLI. [Learn how to login to the cli here](https://docs.solace.com/Solace-CLI/Using-Solace-CLI.htm) @@ -119,7 +119,7 @@ Sample code [is here](https://github.com/SolaceSamples/solace-samples-spring/tre ### SpringBootReceiver.java Open a new console/terminal if needed. Open the SpringBootReceiver.java file in the "spring-boot-autoconfig-receiver" project. -This class shows how simple it is to create a Spring Boot app that receives events from a PubSub+ queue. +This class shows how simple it is to create a Spring Boot app that receives events from a Solace queue. The class will setup a JmsListener on the "SpringTestQueue" which should already be created. A few things to take note of: @@ -184,7 +184,7 @@ Sample code [is here](https://github.com/SolaceSamples/solace-samples-spring/tre ### SpringBootSender.java Open a new console/terminal if needed. Open the SpringBootSender.java file in the "spring-boot-autoconfig-sender" project. -This class shows how simple it is to create a Spring Boot app that sends events to a PubSub+ queue. +This class shows how simple it is to create a Spring Boot app that sends events to a Solace queue. The class will send an event every 5 seconds A few things to take note of: diff --git a/src/pages/tutorials/spring/spring-cloud-stream.md b/src/pages/tutorials/spring/spring-cloud-stream.md index 5299bac..b60d14b 100644 --- a/src/pages/tutorials/spring/spring-cloud-stream.md +++ b/src/pages/tutorials/spring/spring-cloud-stream.md @@ -15,7 +15,7 @@ links: visible: true --- -This tutorial will introduce you to the fundamentals of using Spring Cloud Stream with the Solace PubSub+ Binder. You will create a Source (sending app), a Sink (receiving app), and a Processor (combination of a source & a sink). The apps will exchange events using a PubSub+ Event Broker +This tutorial will introduce you to the fundamentals of using Spring Cloud Stream with the Solace PubSub+ Binder. You will create a Source (sending app), a Sink (receiving app), and a Processor (combination of a source & a sink). The apps will exchange events using a Solace Event Broker For more Spring Cloud Stream Tutorials checkout these codelabs: * [Spring Cloud Stream - Basics](https://codelabs.solace.dev/codelabs/spring-cloud-stream-basics/#0) diff --git a/src/pages/tutorials/tanzu/java-app.md b/src/pages/tutorials/tanzu/java-app.md index 8bf280f..2a20188 100644 --- a/src/pages/tutorials/tanzu/java-app.md +++ b/src/pages/tutorials/tanzu/java-app.md @@ -10,18 +10,18 @@ links: ## Overview -This tutorial is part of a series of tutorials which aims to introduce users to Solace PubSub+ in Pivotal Cloud Foundry. Solace PubSub+ in Pivotal Cloud Foundry is delivered as a Tile on the [Pivotal Network](https://network.pivotal.io/). You can see the [Solace PubSub+ for Pivotal Cloud Foundry Documentation](https://docs.pivotal.io/solace-messaging) for full details. +This tutorial is part of a series of tutorials which aims to introduce users to Solace PubSub+ in Pivotal Cloud Foundry. Solace PubSub+ in Pivotal Cloud Foundry is delivered as a Tile on the [Pivotal Network](https://network.pivotal.io/). You can see the [Solace for Pivotal Cloud Foundry Documentation](https://docs.pivotal.io/solace-messaging) for full details. -This tutorial will introduce you to Solace PubSub+ for Pivotal Cloud Foundry by creating a Java application which connects to a Solace PubSub+ service instance. +This tutorial will introduce you to Solace for Pivotal Cloud Foundry by creating a Java application which connects to a Solace service instance. ![Diagram: Spring App Architecture](../../../images/diagrams/java-app-architecture.png) ## Goals -The goal of this tutorial is to demonstrate extracting the information from the application's Cloud Foundry Service Bindings and connect to the Solace PubSub+ service instance. This tutorial will show you: +The goal of this tutorial is to demonstrate extracting the information from the application's Cloud Foundry Service Bindings and connect to the Solace service instance. This tutorial will show you: -1. How to extract the Solace PubSub+ service credentials from the Cloud Foundry environment. -1. How to establish a connection to the Solace PubSub+ service. +1. How to extract the Solace service credentials from the Cloud Foundry environment. +1. How to establish a connection to the Solace service. 1. How to publish, subscribe and receive messages. ## Assumptions @@ -32,11 +32,11 @@ This tutorial assumes the following: * You are familiar with [Spring RESTful Web Services](https://spring.io/guides/gs/rest-service). * You are familiar with [Cloud Foundry](https://www.cloudfoundry.org/). * You have access to a running Pivotal Cloud Foundry environment. -* Solace PubSub+ for PCF has been installed in your Pivotal Cloud Foundry environment. +* Solace for PCF has been installed in your Pivotal Cloud Foundry environment. ## Obtaining the Solace API -This tutorial depends on you having the Solace PubSub+ API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. +This tutorial depends on you having the Solace Solace Messaging API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. ### Get the API: Using Gradle @@ -69,11 +69,11 @@ The sample application contains the following source files : | Source File | Description | | ---------------- | ----------- | | Application.java | The Sprint Boot application class | -| SolaceController.java | The Application's REST controller which provides an interface to subscribe, publish and receive messages. This class also implements the initialization procedure which connects the application to the Solace PubSub+ Service. | +| SolaceController.java | The Application's REST controller which provides an interface to subscribe, publish and receive messages. This class also implements the initialization procedure which connects the application to the Solace Service. | | SimpleMessage.java | This class wraps the information to be stored in a message | | SimpleSubscription.java | This class wraps the information describing a topic subscription | -This tutorial will only cover the source code in `SolaceController.java` as the other files do not contain logic related to establishing a connection to the Solace PubSub+ Service. +This tutorial will only cover the source code in `SolaceController.java` as the other files do not contain logic related to establishing a connection to the Solace Service. ### Obtaining the Solace Credentials in the Application @@ -103,7 +103,7 @@ The Pivotal Cloud Foundry environment exposes any bound Service Instances in a J } ``` -You can see the full structure of the Solace PubSub+ `VCAP_SERVICES` in the [Solace PubSub+ for PCF documentation](https://docs.pivotal.io/solace-messaging/credentials.html). +You can see the full structure of the Solace PubSub+ `VCAP_SERVICES` in the [Solace for PCF documentation](https://docs.pivotal.io/solace-messaging/credentials.html). The sample starts by extracting the JSON document from this environment variable, logging its content and confirming it contains useful information. This is done in the `init()` method: diff --git a/src/pages/tutorials/tanzu/spring-cloud-autoconf-java.md b/src/pages/tutorials/tanzu/spring-cloud-autoconf-java.md index b1ec5e0..aa8ecac 100644 --- a/src/pages/tutorials/tanzu/spring-cloud-autoconf-java.md +++ b/src/pages/tutorials/tanzu/spring-cloud-autoconf-java.md @@ -12,20 +12,20 @@ links: ## Overview -This tutorial is part of a series of tutorials which aims to introduce users to Solace PubSub+ in Pivotal Cloud Foundry. Solace PubSub+ in Pivotal Cloud Foundry is delivered as a Tile on the [Pivotal Network](https://network.pivotal.io/). You can see the [Solace PubSub+ for Pivotal Cloud Foundry Documentation](https://docs.pivotal.io/solace-messaging) for full details. +This tutorial is part of a series of tutorials which aims to introduce users to Solace PubSub+ in Pivotal Cloud Foundry. Solace PubSub+ in Pivotal Cloud Foundry is delivered as a Tile on the [Pivotal Network](https://network.pivotal.io/). You can see the [Solace for Pivotal Cloud Foundry Documentation](https://docs.pivotal.io/solace-messaging) for full details. -This tutorial is similar to the [Spring Cloud](../spring-cloud/) tutorial. Like the Spring Cloud tutorial, it will introduce you to Solace PubSub+ for Pivotal Cloud Foundry by creating a Java application. In contrast to the [Spring Cloud](), this application uses [solace-java-spring-boot](https://github.com/SolaceProducts/solace-spring-boot/tree/master/solace-spring-boot-starters/solace-java-spring-boot-starter) which using the Java CFEnv library and Spring Auto Configuration can auto inject a [SpringJCSMPFactory](https://github.com/SolaceProducts/solace-spring-boot/blob/master/solace-spring-boot-autoconfigure/solace-java-spring-boot-autoconfigure/src/main/java/com/solacesystems/jcsmp/SpringJCSMPFactory.java) directly into your application. +This tutorial is similar to the [Spring Cloud](../spring-cloud/) tutorial. Like the Spring Cloud tutorial, it will introduce you to Solace for Pivotal Cloud Foundry by creating a Java application. In contrast to the [Spring Cloud](), this application uses [solace-java-spring-boot](https://github.com/SolaceProducts/solace-spring-boot/tree/master/solace-spring-boot-starters/solace-java-spring-boot-starter) which using the Java CFEnv library and Spring Auto Configuration can auto inject a [SpringJCSMPFactory](https://github.com/SolaceProducts/solace-spring-boot/blob/master/solace-spring-boot-autoconfigure/solace-java-spring-boot-autoconfigure/src/main/java/com/solacesystems/jcsmp/SpringJCSMPFactory.java) directly into your application. ![Diagram: Spring Cloud App Architecture](../../../images/diagrams/spring-cloud-app-architecture.png) ## Goals -The goal of this tutorial is to demonstrate auto injecting a [SpringJCSMPFactory](https://github.com/SolaceProducts/solace-spring-boot/blob/master/solace-spring-boot-autoconfigure/solace-java-spring-boot-autoconfigure/src/main/java/com/solacesystems/jcsmp/SpringJCSMPFactory.java) based on the application's Cloud Foundry Service Bindings and connect to the Solace PubSub+ service instance. This tutorial will show you: +The goal of this tutorial is to demonstrate auto injecting a [SpringJCSMPFactory](https://github.com/SolaceProducts/solace-spring-boot/blob/master/solace-spring-boot-autoconfigure/solace-java-spring-boot-autoconfigure/src/main/java/com/solacesystems/jcsmp/SpringJCSMPFactory.java) based on the application's Cloud Foundry Service Bindings and connect to the Solace service instance. This tutorial will show you: 1. How to Autowire a [SpringJCSMPFactory](https://github.com/SolaceProducts/solace-spring-boot/blob/master/solace-spring-boot-autoconfigure/solace-java-spring-boot-autoconfigure/src/main/java/com/solacesystems/jcsmp/SpringJCSMPFactory.java) into your application 1. How to Autowire the [SolaceServiceCredentials](https://github.com/SolaceProducts/solace-services-info/blob/master/src/main/java/com/solace/services/core/model/SolaceServiceCredentials.java) provided by the Cloud Foundry environment using Java CFEnv. 1. How to Autowire [SpringJCSMPFactoryCloudFactory](https://github.com/SolaceProducts/solace-spring-boot/blob/master/solace-spring-boot-autoconfigure/solace-java-spring-boot-autoconfigure/src/main/java/com/solacesystems/jcsmp/SpringJCSMPFactory.java) which you can use to access other Cloud Available Solace PubSub+ Instances and create other instances of SpringJCSMPFactory. -1. How to establish a connection to the Solace PubSub+ service. +1. How to establish a connection to the Solace service. 1. How to publish, subscribe and receive messages. ## Assumptions @@ -36,11 +36,11 @@ This tutorial assumes the following: * You are familiar with [Spring RESTful Web Services](https://spring.io/guides/gs/rest-service). * You are familiar with [Cloud Foundry](https://www.cloudfoundry.org/). * You have access to a running Pivotal Cloud Foundry environment. -* Solace PubSub+ for PCF has been installed in your Pivotal Cloud Foundry environment. +* Solace for PCF has been installed in your Pivotal Cloud Foundry environment. ## Obtaining the Solace API -This tutorial depends on you having the Solace PubSub+ API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. +This tutorial depends on you having the Solace Solace Messaging API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. ### Get the API: Using Gradle @@ -73,11 +73,11 @@ The sample application contains the following source files : | Source File | Description | | ---------------- | ----------- | | Application.java | The Sprint Boot application class | -| SolaceController.java | The Application's REST controller which provides an interface to subscribe, publish and receive messages. This class also implements the initialization procedure which connects the application to the Solace PubSub+ Service. | +| SolaceController.java | The Application's REST controller which provides an interface to subscribe, publish and receive messages. This class also implements the initialization procedure which connects the application to the Solace Service. | | SimpleMessage.java | This class wraps the information to be stored in a message | | SimpleSubscription.java | This class wraps the information describing a topic subscription | -This tutorial will only cover the source code in `SolaceController.java` and the necessary project dependencies as the other files do not contain logic related to establishing a connection to the Solace PubSub+ Service. +This tutorial will only cover the source code in `SolaceController.java` and the necessary project dependencies as the other files do not contain logic related to establishing a connection to the Solace Service. ### Obtaining the Solace Credentials in the Application @@ -107,20 +107,20 @@ The Pivotal Cloud Foundry environment exposes any bound Service Instances in a J } ``` -You can see the full structure of the Solace PubSub+ `VCAP_SERVICES` in the [Solace PubSub+ for PCF documentation](https://docs.pivotal.io/solace-messaging/credentials.html). +You can see the full structure of the Solace PubSub+ `VCAP_SERVICES` in the [Solace for PCF documentation](https://docs.pivotal.io/solace-messaging/credentials.html). -This sample uses the [solace-java-spring-boot](https://github.com/SolaceProducts/solace-spring-boot/tree/master/solace-spring-boot-starters/solace-java-spring-boot-starter) which can auto detect and auto wire the available Solace PubSub+ Services from the Cloud Foundry environment into your application. +This sample uses the [solace-java-spring-boot](https://github.com/SolaceProducts/solace-spring-boot/tree/master/solace-spring-boot-starters/solace-java-spring-boot-starter) which can auto detect and auto wire the available Solace Services from the Cloud Foundry environment into your application. Spring provided `@Autowire` is used to access all auto configuration available beans which include an auto selected Factory. ```java -// A JCSMP Factory for the auto selected Solace PubSub+ service, +// A JCSMP Factory for the auto selected Solace service, // This is used to create JCSMPSession(s) // This is the only required bean to run this application. @Autowired private SpringJCSMPFactory solaceFactory; -// The auto selected Solace PubSub+ service for the matching SpringJCSMPFactory, +// The auto selected Solace service for the matching SpringJCSMPFactory, // the relevant information provided by this bean have already been injected // into the SpringJCSMPFactory // This bean is for information only, it can be used to discover more about @@ -131,27 +131,27 @@ SolaceServiceCredentials solaceServiceCredentials; // A Factory of Factories // Has the ability to create SpringJCSMPFactory(s) for any available // SolaceServiceCredentials -// Can be used in case there are multiple Solace PubSub+ Services to +// Can be used in case there are multiple Solace Services to // select from. @Autowired SpringJCSMPFactoryCloudFactory springJCSMPFactoryCloudFactory; ``` -The `init()` method retrieves and shows the autowired Solace PubSub+ Service Instance details as follows: +The `init()` method retrieves and shows the autowired Solace Service Instance details as follows: ```java logger.info(String.format("SpringJCSMPFactoryCloudFactory discovered %s solace-pubsub service(s)", springJCSMPFactoryCloudFactory.getSolaceServiceCredentials().size())); -// Log what Solace PubSub+ Services were discovered +// Log what Solace Services were discovered for (SolaceServiceCredentials discoveredSolaceMessagingService : springJCSMPFactoryCloudFactory.getSolaceServiceCredentials()) { - logger.info(String.format("Discovered Solace PubSub+ service '%s': HighAvailability? ( %s ), Message VPN ( %s )", + logger.info(String.format("Discovered Solace service '%s': HighAvailability? ( %s ), Message VPN ( %s )", discoveredSolaceMessagingService.getId(), discoveredSolaceMessagingService.isHA(), discoveredSolaceMessagingService.getMsgVpnName())); } ``` -### Connecting to the Solace PubSub+ Service +### Connecting to the Solace Service The `SpringJCSMPFactory solaceFactory` was already autowired, you can use it to connect the Solace Session in the conventional way as outlined in the [Publish/Subscribe tutorial](../../jcsmp/publish-subscribe/). Use the `solaceFactory` to create a `Session`: @@ -258,7 +258,7 @@ cd solace-samples-cloudfoundry-java ## Cloud Foundry Setup -The sample application specifies a dependency on a service instance named `solace-pubsub-sample-instance` in its manifiest (See `spring-cloud-autoconf/manifest.yml`). This must be an instance of the Solace PubSub+ Service which can be created with this command: +The sample application specifies a dependency on a service instance named `solace-pubsub-sample-instance` in its manifiest (See `spring-cloud-autoconf/manifest.yml`). This must be an instance of the Solace Service which can be created with this command: ``` cf create-service solace-pubsub enterprise-shared solace-pubsub-sample-instance diff --git a/src/pages/tutorials/tanzu/spring-cloud.md b/src/pages/tutorials/tanzu/spring-cloud.md index ffb8743..2b7440f 100644 --- a/src/pages/tutorials/tanzu/spring-cloud.md +++ b/src/pages/tutorials/tanzu/spring-cloud.md @@ -10,18 +10,18 @@ links: ## Overview -This tutorial is part of a series of tutorials which aims to introduce users to Solace PubSub+ in Pivotal Cloud Foundry. Solace PubSub+ in Pivotal Cloud Foundry is delivered as a Tile on the [Pivotal Network](https://network.pivotal.io/). You can see the [Solace PubSub+ for Pivotal Cloud Foundry Documentation](https://docs.pivotal.io/solace-messaging) for full details. +This tutorial is part of a series of tutorials which aims to introduce users to Solace PubSub+ in Pivotal Cloud Foundry. Solace PubSub+ in Pivotal Cloud Foundry is delivered as a Tile on the [Pivotal Network](https://network.pivotal.io/). You can see the [Solace for Pivotal Cloud Foundry Documentation](https://docs.pivotal.io/solace-messaging) for full details. -This tutorial is similar to the [Java App](../java-app/) tutorial. Like the Java App tutorial, it will introduce you to Solace PubSub+ for Pivotal Cloud Foundry by creating a Java application. In contrast to the Java App, this application uses the Spring Cloud Connectors library to simplify the parsing of the `VCAP_SERVICES` environment variable. +This tutorial is similar to the [Java App](../java-app/) tutorial. Like the Java App tutorial, it will introduce you to Solace for Pivotal Cloud Foundry by creating a Java application. In contrast to the Java App, this application uses the Spring Cloud Connectors library to simplify the parsing of the `VCAP_SERVICES` environment variable. ![Diagram: Spring Cloud App Architecture](../../../images/diagrams/spring-cloud-app-architecture.png) ## Goals -The goal of this tutorial is to demonstrate extracting the information from the application's Cloud Foundry Service Bindings and connect to the Solace PubSub+ service instance. This tutorial will show you: +The goal of this tutorial is to demonstrate extracting the information from the application's Cloud Foundry Service Bindings and connect to the Solace service instance. This tutorial will show you: -1. How to extract the Solace PubSub+ service credentials from the Cloud Foundry environment using Spring Cloud Connectors. -1. How to establish a connection to the Solace PubSub+ service. +1. How to extract the Solace service credentials from the Cloud Foundry environment using Spring Cloud Connectors. +1. How to establish a connection to the Solace service. 1. How to publish, subscribe and receive messages. ## Assumptions @@ -32,11 +32,11 @@ This tutorial assumes the following: * You are familiar with [Spring RESTful Web Services](https://spring.io/guides/gs/rest-service). * You are familiar with [Cloud Foundry](https://www.cloudfoundry.org/). * You have access to a running Pivotal Cloud Foundry environment. -* Solace PubSub+ for PCF has been installed in your Pivotal Cloud Foundry environment. +* Solace for PCF has been installed in your Pivotal Cloud Foundry environment. ## Obtaining the Solace API -This tutorial depends on you having the Solace PubSub+ API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. +This tutorial depends on you having the Solace Solace Messaging API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. ### Get the API: Using Gradle @@ -69,11 +69,11 @@ The sample application contains the following source files : | Source File | Description | | ---------------- | ----------- | | Application.java | The Sprint Boot application class | -| SolaceController.java | The Application's REST controller which provides an interface to subscribe, publish and receive messages. This class also implements the initialization procedure which connects the application to the Solace PubSub+ Service. | +| SolaceController.java | The Application's REST controller which provides an interface to subscribe, publish and receive messages. This class also implements the initialization procedure which connects the application to the Solace Service. | | SimpleMessage.java | This class wraps the information to be stored in a message | | SimpleSubscription.java | This class wraps the information describing a topic subscription | -This tutorial will only cover the source code in `SolaceController.java` as the other files do not contain logic related to establishing a connection to the Solace PubSub+ Service. +This tutorial will only cover the source code in `SolaceController.java` as the other files do not contain logic related to establishing a connection to the Solace Service. ### Obtaining the Solace Credentials in the Application @@ -103,11 +103,11 @@ The Pivotal Cloud Foundry environment exposes any bound Service Instances in a J } ``` -You can see the full structure of the Solace PubSub+ `VCAP_SERVICES` in the [Solace PubSub+ for PCF documentation](https://docs.pivotal.io/solace-messaging/credentials.html). +You can see the full structure of the Solace PubSub+ `VCAP_SERVICES` in the [Solace for PCF documentation](https://docs.pivotal.io/solace-messaging/credentials.html). This sample use the [Spring Cloud Connectors](https://cloud.spring.io/spring-cloud-connectors) project to retrieve the `VCAP_SERVICES` information in the form of a `ServiceInfo` object. For Solace PubSub+ in Cloud Foundry, there is a Spring Cloud Connectors extension in GitHub called [sl-spring-cloud-connectors](https://github.com/SolaceProducts/sl-spring-cloud-connectors). This library parses the `VCAP_SERVICES` environment variable and exposes the information by implementing the `ServiceInfo` interface in the `SolaceMessagingInfo` object. -The `init()` method retrieves the Solace PubSub+ Service Instance details for the service named `solace-pubsub-sample-instance` as follows: +The `init()` method retrieves the Solace Service Instance details for the service named `solace-pubsub-sample-instance` as follows: ```java CloudFactory cloudFactory = new CloudFactory(); @@ -123,7 +123,7 @@ if (solaceServiceCredentials == null) { } ``` -### Connecting to the Solace PubSub+ Service +### Connecting to the Solace Service Once you have the `SolaceServiceCredentials`, you can create and then connect the Solace Session in the conventional way as outlined in the [Publish/Subscribe tutorial](../../jcsmp/publish-subscribe/). You set the JCSMP properties and then use the `JCSMPFactory` to create a `Session`: @@ -239,7 +239,7 @@ cd solace-samples-cloudfoundry-java ## Cloud Foundry Setup -The sample application specifies a dependency on a service instance named `solace-pubsub-sample-instance` in its manifiest (See `spring-cloud/manifest.yml`). This must be an instance of the Solace PubSub+ Service which can be created with this command: +The sample application specifies a dependency on a service instance named `solace-pubsub-sample-instance` in its manifiest (See `spring-cloud/manifest.yml`). This must be an instance of the Solace Service which can be created with this command: ``` cf create-service solace-pubsub enterprise-shared solace-pubsub-sample-instance From c8f2b6462e89a9ad06dafca8296ac0eaf8d2b6cf Mon Sep 17 00:00:00 2001 From: Jamieson Walker Date: Mon, 6 Oct 2025 13:44:13 -0500 Subject: [PATCH 6/6] Removed Solace Solace occurances --- src/pages/tutorials/c/persistence-with-queues.md | 4 ++-- src/pages/tutorials/c/publish-subscribe.md | 2 +- src/pages/tutorials/c/request-reply.md | 6 +++--- .../java-amqp-qpid-jms2/durable-topic-subscriber.md | 4 ++-- src/pages/tutorials/tanzu/java-app.md | 2 +- src/pages/tutorials/tanzu/spring-cloud-autoconf-java.md | 2 +- src/pages/tutorials/tanzu/spring-cloud.md | 2 +- 7 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/pages/tutorials/c/persistence-with-queues.md b/src/pages/tutorials/c/persistence-with-queues.md index 2db620c..d6a1f04 100644 --- a/src/pages/tutorials/c/persistence-with-queues.md +++ b/src/pages/tutorials/c/persistence-with-queues.md @@ -25,7 +25,7 @@ This tutorial assumes the following: * Enabled client username and password * Client-profile enabled with guaranteed messaging permissions. -One simple way to get access to Solace messaging quickly is to create a messaging service in Solace Solace Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to Solace messaging below. +One simple way to get access to Solace messaging quickly is to create a messaging service in Solace Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to Solace messaging below. ## Goals @@ -52,7 +52,7 @@ Durable endpoints are not auto created on Solace message routers. However there * Using the management interface * Using the APIs -Using the Solace Solace Messaging APIs to provision an endpoint can be a convenient way of getting started quickly without needing to become familiar with the management interface. This is why it is used in this tutorial. However it should be noted that the management interface provides more options to control the queue properties. So generally it becomes the preferred method over time. +Using the Solace Messaging APIs to provision an endpoint can be a convenient way of getting started quickly without needing to become familiar with the management interface. This is why it is used in this tutorial. However it should be noted that the management interface provides more options to control the queue properties. So generally it becomes the preferred method over time. Provisioning an endpoint through the API requires the “Guaranteed Endpoint Create” permission in the client-profile. You can confirm this is enabled by looking at the client profile in Broker Manager. If it is correctly set you will see the following: diff --git a/src/pages/tutorials/c/publish-subscribe.md b/src/pages/tutorials/c/publish-subscribe.md index a413fd5..e2663f6 100644 --- a/src/pages/tutorials/c/publish-subscribe.md +++ b/src/pages/tutorials/c/publish-subscribe.md @@ -14,7 +14,7 @@ links: link: https://github.com/SolaceDev/solace-dev-tutorials/blob/master/src/pages/tutorials/c/publish-subscribe.md --- -This tutorial will introduce you to the fundamentals of the Solace Solace Messaging API by connecting a client, adding a topic subscription and sending a message matching this topic subscription. This forms the basis for any publish / subscribe message exchange. +This tutorial will introduce you to the fundamentals of the Solace Messaging API by connecting a client, adding a topic subscription and sending a message matching this topic subscription. This forms the basis for any publish / subscribe message exchange. ## Assumptions diff --git a/src/pages/tutorials/c/request-reply.md b/src/pages/tutorials/c/request-reply.md index 8ad9039..11c6784 100644 --- a/src/pages/tutorials/c/request-reply.md +++ b/src/pages/tutorials/c/request-reply.md @@ -24,7 +24,7 @@ This tutorial assumes the following: * Connectivity information for a Solace message-VPN * Enabled client username and password -One simple way to get access to Solace messaging quickly is to create a messaging service in Solace Solace Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to Solace messaging below. +One simple way to get access to Solace messaging quickly is to create a messaging service in Solace Cloud [as outlined here](https://solace.com/products/event-broker/cloud/). You can find other ways to get access to Solace messaging below. The build instructions in this tutorial assume you are using a Linux shell. If your environment differs, adapt the instructions. @@ -35,14 +35,14 @@ The goal of this tutorial is to understand the following: * On the requestor side: 1. How to create a request 2. How to receive a response - 3. How to use the Solace Solace Messaging API to correlate the request and response + 3. How to use the Solace Messaging API to correlate the request and response * On the replier side: 1. How to detect a request expecting a reply 2. How to generate a reply message ## Overview -Request-reply messaging is supported by the Solace Event Broker for all delivery modes. For direct messaging, the Solace Solace Messaging APIs provide the Requestor object for convenience. This object makes it easy to send a request and wait for the reply message. It is a convenience object that makes use of the API provided “inbox” topic that is automatically created for each PubSub+ client and automatically correlates requests with replies using the message correlation ID. (See Message Correlation below for more details). On the reply side another convenience method enables applications to easily send replies for specific requests. Direct messaging request reply is the delivery mode that is illustrated in this sample. +Request-reply messaging is supported by the Solace Event Broker for all delivery modes. For direct messaging, the Solace Messaging APIs provide the Requestor object for convenience. This object makes it easy to send a request and wait for the reply message. It is a convenience object that makes use of the API provided “inbox” topic that is automatically created for each PubSub+ client and automatically correlates requests with replies using the message correlation ID. (See Message Correlation below for more details). On the reply side another convenience method enables applications to easily send replies for specific requests. Direct messaging request reply is the delivery mode that is illustrated in this sample. It is also possible to use guaranteed messaging for request reply scenarios. In this case the replier can listen on a queue for incoming requests and the requestor can use a temporary endpoint to attract replies. The requestor and replier must manually correlate the messages. This is explained further in the [Solace PubSub+ documentation](https://docs.solace.com/Solace-PubSub-Messaging-APIs/API-Developer-Guide/Request-Reply-Messaging.htm) and shown in the API samples named `RRGuaranteedRequestor` and `RRGuaranteedReplier`. diff --git a/src/pages/tutorials/java-amqp-qpid-jms2/durable-topic-subscriber.md b/src/pages/tutorials/java-amqp-qpid-jms2/durable-topic-subscriber.md index eb512d3..2ef0c81 100644 --- a/src/pages/tutorials/java-amqp-qpid-jms2/durable-topic-subscriber.md +++ b/src/pages/tutorials/java-amqp-qpid-jms2/durable-topic-subscriber.md @@ -22,9 +22,9 @@ no consumer associated with it. To create a durable subscription, you must first create a JMS connection as with all JMS samples. See the [publish/subscribe tutorial](../publish-subscribe/) for more details if you need. -A durable subscription requires that you create a durable consumer given a subscription name and topic. The subscription name will be the name used for the Durable Topic Endpoint in the Solace Solace messaging service and the topic name is what will attract the messages you wish to receive. +A durable subscription requires that you create a durable consumer given a subscription name and topic. The subscription name will be the name used for the Durable Topic Endpoint in the Solace messaging service and the topic name is what will attract the messages you wish to receive. -One aspect that is unusual with Qpid JMS is that a client ID is required to create a durable consumer. Therefore, you must set this on the context. Keep in mind that client IDs must be unique within the Solace Solace messaging service. +One aspect that is unusual with Qpid JMS is that a client ID is required to create a durable consumer. Therefore, you must set this on the context. Keep in mind that client IDs must be unique within the Solace messaging service. The following code snippet outlines this. diff --git a/src/pages/tutorials/tanzu/java-app.md b/src/pages/tutorials/tanzu/java-app.md index 2a20188..0c5013b 100644 --- a/src/pages/tutorials/tanzu/java-app.md +++ b/src/pages/tutorials/tanzu/java-app.md @@ -36,7 +36,7 @@ This tutorial assumes the following: ## Obtaining the Solace API -This tutorial depends on you having the Solace Solace Messaging API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. +This tutorial depends on you having the Solace Messaging API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. ### Get the API: Using Gradle diff --git a/src/pages/tutorials/tanzu/spring-cloud-autoconf-java.md b/src/pages/tutorials/tanzu/spring-cloud-autoconf-java.md index aa8ecac..e02820c 100644 --- a/src/pages/tutorials/tanzu/spring-cloud-autoconf-java.md +++ b/src/pages/tutorials/tanzu/spring-cloud-autoconf-java.md @@ -40,7 +40,7 @@ This tutorial assumes the following: ## Obtaining the Solace API -This tutorial depends on you having the Solace Solace Messaging API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. +This tutorial depends on you having the Solace Messaging API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. ### Get the API: Using Gradle diff --git a/src/pages/tutorials/tanzu/spring-cloud.md b/src/pages/tutorials/tanzu/spring-cloud.md index 2b7440f..7bc3761 100644 --- a/src/pages/tutorials/tanzu/spring-cloud.md +++ b/src/pages/tutorials/tanzu/spring-cloud.md @@ -36,7 +36,7 @@ This tutorial assumes the following: ## Obtaining the Solace API -This tutorial depends on you having the Solace Solace Messaging API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. +This tutorial depends on you having the Solace Messaging API for Java (JCSMP). Here are a few easy ways to get the Java API. The instructions in the [Building](#building) section assume you're using Gradle and pulling the jars from maven central. If your environment differs then adjust the build instructions appropriately. ### Get the API: Using Gradle