如何在nifi中为邮件添加时间戳?

时间:2019-01-24 22:59:02

标签: apache-nifi

免责声明:我对nifi完全一无所知。

我需要从ListenHTTP处理器接收消息,然后将每条消息转换为带有时间戳的json消息。

因此,假设我在凌晨5点收到消息hello world。它应该将其转换为{"timestamp": "5 am", "message":"hello world"}

我该怎么做?

2 个答案:

答案 0 :(得分:2)

每个流文件都有属性,它们是存储在内存中的键/值对中的元数据片段(可用于快速读取/写入)。发生任何操作时,NiFi框架都会将部分元数据写入与流文件有关的 provenance 事件中,有时还会写入流文件本身。例如,如果ListenHTTP是流中的第一个处理器,则进入该流的任何流文件都将具有属性entryDate,其属性的值以Thu Jan 24 15:53:52 PST 2019的格式出现。您可以使用各种处理器(即UpdateAttributeRouteOnAttribute等)来读写这些属性。

对于您的用例,您可以紧随ReplaceText处理器之后的ListenHTTP处理器,其搜索值为(?s)(^.*$)(整个流文件内容,或“您通过HTTP收到的内容呼叫”)和替换值{"timestamp_now":"${now():format('YYYY-MM-dd HH:mm:ss.SSS Z')}", "timestamp_ed": "${entryDate:format('YYYY-MM-dd HH:mm:ss.SSS Z')}", "message":"$1"}

上面的示例提供了两个选项:

  1. entryDate是流文件通过ListenHTTP处理器出现的时间
  2. now()函数获取自纪元以来的当前时间戳(以毫秒为单位)

这两个值可能会根据性能/排队/等而略有不同。在我的简单示例中,它们相距2毫秒。您可以使用format()方法和普通的Java time format syntax格式化它们,因此例如可以使用h a来获取“上午5点”(完整示例:now():format('h a'):toLower())。

示例

  • ListenHTTP在端口9999上运行,路径为contentListener
  • ReplaceText如上所述
  • LogAttribute,日志有效负载为true

NiFi flow on canvas and terminal showing log and curl command

卷曲命令:curl -d "helloworld" -X POST http://localhost:9999/contentListener

示例输出:

2019-01-24 16:04:44,529 INFO [Timer-Driven Process Thread-6] o.a.n.processors.standard.LogAttribute LogAttribute[id=8246b0a0-0168-1000-7254-2c2e43d136a7] logging for flow file StandardFlowFileRecord[uuid=5e1c6d12-298d-4d9c-9fcb-108c208580fa,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1548374015429-1, container=default, section=1], offset=3424, length=122],offset=0,name=5e1c6d12-298d-4d9c-9fcb-108c208580fa,size=122]
--------------------------------------------------
Standard FlowFile Attributes
Key: 'entryDate'
    Value: 'Thu Jan 24 16:04:44 PST 2019'
Key: 'lineageStartDate'
    Value: 'Thu Jan 24 16:04:44 PST 2019'
Key: 'fileSize'
    Value: '122'
FlowFile Attribute Map Content
Key: 'filename'
    Value: '5e1c6d12-298d-4d9c-9fcb-108c208580fa'
Key: 'path'
    Value: './'
Key: 'restlistener.remote.source.host'
    Value: '127.0.0.1'
Key: 'restlistener.remote.user.dn'
    Value: 'none'
Key: 'restlistener.request.uri'
    Value: '/contentListener'
Key: 'uuid'
    Value: '5e1c6d12-298d-4d9c-9fcb-108c208580fa'
--------------------------------------------------
{"timestamp_now":"2019-01-24 16:04:44.518 -0800", "timestamp_ed": "2019-01-24 16:04:44.516 -0800", "message":"helloworld"}

答案 1 :(得分:0)

因此,我使用以下代码添加了ExecuteScript处理器:

import org.apache.commons.io.IOUtils
import java.nio.charset.StandardCharsets
import java.time.LocalDateTime

flowFile = session.get()
if(!flowFile)return
def text = ''
// Cast a closure with an inputStream parameter to InputStreamCallback
session.read(flowFile, {inputStream ->
  text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
  // Do something with text here
} as InputStreamCallback)


def outputMessage = '{\"timestamp\":\"' + LocalDateTime.now().toString() + '\", \"message:\":\"' + text + '\"}'

flowFile = session.write(flowFile, {inputStream, outputStream ->
  text = IOUtils.toString(inputStream, StandardCharsets.UTF_8)
  outputStream.write(outputMessage.getBytes(StandardCharsets.UTF_8))
} as StreamCallback)

session.transfer(flowFile, REL_SUCCESS)

它奏效了。