Solon 集成 activemq-client

server/2024/12/22 15:23:20/

原始状态的 activemq-client sdk 集成非常方便,也更适合定制。就是有些同学,可能对原始接口会比较陌生,会希望有个具体的示例。

<dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-client</artifactId><version>${activemq.version}</version>
</dependency><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-pool</artifactId><version>${activemq.version}</version>
</dependency>

希望更加简化使用的同学,可以使用:

activemq-solon-cloud-plugin (使用更简单,定制性弱些)

1、添加集成配置

先使用 Solon 初始器 先生成一个 Solon Web 模板项目,然后添加上面的 activemq-client 依赖。再做个配置约定(也可按需定义):

  • "solon.activemq",作为配置前缀
    • "properties",作为公共配置
    • "producer",作为生态者专属配置(估计用不到)
    • "consumer",作为消费者专属配置(估计用不到)

具体的配置属性,参考自:ActiveMQConnectionFactory

solon.app:name: "demo-app"group: "demo"# 配置可以自由定义,与 @Bean 代码对应起来即可(以下为参考)
solon.activemq:properties:  #公共配置(配置项,参考:ActiveMQConnectionFactory)brokerURL: "failover:tcp://localhost:61616"redeliveryPolicy:initialRedeliveryDelay: 5000backOffMultiplier: 2useExponentialBackOff: truemaximumRedeliveries: -1maximumRedeliveryDelay: 3600_000

添加 java 配置器

@Configuration
public class ActivemqConfig {@Bean(destroyMethod = "stop")public Connection client(@Inject("${solon.activemq.properties}") Props common) throws Exception {String brokerURL = (String) common.remove("brokerURL");String userName = (String) common.remove("userName");String password = (String) common.remove("password");ActiveMQConnectionFactory factory;if (Utils.isEmpty(userName)) {factory = new ActiveMQConnectionFactory(brokerURL);} else {factory = new ActiveMQConnectionFactory(brokerURL, userName, password);}//绑定额外的配置并创建连接Connection connection = common.bindTo(factory).createConnection();connection.start();return connection;}@Beanpublic IProducer producer(Connection connection) throws Exception {return new IProducer(connection);}@Beanpublic void consumer(Connection connection,MessageListener messageListener) throws Exception {Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);Destination destination = session.createTopic("topic.test");MessageConsumer consumer = session.createConsumer(destination);consumer.setMessageListener(messageListener);}
}

activemq 的消息发送的代码比较复杂,所以我们可以做个包装处理(用于上面的配置构建),临时命名为 IProducer:

public class IProducer {private Connection connection;public IProducer(Connection connection) {this.connection = connection;}public void send(String topic, MessageBuilder messageBuilder) throws JMSException {Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);Destination destination = session.createTopic(topic);MessageProducer producer = session.createProducer(destination);producer.send(destination, messageBuilder.build(session));}@FunctionalInterfacepublic static interface MessageBuilder {Message build(Session session) throws JMSException;}
}

3、代码应用

发送(或生产),这里代控制器由用户请求再发送消息(仅供参考):

@Controller
public class DemoController {@Injectprivate IProducer producer;@Mapping("/send")public void send(String msg) throws Exception {//发送producer.send("topic.test", s -> s.createTextMessage("test"));}
}

监听(或消费),这里采用订阅回调的方式:(仅供参考)

@Component
public class DemoMessageListener implements MessageListener {@Overridepublic void onMessage(Message message) {System.out.println(message);RunUtil.runAndTry(message::acknowledge);}
}

 


http://www.ppmy.cn/server/152252.html

相关文章

【redis的使用、账号流程、游戏服Handler的反射调用】1.自增id 2.全局用户名这样子名字唯一 3.

一、web服 1)账号注册 // 用于唯一命名服务 com.xinyue.game.center.business.account.logic.AccountRegisterService#accountRegister public void accountRegister(AccountEntity account) {accountManager.checkUsername(account.getUsername());accountManager.checkPass…

写SQL太麻烦?免费搭建 Text2SQL 应用,智能写 SQL | OceanBase AI 实践

自OceanBase 4.3.3版本推出以来&#xff0c;向量检索的能力受到了很多客户的关注&#xff0c;也纷纷表达希望OB能拓展更多 多模数据库大模型 的AI应用实践。 在上篇文章 &#x1f449; OceanBase LLM&#xff0c;免费构建你的专属 AI 助手 &#xff0c;我们介绍了如何去搭建一…

React+Vite项目框架

基于React Vite 搭建的项目框架&#xff0c;使用ESLint 用于代码检查 、Prettier 用于代码格式化、Husky 用于 Git 钩子、lint-staged 用于暂存文件的检查、commitlint 用于提交信息规范等&#xff0c;实现了路由配置、状态管理、样式响应式设计、亮/暗主题切换等功能。 做这…

python学opencv|读取图像(十五)BGR图像和HSV图像通道合并

【1】引言 前序学习进程中&#xff0c;已经掌握了BGR图像和HSV图像通道拆分的基本技巧&#xff0c;即使用split()函数抓取各个通道的具体数值。具体文章链接为&#xff1a; python学opencv|读取图像&#xff08;十四&#xff09;BGR图像和HSV图像通道拆分-CSDN博客 在此基础…

ECharts柱状图-柱图38,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

YOLOv9-0.1部分代码阅读笔记-downloads.py

downloads.py utils\downloads.py 目录 downloads.py 1.所需的库和模块 2.def is_url(url, checkTrue): 3.def gsutil_getsize(url): 4.def url_getsize(urlhttps://ultralytics.com/images/bus.jpg): 5.def safe_download(file, url, url2None, min_bytes1E0, erro…

36.5 自定义指标接入prometheus-operator

prometheus-operator优势总结 自定义的采集配置接入更方便&#xff0c;只要定义serviceMonitor即可采集的参数修改也很方便&#xff0c;对比之前只能由prometheus管理员修改job段配置告警配置也是 prometheus-operator劣势总结 数据的长期存储没有解决高可用性和扩展性没解决…

Linux文件属性 --- 查看修改日期、时间、时区,查看日历

1.查看日期 使用date 命令可以显示或设置系统的时间或日期 &#xff0c;下面为比较常用的参数列举。 date [参数] [日期格式] 写法功能描述date显示当前时间date %Y显示当前年份date %m显示当前月份date %d显示当前天数%H小时&#xff08;00~23&#xff09;%I小时&#xff08;…