听着窗外100岁老奶奶的丧乐,想着去年爷爷的逝去。感叹着人的一生实在太短了,而想做的事情还有太多太多.....默默的进入本文正题吧,一篇关于JMS相关处理器的学习记录。
什么是JMS?
JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。
NIFI和JMS相关的处理器有哪些?
GetJMSQueue GetJMSTopic PutJMS PublishJMS ConsumeJMS
处理器详情,见附录一~附录五
JMSConnectionFactoryProvider
controller service,见附录六
环境准备
第一步:找到starts最多的镜像
docker search activemq
第二步:下载镜像
docker pull webcenter/activemq
第三步:启动镜像
docker run -d --name activemq -p 61617:61616 -p 8162:8161 webcenter/activemq:latest
备注:
61616是 activemq 的容器使用端口(映射为61617)
8161是 web 页面管理端口(对外映射为8162)
第四步:验证访问ip:8162
用户名和密码都是admin
第五步:创建一个queue
第六步:创建一个topic
实战一:推送数据到主题并消费
备注:activemq的主题模式,类似是订阅模式。推送数据给主题,主题数据会推送给所有订阅者。区别kafka的主题模式,activemq只有当前处于订阅才能收到消息,不能重复推送数据,后订阅的不能消费到历史数据。
两个重要处理器的配置
PutJMS配置
GetJMSTopic配置
URL:activemq安装的时候暴露了两个端口,一个是web访问端口,一个就是这个用于消息推送的端口。url的格式是tcp://${your ip or hostname}:${your-port};
Destination Name:根据Destination Type来看,Destination Type是Topic就是主题名称,Destination Type是队列就是队列名称;
Destination Type:主题或者队列模式;
备注:GetJMSTopic会长期占用一个线程,所以GetJMSTopic不适合太多;
主题不需要提前创建,默认情况下不存在该主题的时候会自动创建;
实战二:推送数据到队列并消费
备注:activemq的队列模式,多个消费者情况下,走的是轮询策略。多个GetJMSQueue的话,发送到队列的数据,GetJMSQueue会轮流消费
PutJMS配置
GetJMSQueue配置
实战三:JMS规范自定义jar模式
备注:理论支持所有的JMS规范的数据推送和读取
JMSConnectionFactoryProvider配置
PublishJMS配置
ConsumeJMS配置
备注:此种模式尤其重要,理论上只要支持jms开发规范实现的数据处理方式,都能执行,所以这个对于新中间件的支持很动态,对于自定义模式最友好,因为我们可以自己按照JMS规范去开发相关的数据推送和读取单元;
实战一和实战二用到的处理器未来版本就会被废弃了
附录一:PutJMS
JMS Provider | ActiveMQ |
URL | JMS服务器的URL 格式:tcp://ip:port |
Destination Name | 队列名称或者主题名称 |
Destination Type | Queue/Topic |
Communications Timeout | 会话超时时间 |
Message Batch Size | 一次拉取数据条数 |
Username | 用户名 |
Password | 密码 |
SSL Context Service | 为了获得SSL上下文而使用的Controller Service |
Message Type | JMS消息的类型 |
Message Priority | 消息优先级 |
Reply-To Queue | 回复队列 |
Max Buffer Size | 一条消息最大体积默认1MB |
Message Time to Live | 消息在被删除之前应该在目标上保留的时间;如果未指定,该消息将永不过期。 |
Copy Attributes to JMS Properties | FlowFile属性是否应该转换为JMS消息属性。如果为true,则所有属性均以“ jms”开头。将在JMS消息上设置为“属性”(不带“ jms。”前缀)。如果存在以相同值开头但以“ .type”结尾的属性,则该属性将用于确定JMS消息属性类型。 |
Client ID Prefix | 客户端请求前缀 |
附录二:GetJMSQueue
JMS Provider | ActiveMQ |
URL | JMS服务器的URL 格式:tcp://ip:port |
Destination Name | 队列名称 |
Communications Timeout | 会话超时时间 |
Message Batch Size | 一次拉取数据条数 |
Username | 用户名 |
Password | 密码 |
SSL Context Service | 为了获得SSL上下文而使用的Controller Service |
Acknowledgement Mode | JMS确认模式。使用自动确认可能会导致在NiFi重新启动时丢失消息,但可能会提供比“客户端确认”更好的性能。 |
Message Selector | 为了缩小拉出的消息而使用的JMS消息选择器 |
Copy Attributes to JMS Properties | FlowFile属性是否应该转换为JMS消息属性。如果为true,则所有属性均以“ jms”开头。将在JMS消息上设置为“属性”(不带“ jms。”前缀)。如果存在以相同值开头但以“ .type”结尾的属性,则该属性将用于确定JMS消息属性类型。 |
Client ID Prefix | 客户端请求前缀 |
附录三:GetJMSTopic
JMS Provider | ActiveMQ |
URL | JMS服务器的URL 格式:tcp://ip:port |
Destination Name | 主题名称 |
Communications Timeout | 会话超时时间 |
Message Batch Size | 一次拉取数据条数 |
Username | 用户名 |
Password | 密码 |
SSL Context Service | 为了获得SSL上下文而使用的Controller Service |
Acknowledgement Mode | JMS确认模式。使用自动确认可能会导致在NiFi重新启动时丢失消息,但可能会提供比“客户端确认”更好的性能。 |
Message Selector | 为了缩小拉出的消息而使用的JMS消息选择器 |
Copy Attributes to JMS Properties | FlowFile属性是否应该转换为JMS消息属性。如果为true,则所有属性均以“ jms”开头。将在JMS消息上设置为“属性”(不带“ jms。”前缀)。如果存在以相同值开头但以“ .type”结尾的属性,则该属性将用于确定JMS消息属性类型。 |
Client ID Prefix | 客户端请求前缀 |
Use Durable Subscription | 如果为true,则与指定主题的连接将使用“持久订阅”,以便在不提取消息时将它们排队 |
附录四:PublishJMS
Connection Factory Service | 用于获取连接工厂的Controller Service |
Destination Name | JMS目标的名称 |
Destination Type | JMS目标的类型。可以是“ QUEUE”或“ TOPIC”之一。通常由管理员提供。默认为“ QUEUE” |
User Name | 用户名 |
Password | 密码 |
Connection Client ID | 要在连接上设置的客户端ID(如果已设置)。对于持久的非共享消费者,这是强制性的,对于所有其他消费者,它是可选的,通常对于共享消费者,这是不可取的。有关更多详细信息,请参见JMS规范。 |
session Cache size | 不推荐使用此属性,并且对处理器不再有任何影响。它将在更高版本中删除。 |
Message Body Type | JMS消息正文的类型 |
Character Set | 字符集 编码 |
Allow Illegal Characters in Header Names | 指定是否应将标头名称中的非法字符发送到JMS代理。通常是连字符和句号。 |
Attributes to Send as JMS Headers (Regex) | 指定用于确定应作为JMS标头发送的FlowFile属性名称的正则表达式 |
JNDI Initial Context Factory Class | JNDI初始上下文工厂类的完全限定的类名(java.naming.factory.initial) |
JNDI Provider URL | 要使用的JNDI提供程序的URL(java.naming.provider.url) |
JNDI Name of the Connection Factory | 要查找连接工厂的JNDI对象的名称 |
JNDI / JMS Client Libraries | 指定要添加到ClassPath以便加载JNDI / JMS客户端库的jar文件和/或目录(定义为逗号分隔的列表) |
JNDI Principal | 用JNDI(java.naming.security.principal)进行身份验证时要使用的主体 |
JNDI Credentials | 使用JNDI进行身份验证时要使用的凭证(java.naming.security.credentials) |
JMS Connection Factory Implementation Class | JMS ConnectionFactory实现类的标准名称(例如org.apache.activemq.ActiveMQConnectionFactory) |
JMS Client Libraries | 具有附加资源(例如JAR,配置文件等)的目录路径,该资源将添加到类路径(定义为用逗号分隔的值列表)中。这些资源通常代表ConnectionFactory实现的目标JMS客户端库 |
JMS Broker URI | 指向JMS消息代理的网络位置的URI |
JMS SSL Context Service | SSL上下文服务用于为TLS / SSL连接提供客户端证书信息 |
附录五:ConsumeJMS
Connection Factory Service | 用于获取连接工厂的Controller Service |
Destination Name | JMS目标的名称 |
Destination Type | JMS目标的类型。可以是“ QUEUE”或“ TOPIC”之一。通常由管理员提供。默认为“ QUEUE” |
User Name | 用户名 |
Password | 密码 |
Connection Client ID | 要在连接上设置的客户端ID(如果已设置)。对于持久的非共享消费者,这是强制性的,对于所有其他消费者,它是可选的,通常对于共享消费者,这是不可取的。有关更多详细信息,请参见JMS规范。 |
session Cache size | 不推荐使用此属性,并且对处理器不再有任何影响。它将在更高版本中删除。 |
Character Set | 字符集 编码 |
Acknowledgement Mode | JMS确认模式。使用自动确认可能会导致在NiFi重新启动时丢失消息,但可能会提供比“客户端确认”更好的性能。 |
Durable subscription | 如果目的地是主题(如果存在),则使它持久耐用。@see https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createDurableConsumer-javax.jms.Topic-java.lang.String |
Shared subscription | 如果目的地是主题(如果存在),则使其与消费者共享。@see https://docs.oracle.com/javaee/7/api/javax/jms/Session.html#createSharedConsumer-javax.jms.Topic-java.lang.String |
Subscription Name | 如果目的地为Topic且是共享的或持久的,则使用的订阅名称 |
Timeout | 放弃之前,等待等待多长时间,才能使用来自远程代理的消息 |
Error Queue Name | JMS队列的名称,如果设置了该名称,则将路由未处理的消息。通常由管理员提供(例如,“ queue:// myErrorQueue”或“ myErrorQueue”)。仅在“目标类型”设置为“ QUEUE”时适合用。 |
JNDI Initial Context Factory Class | JNDI初始上下文工厂类的完全限定的类名(java.naming.factory.initial) |
JNDI Provider URL | 要使用的JNDI提供程序的URL(java.naming.provider.url) |
JNDI Name of the Connection Factory | 要查找连接工厂的JNDI对象的名称 |
JNDI / JMS Client Libraries | 指定要添加到ClassPath以便加载JNDI / JMS客户端库的jar文件和/或目录(定义为逗号分隔的列表) |
JNDI Principal | 用JNDI(java.naming.security.principal)进行身份验证时要使用的主体 |
JNDI Credentials | 使用JNDI进行身份验证时要使用的凭证(java.naming.security.credentials) |
JMS Connection Factory Implementation Class | JMS ConnectionFactory实现类的标准名称(例如org.apache.activemq.ActiveMQConnectionFactory) |
JMS Client Libraries | 具有附加资源(例如JAR,配置文件等)的目录路径,该资源将添加到类路径(定义为用逗号分隔的值列表)中。这些资源通常代表ConnectionFactory实现的目标JMS客户端库 |
JMS Broker URI | 指向JMS消息代理的网络位置的URI |
JMS SSL Context Service | SSL上下文服务用于为TLS / SSL连接提供客户端证书信息 |
附录六:JMSConnectionFactoryProvider
JMS Connection Factory Implementation Class | JMS ConnectionFactory实现类的标准名称(例如org.apache.activemq.ActiveMQConnectionFactory) |
JMS Client Libraries | 具有附加资源(例如JAR,配置文件等)的目录路径,该资源将添加到类路径(定义为用逗号分隔的值列表)中。这些资源通常代表ConnectionFactory实现的目标JMS客户端库 |
JMS Broker URI | 指向JMS消息代理的网络位置的URI。ActiveMQ的示例:“ tcp:// myhost:61616”。IBM MQ的示例:“ myhost(1414)”和“ myhost01(1414),myhost02(1414)”。 |
JMS SSL Context Service | SSL上下文服务用于为TLS / SSL连接提供客户端证书信息。 |