最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過(guò)Docker啟動(dòng)Solace并在Spring?Boot通過(guò)JMS整合Solace的操作方法

 更新時(shí)間:2023年01月18日 09:32:18   作者:南瓜慢說(shuō)  
本文將介紹如何在Spring中使用,雖然代碼使用的是Spring Boot,但并沒(méi)有使用相關(guān)starter,跟Spring的整合一樣,可通用,JMS是通過(guò)的消息處理框架,可以深入學(xué)習(xí)一下,不同的MQ在JMS的整合上都是類(lèi)似的,感興趣的朋友跟隨小編一起看看吧

1 簡(jiǎn)介

Solace是一個(gè)強(qiáng)大的實(shí)時(shí)性的事件驅(qū)動(dòng)消息隊(duì)列。本文將介紹如何在Spring中使用,雖然代碼使用的是Spring Boot,但并沒(méi)有使用相關(guān)starter,跟Spring的整合一樣,可通用。JMS是通過(guò)的消息處理框架,可以深入學(xué)習(xí)一下,不同的MQ在JMS的整合上都是類(lèi)似的。

2 通過(guò)Docker啟動(dòng)Solace

有兩種方式試用Solace,一種是通過(guò)Docker來(lái)啟動(dòng),另一種是使用Cloud版本,但Cloud版本有試用期限,我們使用Docker來(lái)啟動(dòng)吧。

先下載鏡像:

$ docker pull solace/solace-pubsub-standard:9.13.0.16

然后通過(guò)以下命令啟動(dòng):

$ docker run -d -p 8080:8080 -p 55554:55555 -p 8008:8008 -p 1883:1883 -p 8000:8000 -p 5672:5672 -p 9000:9000 -p 2222:2222 --shm-size=2g --env username_admin_globalaccesslevel=admin --env username_admin_password=admin --name=solace solace/solace-pubsub-standard:9.13.0.16

這里端口改為55554,是因?yàn)镸ac的原因。

然后便可以訪問(wèn)來(lái)登陸管理界面:http://localhost:8080/

用戶(hù)名密碼為:admin/admin

登陸后可以看到如下界面,Solace按VPN來(lái)管理隊(duì)列,VPN有點(diǎn)像分組,比如某個(gè)業(yè)務(wù)線使用某個(gè)VPN。

我們?cè)?code>default的VPN上創(chuàng)建一個(gè)Queue,名為pkslow-queue

其它設(shè)置如下:

接著在該Queue上創(chuàng)建Topic:

創(chuàng)建完成后,我們可以直接測(cè)試一下:

可以Publish到Topic或Queue,也可以從其中一個(gè)Subscribe。

完成以上設(shè)置后,我們就可以在Spring Boot中整合了。

3 Spring Boot JMS整合Solace

3.1 發(fā)送消息

我們是通過(guò)JmsTemplate來(lái)發(fā)送消息的,而JmsTemplate需要連接到MQ,就需要一個(gè)ConnectionFactory,這個(gè)Factory是帶著MQ的一些連接信息。配置代碼如下:

@Configuration
public class SolacePubConfig {

    private final SolaceProperties solaceProperties;

    public SolacePubConfig(SolaceProperties solaceProperties) {
        this.solaceProperties = solaceProperties;
    }

    @Bean("connectionFactory")
    public ConnectionFactory connectionFactory() throws Exception {
        Properties env = new Properties();
        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());
        return SolJmsUtility.createConnectionFactory(env);
    }

    @Bean
    public CachingConnectionFactory cachingConnectionFactory(ConnectionFactory connectionFactory) {
        CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(connectionFactory);
        cachingConnectionFactory.setSessionCacheSize(10);
        return cachingConnectionFactory;
    }

    @Bean
    public JmsTemplate pubJmsTemplate(CachingConnectionFactory cachingConnectionFactory) {
        JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
        jmsTemplate.setPubSubDomain(true);
        jmsTemplate.setExplicitQosEnabled(true);
        jmsTemplate.setDeliveryPersistent(true);
        jmsTemplate.setDefaultDestinationName(solaceProperties.getDefaultPubDestinationName());
        return jmsTemplate;
    }
}

生成JmsTemplate后,就可以引用并發(fā)送消息了:

@RestController
@RequestMapping("/solace")
public class SolaceTestController {
    private final JmsTemplate pubJmsTemplate;
    private final SolaceProperties solaceProperties;

    public SolaceTestController(JmsTemplate pubJmsTemplate, SolaceProperties solaceProperties) {
        this.pubJmsTemplate = pubJmsTemplate;
        this.solaceProperties = solaceProperties;
    }

    @GetMapping
    public String send() {
        pubJmsTemplate.send(solaceProperties.getDefaultPubDestinationName(), session -> session.createTextMessage("www.pkslow.com"));
        pubJmsTemplate.send(session -> session.createTextMessage("Larry Deng"));
        return "OK";
    }
}

用到的屬性配置如下:

server.port=8083

pkslow.solace.brokerUrl=smf://127.0.0.1:55554
pkslow.solace.vpn=default
pkslow.solace.username=default
pkslow.solace.password=default
pkslow.solace.defaultPubDestinationName=pkslow-topic
pkslow.solace.defaultSubDestinationName=pkslow-queue
@Configuration
@ConfigurationProperties(prefix = "pkslow.solace")
@Setter
@Getter
public class SolaceProperties {
    private String brokerUrl;
    private String vpn;
    private String username;
    private String password;
    private String defaultPubDestinationName;
    private String defaultSubDestinationName;
}

3.2 接收消息

我們通過(guò)MessageListenerContainer來(lái)接收消息,MessageListenerContainer也需要一個(gè)ConnectionFactory,也有MQ的連接信息。還需要一個(gè)MessageListener,用來(lái)定義如何處理消息。我們的配置如下:

@Configuration
@Slf4j
public class SolaceSubConfig {
    private final SolaceProperties solaceProperties;

    public SolaceSubConfig(SolaceProperties solaceProperties) {
        this.solaceProperties = solaceProperties;
    }

    @Bean
    public SingleConnectionFactory singleConnectionFactory(@Qualifier("connectionFactory") ConnectionFactory targetConnectionFactory) {
        return new SingleConnectionFactory(targetConnectionFactory);
    }

    @Bean
    public MessageListener messageListener() {
        return message -> {
            try {
                log.info("Received message " + ((TextMessage) message).getText() + " on destination: " +
                        message.getJMSDestination().toString());
            } catch (JMSException ex) {
                throw new RuntimeException(ex);
            }
        };
    }
    @Bean
    public MessageListenerContainer messageListenerContainer(SingleConnectionFactory singleConnectionFactory, MessageListener messageListener) {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setConnectionFactory(singleConnectionFactory);
        container.setDestinationName(solaceProperties.getDefaultSubDestinationName());
        container.setMessageListener(messageListener);

        return container;
    }
}

這里@Qualifier("connectionFactory") ConnectionFactory targetConnectionFactory復(fù)用了在SolacePubConfig創(chuàng)建的對(duì)象。

3.3 測(cè)試

發(fā)送GET請(qǐng)求就可以觸發(fā)發(fā)送了:

GET http://localhost:8083/solace

我發(fā)了三次,結(jié)果日志如下:

4 代碼

代碼請(qǐng)看GitHub: https://github.com/LarryDpk/pkslow-samples

References:

Docker available image tags

Docker Solace Guide

Spring Solace

到此這篇關(guān)于通過(guò)Docker啟動(dòng)Solace,并在Spring Boot通過(guò)JMS整合Solace的文章就介紹到這了,更多相關(guān)Spring Boot通過(guò)JMS整合Solace內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文詳細(xì)解析Java?8?Stream?API中的flatMap方法

    一文詳細(xì)解析Java?8?Stream?API中的flatMap方法

    這篇文章主要介紹了Java?8?Stream?API中的flatMap方法的相關(guān)資料,flatMap方法是Java?StreamAPI中的重要中間操作,用于將流中的每個(gè)元素轉(zhuǎn)換為一個(gè)新的流,并將多個(gè)流合并為一個(gè)單一的流,常用于處理嵌套集合和一對(duì)多映射,需要的朋友可以參考下
    2024-12-12
  • Java中ArrayList的使用詳細(xì)介紹

    Java中ArrayList的使用詳細(xì)介紹

    這篇文章主要介紹了Java中ArrayList的使用,本文給大家詳細(xì)講述該相關(guān)的知識(shí)點(diǎn),并且會(huì)通過(guò)大量的案例加以說(shuō)明,需要的朋友可以參考一下
    2022-04-04
  • 徹底搞懂Java多線程(二)

    徹底搞懂Java多線程(二)

    這篇文章主要給大家介紹了關(guān)于Java面試題之多線程和高并發(fā)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • Java繼承方法重寫(xiě)實(shí)現(xiàn)原理及解析

    Java繼承方法重寫(xiě)實(shí)現(xiàn)原理及解析

    這篇文章主要介紹了Java繼承方法重寫(xiě)實(shí)現(xiàn)原理及解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 分享Java開(kāi)發(fā)必須掌握的日志分析命令

    分享Java開(kāi)發(fā)必須掌握的日志分析命令

    這篇文章主要介紹了分享Java開(kāi)發(fā)必須掌握的日志分析命令,在日常工作中,如果我們遇到線上問(wèn)題,一般的處理步驟應(yīng)該是先保留現(xiàn)場(chǎng),然后再考慮回滾,之后再是解決問(wèn)題
    2019-07-07
  • Java分布式鎖理論(redis、zookeeper))案例詳解

    Java分布式鎖理論(redis、zookeeper))案例詳解

    zookeeper有個(gè)節(jié)點(diǎn)路徑的概念,節(jié)點(diǎn)路徑不能重復(fù),保證了唯一性,這篇文章給大家介紹Java分布式鎖理論(redis、zookeeper)?案例詳解,感興趣的朋友跟隨小編一起看看吧
    2024-01-01
  • springboot如何去除debug日志

    springboot如何去除debug日志

    這篇文章主要介紹了springboot如何去除debug日志的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 關(guān)于Java語(yǔ)法糖以及語(yǔ)法糖的原理和用法

    關(guān)于Java語(yǔ)法糖以及語(yǔ)法糖的原理和用法

    這篇文章主要介紹了關(guān)于Java什么是語(yǔ)法糖以及語(yǔ)法糖的種類(lèi),也稱(chēng)糖衣語(yǔ)法,是由英國(guó)計(jì)算機(jī)學(xué)家?Peter.J.Landin?發(fā)明的一個(gè)術(shù)語(yǔ),指在計(jì)算機(jī)語(yǔ)言中添加的某種語(yǔ)法,這種語(yǔ)法對(duì)語(yǔ)言的功能并沒(méi)有影響,但是更方便程序員使用,需要的朋友可以參考下
    2023-05-05
  • Spring無(wú)法接收List<event>的解決方案

    Spring無(wú)法接收List<event>的解決方案

    在日常開(kāi)發(fā)中,我們常使用 Spring 的 @EventListener 注解來(lái)監(jiān)聽(tīng)事件,但在處理 批量事件 時(shí),卻可能遇到一些“看似合理但無(wú)法生效”的監(jiān)聽(tīng)方式,本文以實(shí)際具體案例為出發(fā)點(diǎn),結(jié)合源碼分析事件派發(fā)邏輯,并給出兩種可行解決方案,需要的朋友可以參考下
    2025-04-04
  • java ThreadPoolExecutor線程池拒絕策略避坑

    java ThreadPoolExecutor線程池拒絕策略避坑

    這篇文章主要為大家介紹了java ThreadPoolExecutor拒絕策略避坑踩坑示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07

最新評(píng)論

北宁市| 嘉兴市| 柳州市| 无为县| 南郑县| 红原县| 合江县| 丹凤县| 三原县| 吴旗县| 龙州县| 武穴市| 临武县| 奉化市| 南丹县| 加查县| 红河县| 前郭尔| 宾川县| 鹤壁市| 青冈县| 景泰县| 宝山区| 常熟市| 库尔勒市| 苏尼特右旗| 布尔津县| 两当县| 新乡县| 崇明县| 达孜县| 射阳县| 喜德县| 贵南县| 巴林右旗| 麻栗坡县| 绩溪县| 日土县| 家居| 曲沃县| 夏邑县|