Apache flink 弗林克水槽永远不会执行

Apache flink 弗林克水槽永远不会执行,apache-flink,Apache Flink,我有一个程序,将加密货币的价格流到flink管道中,并打印一个时间窗口的最高出价 Main.java 公共类主{ 私有最终静态记录器log=LoggerFactory.getLogger(Main.class); private final static DateFormat DateFormat=新的SimpleDataFormat(“y-M-d H:M:s”); 私有最终静态NumberFormat NumberFormat=新的十进制格式(“0.00”); 公共静态void main(字符

我有一个程序,将加密货币的价格流到flink管道中,并打印一个时间窗口的最高出价

Main.java

公共类主{
私有最终静态记录器log=LoggerFactory.getLogger(Main.class);
private final static DateFormat DateFormat=新的SimpleDataFormat(“y-M-d H:M:s”);
私有最终静态NumberFormat NumberFormat=新的十进制格式(“0.00”);
公共静态void main(字符串[]args)引发异常{
MultipleParameterTool MultipleParameterTool=MultipleParameterTool.fromArgs(args);
StreamExecutionEnvironment StreamExecutionEnvironment=StreamExecutionEnvironment.getExecutionEnvironment();
streamExecutionEnvironment.getConfig().setGlobalJobParameters(multipleParameterTool);
streamExecutionEnvironment.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
streamExecutionEnvironment.addSource(新的GdaxSourceFunction())
.名称(“Gdax交易所价格来源”)
.1.1.1水印(新水印策略(){
@凌驾
public WatermarkGenerator createWatermarkGenerator(WatermarkGeneratorSupplier.Context){
返回新的BoundedAutofordernessGenerator();
}
})
.windowAll(TumblingEventTimeWindows.of(时间毫秒(100)))
.trigger(EventTimeTrigger.create())
.reduce((ReduceFunction)(值1,值2)->
value1.getHighestBid()>value2.getHighestBid()?value1:value2)
.addSink(新的SinkFunction(){
@凌驾
公共void调用(TickerPrice值、上下文)引发异常{
String dateString=dateFormat.format(context.timestamp());
String valueString=“$”+numberFormat.format(value.getHighestBid());
log.info(dateString+:“+valueString);
}
}).名称(“最高出价记录者”);
streamExecutionEnvironment.execute(“Gdax最高出价窗口计算器”);
}
/**
*该生成器生成水印,假设元素到达时出现故障,
*但是只有在一定程度上,特定时间戳t的最新元素才会到达
*时间戳t的最早元素之后最多n毫秒。
*/
公共静态类BoundedAutoFordernessGenerator实现水印生成器{
专用最终长maxOutOfOrderness=3500;//3.5秒
私有长currentMaxTimestamp;
@凌驾
public void onEvent(TickerPrice事件、长事件时间戳、水印输出){
currentMaxTimestamp=Math.max(currentMaxTimestamp,eventTimestamp);
}
@凌驾
public void onPeriodicEmit(水印输出){
//以当前最高时间戳减去无序边界的形式发出水印
emitWatermark(新水印(currentMaxTimestamp-maxOutOfOrderness-1));
}
}
}
GdaxSourceFunction.java

公共类GdaxSourceFunction扩展WebSocketClient实现SourceFunction{
专用静态字符串URL=”wss://ws-feed.gdax.com";
私有静态记录器log=LoggerFactory.getLogger(gdaxourcefunction.class);
私有静态字符串subscribeMsg=“{\n”+
“\”类型\“:\”订阅\“,\n”+
“\“产品\u ID\”:[],\n”+
“\'channels\”:[\n”+
//TODO:取消注释以重新启用订单簿跟踪
//“\'level2\”,\n”+
“{\n”+
“\'name\:\'ticker\”,\n”+
“\“产品\u ID\”:[]\n”+
“}\n”+
“]\n”+
"}";
SourceContext-ctx;
@凌驾
公共无效运行(SourceContext ctx)引发异常{
this.ctx=ctx;
openConnection().get();
while(isOpen()){
睡眠(10000);
}
}
@凌驾
公开作废取消(){
}
@凌驾
公共消息无效(字符串消息){
试一试{
ObjectNode ObjectNode=objectMapper.readValue(消息,ObjectNode.class);
字符串类型=objectNode.get(“type”).asText();
如果(“股票代码”。等于(类型)){
TickerPrice TickerPrice=新TickerPrice();
字符串productId=objectNode.get(“product_id”).asText();
字符串[]货币=productId.split(“”);
tickerPrice.setFromCurrency(货币[1]);
tickerPrice.setToCurrency(货币[0]);
tickerPrice.setHighestBid(objectNode.get(“最佳出价”).asDouble();
tickerPrice.setlowstoffer(objectNode.get(“best_ask”).asDouble();
证券交易所(“gdax”);
String time=objectNode.get(“time”).asText();
Instant Instant=Instant.parse(时间);
ctx.collectWithTimestamp(tickerPrice,instant.getEpochSecond());
}
//log.info(objectNode.toString());
}捕获(JsonProcessingException e){
e、 printStackTrace();
}
}
@凌驾
公共开放(会议){
super.onOpen(会议);
//验证并确保我们可以正确连接到Gdax Websocket
//使用产品ID列表构造身份验证消息
StringBuilder ProductId=新的StringBuilder(“”);
productId.append(“”)+
“ETH-USD\,\n”+
“ETH-USD\,\n”+
“\”BTC-USD\”);
String subMsg=subscribemg.replace(“,productIds.toString());
试一试{
userSession.getAsyncRemote().sendText(subMsg.get();
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
}
@凌驾
公共字符串getUrl(){
返回URL;
}
}
但是