热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ActiveMQ学习系列(二)生产者客户端(java)

上文主要简单地将activeMq搭建了起来,并且可以用webconsole去登录查看相关的后台功能。本文将学习如何用java语言实现一个生产者客户端,主

上文主要简单地将activeMq搭建了起来,并且可以用web console去登录查看相关的后台功能。

本文将学习如何用java语言实现一个生产者客户端,主要参考了以下链接:

http://activemq.apache.org/jndi-support.html

代码已上传github,建议先下载下来实际运行一遍:

https://github.com/cctvckl/big-data-learning/tree/master/activemq-learning

 

一、ActiveMq支持的协议

ActiveMq作为消息中间件,支持多种连接协议,如:tcp、amqp、stomp、mqtt等。

如果启动时以./activemq console方式启动,可以看到如下输出:

而下文将要讲解的java客户端程序,就是基于其中的tcp协议。

将tcp://host:port这个地址记录下来,下面需要用到。

二、大体思路

1、本地配置文件,配置要连接的ActiveMq服务器、包括连接协议和端口号,配置要发送消息的目标队列、目标topic等等。

2、程序读取上述配置文件,生成连接会话、生成消息生产者、发送消息、关闭连接。
三、具体步骤

1、配置文件样例:

java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory# Use the following property to configure the default connector
java.naming.provider.url = tcp://192.168.2.140:61616# Use the following property to specify the JNDI name the connection factory
# should appear as.
connectionFactoryNames = ConnectionFactory, queueConnectionFactory, topicConnectionFactry# Register some queues in JNDI using the form:
# queue.[jndiName] = [physicalName]
queue.MyQueue = example.MyQueue# Register some topics in JNDI using the form:
# topic.[jndiName] = [physicalName]
topic.MyTopic = example.MyTopic

释义:上面的url项要与第一章节里面的那个地址匹配;

topic.MyTopic中的点号分割开的第二部分(此例为MyTopic)会被注册为JNDI名, 至于value(example.MyTopic)为topic名,在Web Console可以看到。

 

queue.MyQueue同理。

 

2、配置文件完毕,下面介绍业务代码:

package com.ckl.activemq;
/*** The SimpleQueueSender class consists only of a main method,* which sends several messages to a queue.** Run this program in conjunction with SimpleQueueReceiver.* Specify a queue name on the command line when you run the* program. By default, the program sends one message. Specify* a number after the queue name to send that number of messages.*/import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.jms.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;/*** A simple polymorphic JMS producer which can work with Queues or Topics which* uses JNDI to lookup the JMS connection factory and destination.*/
public class SimpleProducer {private static final Logger LOG = LoggerFactory.getLogger(SimpleProducer.class);private SimpleProducer() {}/*** @param args the destination name to send to and optionally, the number of* messages to send*/public static void main(String[] args) {Context jndiContext = null;ConnectionFactory connectionFactory = null;Connection connection = null;Session session = null;Destination destination = null;MessageProducer producer = null;String destinationName = null;final int numMsgs;
    //这边被我手动修改了,比较不喜欢每次运行时还要修改Run configuration,麻烦。args
&#61; new String[2];args[0] &#61; "MyTopic";args[1] &#61; "3";if ((args.length <1) || (args.length > 2)) {LOG.info("Usage: java SimpleProducer []");System.exit(1);}destinationName &#61; args[0];LOG.info("Destination name is " &#43; destinationName);if (args.length &#61;&#61; 2) {numMsgs &#61; (new Integer(args[1])).intValue();}else {numMsgs &#61; 1;}/** Create a JNDI API InitialContext object*/try {jndiContext &#61; new InitialContext();}catch (NamingException e) {LOG.info("Could not create JNDI API context: " &#43; e.toString());System.exit(1);}/** Look up connection factory and destination.*/try {connectionFactory &#61; (ConnectionFactory)jndiContext.lookup("ConnectionFactory");destination &#61; (Destination)jndiContext.lookup(destinationName);}catch (NamingException e) {LOG.info("JNDI API lookup failed: " &#43; e);System.exit(1);}/** Create connection. Create session from connection; false means* session is not transacted. Create sender and text message. Send* messages, varying text slightly. Send end-of-messages message.* Finally, close the connection.*/try {connection &#61; connectionFactory.createConnection();session &#61; connection.createSession(false, Session.AUTO_ACKNOWLEDGE);producer &#61; session.createProducer(destination);TextMessage message &#61; session.createTextMessage();for (int i &#61; 0; i ) {message.setText("This is message " &#43; (i &#43; 1));LOG.info("Sending message: " &#43; message.getText());producer.send(message);}/** Send a non-text control message indicating end of messages.*/producer.send(session.createMessage());}catch (JMSException e) {LOG.info("Exception occurred: " &#43; e);}finally {
       //睡眠是我手动加的&#xff0c;主要为了观察效果
try {Thread.sleep(100000L);} catch (InterruptedException e) {e.printStackTrace();}if (connection !&#61; null) {try {connection.close();}catch (JMSException ignored) {}}}}
}

代码不难理解&#xff1a;jndi读取配置文件&#xff0c;建立连接&#xff0c;发消息&#xff0c;关闭连接。

运行结果&#xff1a;

 

此时查看Web Console&#xff0c;

可以看到来自客户端的连接信息。

 

本例子就先到这里&#xff0c;详细还请参考贴的代码链接和官网文档。

欢迎留言交流。

 

转:https://www.cnblogs.com/grey-wolf/p/6526352.html



推荐阅读
  • 微信小程序支付官方参数小程序中代码后端发起支付代码支付回调官方参数文档地址:https:developers.weixin.qq.comminiprogramdeva ... [详细]
  • Cadence SPB 16.5 安装指南与注意事项
    本文提供了详细的 Cadence SPB 16.5 安装步骤,包括环境配置、安装过程中的关键步骤以及常见问题的解决方案。适合初次安装或遇到问题的技术人员参考。 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 解析 HTTP 头 'Vary: Accept-Encoding' 的作用与重要性
    本文详细探讨了 'Vary: Accept-Encoding' HTTP 头的作用,即指导缓存系统(如代理服务器和 CDN)根据不同的编码需求存储和提供适当的资源版本,确保不同类型的客户端能够接收到适合自己的内容。 ... [详细]
  • Web网络基础
    目录儿1使用HTTP协议访问Web2HTTP的诞生2.1因特网的起源2.2互联网、因特网与万维网2.3万维网与HTTP3网络基础TCPIP3.1TCPIP协议族3.2TCPIP的分 ... [详细]
  • 本文档提供了详细的MySQL安装步骤,包括解压安装文件、选择安装类型、配置MySQL服务以及设置管理员密码等关键环节,帮助用户顺利完成MySQL的安装。 ... [详细]
  • HTTP中的Chunked编码与Content-Length的区别及应用场景
    本文探讨了在HTTP协议中,当使用Transfer-Encoding为chunked时为何无需设置Content-Length,以及这种编码方式的具体实现和优势。 ... [详细]
  • 对于初次购买阿里云服务器的新手用户来说,如何高效地利用服务器资源并成功部署网站是一个重要的课题。本文将详细指导您完成从购买服务器到网站上线的六个关键步骤。 ... [详细]
  • 微服务自动化.dockercompose
    目录一、docker-compose二、docker-compose安装与配置1、修改docker.service2、下载文件3、将刚才下载的docker-compose文 ... [详细]
  • Git版本控制基础解析
    本文探讨了Git作为版本控制工具的基本概念及其重要性,不仅限于代码管理,还包括文件的历史记录与版本切换功能。通过对比Git与SVN,进一步阐述了分布式版本控制系统的独特优势。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • 本文旨在为初学者提供一个详细的指南,从零开始学习如何使用 ASP.NET MVC5 和 Entity Framework 6 (EF6) 搭建项目。通过逐步指导,帮助读者理解 MVC 架构的核心概念,并掌握基本的操作方法。 ... [详细]
  • index.js全部js兼容性处理。js内引入babelpolyfill全部js兼容性处理。babelpolyfillimportbabelpolyfill;constadd ... [详细]
author-avatar
手机用户2502920043
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有