PutTCP中能否使用动态主机名?如何从前置处理器传递主机名参数
解决方案
NiFi 原生 PutTCP 组件的主机名、端口配置项确实仅支持读取变量注册表/环境变量,不支持从FlowFile属性中动态取值,这是组件设计的固有约束,可通过以下方案解决:
方案1:使用ExecuteScript实现(推荐,轻量无额外依赖)
- 在
HandleHttpRequest组件后新增UpdateAttribute处理器,新增自定义属性:
提前解析出打印服务器IP,存入FlowFile属性中。printer_host = ${http.request.uri:substringAfterLast('/'):trim()} - 替换原有
PutTCP组件为ExecuteScript处理器,脚本语言选择Groovy,填入以下执行逻辑:import java.net.Socket import org.apache.commons.io.IOUtils flowFile = session.get() if (!flowFile) return try { // 读取FlowFile属性中的打印服务器IP def printerHost = flowFile.getAttribute('printer_host') def printerPort = 9100 // 建立TCP连接 def socket = new Socket(printerHost, printerPort) def out = socket.getOutputStream() // 原封不动写入请求体内容 session.read(flowFile, { inputStream -> IOUtils.copy(inputStream, out) } as InputStreamCallback) // 释放资源 out.flush() out.close() socket.close() // 路由到成功分支 session.transfer(flowFile, REL_SUCCESS) } catch (Exception e) { // 打印错误日志,路由到失败分支 log.error("发送打印请求失败", e) session.transfer(flowFile, REL_FAILURE) } - 分别将
ExecuteScript的success关系、failure关系连接到HandleHttpResponse组件,分别配置返回200、500状态码即可。
方案2:自定义编译修改版PutTCP组件(适合有二次开发能力的场景)
你可以拉取NiFi对应版本的源码,修改PutTCP组件的主机名配置项的ExpressionLanguageScope,将其从VARIABLE_REGISTRY改为FLOWFILE_ATTRIBUTES,自行编译打包后部署到NiFi的lib目录,重启后即可直接在PutTCP的主机名配置中使用FlowFile属性的EL表达式。
内容的提问来源于stack exchange,提问作者Vlisisids Akis
相关产品推荐
相关产品推荐

