{"id":21505445,"url":"https://github.com/ibm-messaging/mq-jms-spring","last_synced_at":"2025-04-05T00:09:39.851Z","repository":{"id":40596872,"uuid":"117962234","full_name":"ibm-messaging/mq-jms-spring","owner":"ibm-messaging","description":"Components to assist MQ JMS integration with Spring frameworks","archived":false,"fork":false,"pushed_at":"2024-08-23T05:46:42.000Z","size":439,"stargazers_count":185,"open_issues_count":11,"forks_count":102,"subscribers_count":26,"default_branch":"master","last_synced_at":"2024-08-23T06:47:22.442Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ibm-messaging.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-18T09:35:37.000Z","updated_at":"2024-08-23T05:46:46.000Z","dependencies_parsed_at":"2023-02-12T00:35:14.404Z","dependency_job_id":"4d862355-3c47-4605-998c-020c1bb56bee","html_url":"https://github.com/ibm-messaging/mq-jms-spring","commit_stats":null,"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibm-messaging%2Fmq-jms-spring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibm-messaging%2Fmq-jms-spring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibm-messaging%2Fmq-jms-spring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ibm-messaging%2Fmq-jms-spring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ibm-messaging","download_url":"https://codeload.github.com/ibm-messaging/mq-jms-spring/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247266564,"owners_count":20910836,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-23T19:03:22.217Z","updated_at":"2025-04-05T00:09:39.820Z","avatar_url":"https://github.com/ibm-messaging.png","language":"Java","funding_links":[],"categories":["进程间通信"],"sub_categories":["Spring Cloud框架"],"readme":"# IBM MQ JMS Spring Components\n\nThis repository contains code to help to provide Spring developers with easy configuration of the IBM MQ JMS package.\n\nThe library contains:\n\n-   `mq-jms-spring-boot-starter` for [Spring Boot](https://projects.spring.io/spring-boot/) applications\n\nNOTE: Spring Boot 2 has now reached its end of non-commercial service life.\nSo version 2.7.18 is the last update based on Spring 2. Further updates will\nfollow the Spring 3 path only. If you want to continue to use Spring 2 with future versions of the MQ jars,\nthen overriding the version inherited from the mq-jms-spring-boot in your parent pom.xml should be possible.\nHowever, this would not give easy access via configuration to any new features available in the MQ client.\n\n## Installation and Usage\n\nThe compiled versions of this package can be automatically downloaded from Maven Central.\n\nFor local modifications and building it yourself, you can use the `RUNME.sh` script. It uses gradle as the build\nmechanism and has tasks that can push compiled jars to either a local repository (typically under `$HOME/.m2`) or to\nMaven Central. When signing/authentication of modules is required, use the `gradle.properties.template` file as a\nstarter for your own `gradle.properties`.\n\nJava 17 is required as the compiler level when building this package, as that is the baseline for Spring Boot 3.\n\n### Spring Boot Applications\n\nGradle:\n\n    repositories {\n       mavenLocal()\n       mavenCentral()\n    }\n\n    dependencies {\n        compile group: 'com.ibm.mq', name: 'mq-jms-spring-boot-starter', version: 'x.y.z'\n    }\n\nMaven:\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.ibm.mq\u003c/groupId\u003e\n  \u003cartifactId\u003emq-jms-spring-boot-starter\u003c/artifactId\u003e\n  \u003cversion\u003ex.y.x\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n**Note** This repository and the corresponding Maven Central artifacts requires Spring Boot 3. Maven\nCentral continues to provide older versions that work with Spring Boot 2.\n\n## Design Approach\n\nThe approach taken here is to follow the model for JMS applications shown in the\n[Spring Getting Started Guide for JMS](https://spring.io/guides/gs/messaging-jms/). That in turn\nis based on using the [JmsTemplate Framework](https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#jms-jmstemplate)\n\nSome simple example programs using Spring Boot and JMS interfaces can be found in the samples directory. The RUNME.sh program in\neach subdirectory compiles and executes it. The application.properties files in that tree may need modification for your environment.\n\nEssentially what gets configured from this package are a ConnectionFactory which Spring's JmsTemplate implementation\nexploits to provide a simpler interface, and a MessageListener.\n\n## Getting Started\n\nTo get started quickly, you can use the default configuration settings in this package along with the\nIBM MQ for Developers container which runs the server processes.\n\n### Default Configuration\n\nThe default options have been selected to match the\n[MQ container](https://github.com/ibm-messaging/mq-container) development configuration.\n\nThis means that you can run a queue manager using that environment and connect to it without special\nconfiguration.\n\nThis script will run the container on a Linux system.\n\n    docker run --env LICENSE=accept --env MQ_QMGR_NAME=QM1 \\\n               --publish 1414:1414 \\\n               --publish 9443:9443 \\\n               --detach \\\n               ibmcom/mq\n\nThe default attributes are\n\n    ibm.mq.queueManager=QM1\n    ibm.mq.channel=DEV.ADMIN.SVRCONN\n    ibm.mq.connName=localhost(1414)\n    ibm.mq.user=\n    ibm.mq.password=\n\n### Connection security\n\nThe default userid and password have been removed from this package, as the corresponding default configuration has been\nremoved from the MQ Developer images. Authentication must now be explicitly defined both for the queue manager, and for\nthe Spring applications.\n\nTo revert to the previous default user/password checking, perhaps if you are still using older Developer images, you\nmust now set the `ibm.mq.user` and `ibm.mq.password` attribute.\n\n```\n   ibm.mq.user=admin\n   ibm.mq.password=passw0rd\n```\nConfiguration of secure connections with TLS are discussed below.\n\n\n#### JWT Tokens\nIf the queue manager has been configured to authenticate applications based on JWT tokens, then those tokens can be\nprovided through the JMS layer.\n\nTo use this, you can either set `ibm.mq.token`\nor the password to the token. If you use the `password` attribute, then the `user` must also be set to the empty value\n(which is now the default anyway).\n\n### Configuration Options\n\nIf you already have a running MQ queue manager that you want to use, then you can easily modify the default\nconfiguration to match by providing override values.\n\nThe queue manager name is given as\n\n-   `ibm.mq.queueManager`\n\nFor client connections to a queue manager, you must also have either\n\n-   `ibm.mq.channel`\n-   `ibm.mq.connName`\n    or\n-   `ibm.mq.ccdtUrl`\n\nIf both the channel and connName are empty, and the CCDTURL is not supplied, then a local queue manager is assumed. The\nCCDTURL property is taken in preference to the channel and connName. The channel and connName have non-blank defaults,\nso must be explicitly set to empty strings if you do not wish them to be used.\n\nOptionally you can provide a [client id](https://www.ibm.com/docs/en/ibm-mq/latest?topic=objects-clientid)\nand [application name](https://www.ibm.com/docs/en/ibm-mq/latest?topic=applications-specifying-application-name-in-supported-programming-languages) if required.\n\n-   `ibm.mq.clientId`\n-   `ibm.mq.applicationName`\n\nYou will probably also need to set\n\n-   `ibm.mq.user`\n-   `ibm.mq.password`\n\nto override the default values.\n\nFor example in an `application.properties` file:\n\n```\n    ibm.mq.queueManager=QM1\n    ibm.mq.channel=SYSTEM.DEF.SVRCONN\n    ibm.mq.connName=server.example.com(1414)\n    ibm.mq.user=user1\n    ibm.mq.password=passw0rd\n```\n\nOr in the equivalent `application.yml` file:\n\n```\n    ibm:\n      mq:\n        queueManager: QM1\n        channel: SYSTEM.DEF.SVRCONN\n        connName: server.example.com(1414)\n        user: user1\n        password: passw0rd\n```\n\nSpring Boot will then create a ConnectionFactory that can then be used to interact with your queue manager.\n\n| Option (ibm.mq)          | Description                                                                     |\n| -------------------------| ------------------------------------------------------------------------------- |\n| queueManager             | Name of queue manager                                                           |\n| channel                  | Channel Name for SVRCONN                                                        |\n| connName                 | Connection Name, which can be comma-separated list                              |\n| ccdtUrl                  | Location of the MQ CCDT file (URL can reference http/ftp location)              |\n| user                     | User Name. Default is empty string                                              |\n| password                 | Password. Default is empty string                                               |\n| token                    | JWT token                                                                       |\n| clientId                 | ClientId uniquely identifies the app connection for durable subscriptions       |\n| applicationName          | Application Name used for Uniform Cluster balancing                             |\n| userAuthenticationMQCSP  | Control authentication mechanism for old queue managers (default true)          |\n| tempQPrefix              | The prefix to be used to form the name of an MQ dynamic queue                   |\n| tempTopicPrefix          | The prefix to be used to form the name of an MQ dynamic topic                   |\n| tempModel                | The name of a model queue for creating temporary destinations                   |\n| reconnect                | Whether app tries automatic reconnect. Options of YES/NO/QMGR/DISABLED/DEFAULT  |\n| reconnectTimeout         | Timeout in seconds before automatic reconnect gives up                          |\n| autoConfigure            | If explicitly set to \"false\", then the autoconfigure bean is disabled           |\n| balancingApplicationType | Hint how uniform clusters should treat the app. Options of SIMPLE/REQREP        |\n| balancingTimeout         | Uniform cluster timer. Options NEVER/DEFAULT/IMMEDIATE or integer seconds       |\n| balancingOptions         | Rebalancing options. Options of NONE/IGNORETRANS. Default NONE.                 |\n| balancingInstanceMode    | Rebalancing. Set to JVM to treat all app names in this process as equivalent.   |\n\nThe `reconnect` option was previously named `defaultReconnect` but both names work in the configuration.\n\n#### TLS related options\n\nThe following options all default to null, but may be used to assist with configuring TLS\n\n| Option (ibm.mq)      | Description                                                                     |\n| -------------------- | ------------------------------------------------------------------------------- |\n| sslCipherSuite       | Cipher Suite, sets connectionFactory property WMQConstants.WMQ_SSL_CIPHER_SUITE |\n| sslCipherSpec        | Cipher Spec,  sets connectionFactory property WMQConstants.WMQ_SSL_CIPHER_SPEC  |\n| sslPeerName          | Peer Name,    sets connectionFactory property WMQConstants.WMQ_SSL_PEER_NAME    |\n| useIBMCipherMappings | Sets System property com.ibm.mq.cfg.useIBMCipherMappings                        |\n| outboundSNI          | Sets property com.ibm.mq.cfg.SSL.OutboundSNI (use HOSTNAME for Openshift qmgrs) |\n| channelSharing       | Sets strategy for TCP/IP connection sharing - CONNECTION or GLOBAL              |\n\nWe also have\n\n| Option (ibm.mq)         | Description                                                     |\n| ----------------------- | ----------------------------------------------------------------|\n| sslFIPSRequired         | Force FIPS-compliant algorithms to be used (default false)      |\n| slKeyResetCount         | How many bytes to send before resetting the TLS keys            |\n| sslCertificateValPolicy | If \"none\", do not check the server certificate is trusted       |\n\nand\n\n| Option (ibm.mq.jks)  | Description                                                                  |\n| ---------------------| ---------------------------------------------------------------------------- |\n| trustStore           | Where is the store holding trusted certificates                              |\n| trustStorePassword   | Password for the trustStore                                                  |\n| keyStore             | Where is the keystore with a personal key and certificate                    |\n| keyStorePassword     | Password for the keyStore                                                    |\n\nThese JKS options are an alternative to setting the `javax.net.ssl` system properties, usually done on the command line.\n\nAn alternative preferred approach for setting the key/truststores is available from Spring 3.1, which introduced the\nconcept of \"SSL Bundles\". This makes it possible to have different SSL configurations - keystores, truststores etc - for\ndifferent components executing in the same Spring-managed process. See\n[here](https://spring.io/blog/2023/06/07/securing-spring-boot-applications-with-ssl) for a description of the options\navailable. Each bundle has an identifier with the `spring.ssl.bundle.jks.\u003ckey\u003e` tree of options. The key can be\nspecified for this package with `ibm.mq.sslBundle` which then uses the Spring elements to create the connection\nconfiguration. The default value for this key is empty, meaning that `SSLBundles` will not be used; the global SSL\nconfiguration is used instead. However the `ibm.mq.jks` properties are now marked as deprecated.\n\n| Option (ibm.mq)      | Description                                                                  |\n| -------------------- | ---------------------------------------------------------------------------- |\n| sslBundle            | Spring Boot option (from 3.1) for granular certificate configuration         |\n\nTo achieve the same effect with Spring 2.x, you could use your own code to create an `SSLSocketFactory` object\nwhich can be applied to the MQ Connection Factory in a `customise` method before the CF is invoked.\n\nSpring Boot 3.4.0 changed how the sslBundles are loaded. If you have a simple file name such as `location: \"key.jks\"`\nand there is an exception saying that the file cannot be found, then change the property to `location: \"file:key.jks\"`.\nThis regression has been fixed in Spring Boot 3.4.2, so you should not see this problem.\n\n#### Caching connection factory options\n\nYou may want to use the default Spring Caching connection factory with the default Spring JMS properties. This is now the\npreferred method in Spring for holding JMS objects open, rather than the Pooling options described below.\n\n| Option (spring.jms.cache)   | Description                                      |\n| --------------------------- | ------------------------------------------------ |\n| enabled                     | Whether to cache sessions (default true)         |\n| consumers                   | Whether to cache message consumers               |\n| producers                   | Whether to cache message producers               |\n| session-cache-size          | Size of the session cache (per JMS Session type) |\n\n#### Pooled connection factory options\n\nAlternatively you may configure a pooled connection factory by using these properties:\n\n| Option (ibm.mq.pool)       | Description                                                                                                                              |\n| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |\n| enabled                    | Enabled Pooled connection factory usage                                                                                                  |\n| blockIfFull                | Blocks a connection request when the pool is full. Default is false                                                                      |\n| blockIfFullTimeout         | Blocking period before throwing an exception if the pool is still full                                                                   |\n| idleTimeout                | Connection idle timeout. Default to 30 seconds                                                                                           |\n| maxConnections             | Maximum number of pooled connections. Default is 1                                                                                       |\n| maxSessionsPerConnection   | Maximum number of pooled sessions. Default is 500                                                                                        |\n| timeBetweenExpirationCheck | Time to sleep between runs of the idle connection eviction thread. Disable when negative. Default is -1                                  |\n| useAnonymousProducers      | Whether to use only one anonymous \"MessageProducer\" instance. Set it to false to create one \"MessageProducer\" every time one is required |\n\nThese pooling options make use of the [PooledJMS](https://github.com/messaginghub/pooled-jms) implementation. More documentation on\nthe options can be found [here](https://github.com/messaginghub/pooled-jms/blob/master/pooled-jms-docs/Configuration.md).\n\n### JMS Polling Listener Timer configuration\n\nThe Spring AbstractPollingMessageListenerContainer interface has a default polling timer of 1 second. This can be\nconfigured with the `spring.jms.listener.receiveTimeout` property. If the property is not explicitly set, then this MQ\nSpring Boot component resets the initial timeout value to 30 seconds which has been shown to be more cost-effective.\nApplication code can still set its own preferred value.\n\n| Option                              | Description                                                                                                                   |\n| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |\n| spring.jms.listener.receiveTimeout  | How frequently to poll for received messages. Default is 1s. Given as a Duration string: \"1m\", \"60s\", \"60000\" are equivalent  |\n\n### MQ JMS Tracing and Logging\n\nThe MQ JMS client libraries have a large set of options to control their own tracing and logging behaviour. See for\nexample\n[this page](https://www.ibm.com/docs/en/ibm-mq/latest?topic=mcjcf-using-java-standard-environment-trace-configure-java-trace).\nThis package exposes some of these options, so they can be set using regular Spring properties, without needing to be\nput into System properties and/or additional external files.Some of these options interact in potentially surprising\nways, as to what gets printed where (to files, stdout/stderr etc). So you might need to experiment, or revert to the\nfull control of setting the separate MQ-documented properties files. If the `ffdcPath` attribute is not set, then FFDCs are\ncreated in the FFDC directory under the `traceFile` directory. Note that some of the documented MQ attributes use \"ffst\", while some\nuse \"ffdc\". I've tried to be consistent here and used \"ffdc\" as that is how the files are actually named.\n\n| Option (ibm.mq.trace)  | Description                                                                                                |\n| -----------------------| ---------------------------------------------------------------------------------------------------------- |\n| status                 | ON or OFF to control overall tracing                                                                       |\n| maxTraceBytes          | Limits on the trace output                                                                                 |\n| traceFileLimit         | Limits on the trace output                                                                                 |\n| traceFileCount         | Limits on the trace output                                                                                 |\n| parameterTrace         | true or false to control level of tracing                                                                  |\n| logFile                | Error log filename                                                                                         |\n| traceFile              | Trace log filename or directory. Can use %PID% in the name as a placeholder                                |\n| ffdcSuppress           | Suppress repeated instances of each FFDC                                                                   |\n| ffdcSuppressProbeIDs   | Completely suppress these specific FFDC Probes                                                             |\n| ffdcPath               | Directory for FFDCs. Generation of FFDCs cannot be fully suppressed - this directory must be writable.     |\n\n### Additional properties\n\nAdditional properties that are not in the recognised sets listed here can be put onto the Connection Factory via a map\nin the external properties definitions. Use the format `ibm.mq.additionalProperties.CONSTANT_NAME=value`. The\nCONSTANT_NAME can be either the real string for the property, and will often begin with \"XMSC\", or it can be the\nvariable as known in the WMQConstants class.\n\nFor example, the constant `WMQConstants.WMQ_SECURITY_EXIT` has the value `\"XMSC_WMQ_SECURITY_EXIT\"` and can be written\nin the properties file either as `ibm.mq.additionalProperties.XMSC_WMQ_SECURITY_EXIT=com.example.SecExit` or as\n`ibm.mq.additionalProperties.WMQ_SECURITY_EXIT=com.example.SecExit`\n\nThere is no error checking on the property name or value. This may help with enabling rarely-used properties and reduce\nthe need for a customizer method in application code. See\n[the KnowledgeCenter](https://www.ibm.com/docs/en/ibm-mq/latest?topic=messaging-mqconnectionfactoryconnectionfactoryproperty)\nfor a list of all the currently-recognised properties that may be set on a CF - though note that many are now\ndeprecated.\n\nIf the value looks like a number, it is treated as such. You can use hex constants beginning \"0X\" or decimals for a\nnumber. Similarly if the value is TRUE/FALSE then that is processed as a boolean. So you cannot try to set a string\nproperty that appears to be an integer. Symbols representing the value of integer attributes cannot be used - the real\nnumber must be given.\n\n## JNDI\nSpring already has configuration parameters for the use of a JNDI repository with a JMS program. See the\n[Spring documentation](https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/jms.html) for\nmore details.\n\nHowever this package also enables some simple use of JNDI for Connection definitions (but not Destinations, as they are\nstill always handled by the core Spring classes).\n\nYou can set the `ibm.mq.jndi.providerUrl` and `ibm.mq.jndi.providerContextFactory` attributes to define how the lookup\nis to be carried out. For example,\n\n```\n  ibm.mq.jndi.providerUrl=file:///home/username/mqjms/jndi\n  ibm.mq.jndi.providerContextFactory=com.sun.jndi.fscontext.RefFSContextFactory\n```\n\nIf you choose to use this mechanism, all of the other queue manager properties that might be defined in your resource\ndefinitions are ignored and not traced in order to avoid confusion. They will instead be picked up from the\nConnectionFactory definition in JNDI. The `queueManager` property is then more accurately used as the ConnectionFactory\nname used as the lookup. If you are using an LDAP JNDI provider, then the CF name will be modified if necessary to\nalways begin with `cn=`.\n\nThe `ibm.mq.jndi.additionalProperties` prefix can be used for any other JNDI-related properties that need to be applied\nto the *Context* object. The symbolic name of the field from that Java class can be used. For example,\n\n```\nibm.mq.jndi.additionalProperties.SECURITY_CREDENTIALS=passw0rd\n```\nresults in\n\n```\n  env.put(Context.SECURITY_CREDENTIALS,\"passw0rd\")\n```\n\nThe `MQConnectionFactoryFactory.getJndiContext` method is public so you can use it with your own constructed properties\nobject and get access to a JNDI Context object - it might make it easier to work with Destinations if you can reuse the\nsame way of getting directory access.\n\n## Logging \u0026 Tracing\nThe package makes use of the logging capabilities within Spring. You can enable tracing of this specific component in\nyour application's properties file by setting `logging.level.com.ibm.mq.spring.boot=TRACE`. Otherwise it uses the\nstandard inheritance of logging configuration from `logging.level.root`downwards.\n\n## Related documentation\n\n-   [MQ documentation](https://www.ibm.com/docs/en/ibm-mq/latest)\n-   [Spring Boot documentation](https://projects.spring.io/spring-boot/)\n-   [Spring Framework documentation](https://projects.spring.io/spring-framework/)\n\n\n### Contributions and Pull requests\n\nContributions to this package can be accepted under the terms of the Developer's Certificate of Origin, found in the\n[DCO file](DCO1.1.txt) of this repository. When submitting a pull request, you must include a statement stating you\naccept the terms in the DCO.\n\n### Using in Other Projects\n\nThe preferred approach for using this package in other projects will be to use the Gradle or Maven dependency as described above.\n\n### License\n\nCopyright © 2018, 2025 IBM Corp. All rights reserved.\n\nLicensed under the apache license, version 2.0 (the \"license\"); you may not use this file except in compliance with the\nlicense. You may obtain a copy of the license at\n\n    http://www.apache.org/licenses/LICENSE-2.0.html\n\nUnless required by applicable law or agreed to in writing, software distributed under the license is distributed on an\n\"as is\" basis, without warranties or conditions of any kind, either express or implied. See the license for the specific\nlanguage governing permissions and limitations under the license.\n\n### Health Warning\nThis package is provided as-is with no guarantees of support or updates. You cannot use IBM formal support channels\n(Cases/PMRs) for assistance with material in this repository. There are also no guarantees of compatibility with any\nfuture versions of the package; the API is subject to change based on any feedback. Versioned releases are made to\nassist with using stable APIs.\n\n### Issues\n\nBefore opening a new issue please consider the following:\n\n-   Please try to reproduce the issue using the latest version.\n-   Please check the [existing issues](https://github.com/ibm-messaging/mq-jms-spring/issues)\n    to see if the problem has already been reported. Note that the default search\n    includes only open issues, but it may already have been closed.\n-   When opening a new issue [here in github](https://github.com/ibm-messaging/mq-jms-spring/issues) please complete the template fully.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fibm-messaging%2Fmq-jms-spring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fibm-messaging%2Fmq-jms-spring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fibm-messaging%2Fmq-jms-spring/lists"}