当前位置: 首页 > 后端技术 > Java

通过Docker启动Solace,通过JMS在SpringBoot中集成Solace

时间:2023-04-01 22:17:50 Java

1简介Solace是一个强大的实时事件驱动消息队列。本文将介绍如何在Spring中使用它。代码中虽然使用了SpringBoot,但是并没有使用相关的starter。与Spring的集成一样,可以通用。JMS是采用的一种消息处理框架,大家可以深入研究一下,不同的MQ在JMS的集成上大同小异。2通过Docker启动Solace尝试Solace有两种方式,一种是通过Docker启动,另一种是使用Cloud版本,但是Cloud版本有试用期,还是用Docker启动吧。首先下载镜像:$dockerpullsolace/solace-pubsub-standard:9.13.0.16并使用以下命令启动它:$dockerrun-d-p8080:8080-p55554:55555-p8008:8008-p1883:1883-p8000:8000-p5672:5672-p9000:9000-p2222:2222--shm-size=2g--envusername_admin_globalaccesslevel=admin--envusername_admin_password=admin--name=安慰安慰/安慰-pubsub-standard:9.13.0.16这里的端口因为Mac的原因改为55554。然后可以访问登录管理界面:http://localhost:8080/用户名和密码:admin/admin登录后可以看到如下界面。Solace根据VPN管理队列。VPN有点像分组,比如某个业务线使用VPN。我们在默认的VPN上创建一个名为pkslow-queue的Queue:其他设置如下:然后在Queue上创建一个Topic:创建完成后,我们可以直接测试:我们可以发布到Topic或者Queue,或者从一个其中订阅。完成以上设置后,我们就可以在SpringBoot中进行集成了。3SpringBootJMS集成Solace3.1发送消息我们通过JmsTemplate发送消息,而JmsTemplate需要连接MQ,所以需要一个ConnectionFactory,它承载了MQ的一些连接信息。配置代码如下:@ConfigurationpublicclassSolacePubConfig{privatefinalSolacePropertiessolaceProperties;publicSolacePubConfig(SolacePropertiessolaceProperties){this.solaceProperties=solaceProperties;}@Bean("connectionFactory")publicConnectionFactoryconnectionFactory()throwsException{Propertiesenv=newProperties();env.put(InitialContext.INITIAL_CONTEXT_FACTORY,"com.solacesystems.jndi.SolJNDIInitialContextFactory");env.put(InitialContext.PROVIDER_URL,solaceProperties.getBrokerUrl());env.put(SupportedProperty.SOLACE_JMS_VPN,solaceProperties.getVpn());env.put(InitialContext.SECURITY_PRINCIPAL,solaceProperties.getUsername());env.put(InitialContext.SECURITY_CREDENTIALS,solaceProperties.getPassword());返回SolJmsUtility.createConnectionFactory(env);}@BeanpublicCachingConnectionFactorycachingConnectionFactory(ConnectionFactoryconnectionFactory){CachingConnectionFactorycachingConnectionFactory=newCachingConnectionFactory(connectionFactory);cachingConnectionFactory.setSessionCacheSize(10);返回缓存连接工厂;}@BeanpublicJmsTemplatepubJmsTemplate(CachingConnectionFactorycachingConnectionFactory){JmsTemplatejmsTemplate=newJmsTemplate(cachingConnectionFactory);jmsTemplate.setPubSubDomain(true);jmsTemplate.setExplicitQosEnabled(true);jmsTemplate.setDeliveryPersistent(true);jmsTemplate.setDefaultDestinationName(solaceProperties.getDefaultPubDestinationName());返回jmsTemplate;}}生成JmsTemplate后,就可以引用并发送消息了:@RestController@RequestMapping("/solace")publicclassSolaceTestController{privatefinalJmsTemplatepubJmsTemplate;私有最终SolacePropertiessolaceProperties;公共SolaceTestController(JmsTemplatepubJmsTemplate,SolacePropertiessolaceProperties){this.pubJmsTemplate=pubJmsTemplate;this.solaceProperties=solaceProperties;}@GetMappingpublicStringsend(){pubJmsTemplate.send(solaceProperties.getDefaultPubDestinationName(),session->session.createTextMessage("www.pkslow.com"));pubJmsTemplate.send(session->session.createTextMessage("LarryDeng"));返回“确定”;}}使用到的属性配置如下:server.port=8083pkslow.solace.brokerUrl=smf://127.0.0.1:55554pkslow.solace.vpn=defaultpkslow.solace.username=defaultpkslow.solace.password=defaultpkslow.solace.defaultPubDestinationName=pkslow-topicpkslow.solace.defaultSubDestinationName=pkslow-queue@Configuration@ConfigurationProperties(prefix="pkslow.solace")@Setter@Getterpublic类SolaceProperties{privateStringbrokerUrl;私人字符串vpn;私有字符串用户名;私有字符串密码;私有字符串defaultPubDestinat离子名称;privateStringdefaultSubDestinationName;}3.2接收消息我们通过MessageListenerContainer接收消息,MessageListenerContainer还需要一个ConnectionFactory,MQ连接信息也需要一个MessageListener来定义如何处理消息。我们的配置如下:@Configuration@Slf4jpublicclassSolaceSubConfig{privatefinalSolacePropertiessolaceProperties;publicSolaceSubConfig(SolacePropertiessolaceProperties){this.solaceProperties=solaceProperties;}@BeanpublicSingleConnectionFactorysingleConnectionFactory(@Qualifier("connectionFactory")ConnectionFactorytargetConnectionFactory){返回新的SingleConnectionFactory(targetConnectionFactory);}@BeanpublicMessageListenermessageListener(){returnmessage->{try{log.info("Receivedmessage"+((TextMessage)message).getText()+"ondestination:"+message.getJMSDestination().toString());}catch(JMSExceptionex){thrownewRuntimeException(ex);}};}@BeanpublicMessageListenerContainermessageListenerContainer(SingleConnectionFactorysingleConnectionFactory,MessageListenermessageListener){DefaultMessageListenerContainercontainer=newDefaultMessageListenerContainer();container.setConnectionFactory(singleConnectionFactory);container.setDestinationName(solaceProperties.getDefaultSubDestinationName());container.setMessageListener(messageListener);返回容器;}}这里@Qualifier("connectionFactory")ConnectionFactorytargetConnectionFactory复用了SolacePubConfig3.3Test中创建的对象发送GET请求可以触发发送:GEThttp://localhost:8083/solace我发送了3次,结果日志为如下:4代码代码参见GitHub:https://github.com/LarryDpk/p...参考:Docker可用镜像标签DockerSolaceGuideSpringSolace