这个问题涉及Siddhi-CEP的Java库。
描述:
我尝试建立一个HTTP源来接收数据。创建Runtime并启动时没有出现错误。
然而,当我向指定地址发送POST请求时,出现了错误:
然后我向http://localhost:9056/endpoints/发送了一个POST请求,它返回了上述异常。
更新: 我回去检查了Siddhi-io-http github文档页面。我发现它说:
“……这个扩展只能在WSO2 Data Analytic Server内部工作,不能在独立的Siddhi中运行。”
我想这可能意味着siddhi库目前不支持http。我已经在siddhi存储库页面上提交了问题以请求确认。
更新2: 我已经更改了我的Siddhi查询,使其将源流复制到其他汇流流中。代码的其他部分保持不变:
同样的问题仍然存在。我尝试了wso2处理器,它运行良好。现在我的猜测是:
1. 版本不匹配
2. wso2处理器依赖项中缺少某些包。
我将尝试在这两个方向上进行识别,并在我发现新内容时更新此处和问题页面。 更新3: 随着我不断添加更新,格式似乎出现了一些问题,但幸运的是,这个问题也得到了解决。我尝试从wso2处理器源代码中包含所有依赖项,我的测试程序开始工作了。因此,我认为wso2处理器中有一个组件缺少siddhi库。
我尝试逐个删除依赖项,以查看我的测试程序是否仍然有效。最后我找到了那个包。有了这个包,我的代码就可以正常工作了。
作为一个编程初学者,我不确定问题出在哪里。如果有人可以解释一下问题的原因,我将不胜感激。在这个过程中,我非常感谢收到的所有帮助,它也会是一次很好的体验。
更新4: @Grainier 我尝试了你发布的示例代码,它实际上起作用了!虽然我仍然不知道为什么。我试着把你的完整代码复制到我的项目中的新.java文件中,它仍然无法工作。因此,我想与POM文件有关。
我注意到当我运行你的示例代码时,在控制台上打印出了几个警告:一点小更新:我发现警告出现是因为我使用了JDK 10。一旦我切换回1.8,警告就消失了,代码仍然可以正常工作。所以这可能不是原因。
第二个区别在于POM文件。相较于我的文件,你的文件中添加了一个额外的仓库。
描述:
我尝试建立一个HTTP源来接收数据。创建Runtime并启动时没有出现错误。
[nioEventLoopGroup-2-1] INFO org.wso2.transport.http.netty.listener.ServerConnectorBootstrap$HTTPServerConnector - HTTP(S) Interface starting on host localhost and port 9056
[main] INFO org.wso2.extension.siddhi.io.http.source.HttpConnectorPortBindingListener - siddhi: started HTTP server connector localhost:9056
[main] INFO org.wso2.extension.siddhi.io.http.source.HttpSourceListener - Source Listener has created for url http://localhost:9056/endpoints/
然而,当我向指定地址发送POST请求时,出现了错误:
[nioEventLoopGroup-3-1] ERROR org.wso2.extension.siddhi.io.http.source.HTTPConnectorListener - Error in http server connector
java.lang.NoSuchMethodError: io.netty.handler.codec.http.HttpRequest.method()Lio/netty/handler/codec/http/HttpMethod;
at org.wso2.transport.http.netty.listener.CustomHttpContentCompressor.decode(CustomHttpContentCompressor.java:44)
at org.wso2.transport.http.netty.listener.CustomHttpContentCompressor.decode(CustomHttpContentCompressor.java:14)
at io.netty.handler.codec.MessageToMessageCodec$2.decode(MessageToMessageCodec.java:81)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:89)
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:276)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:354)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:244)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:318)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:304)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:112)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
at java.lang.Thread.run(Thread.java:748)
请问我做错了什么,有人能提供建议吗?谢谢。
受影响的产品版本: 4.1.17
操作系统、数据库和其他环境详情及版本:
IntelliJ IDEA 2017.3.5 (社区版)
Build #IC-173.4674.33, built on March 6, 2018
JRE: 1.8.0_152-release-1024-b15 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
复现步骤: 我编写的测试代码如下:
import org.wso2.siddhi.core.SiddhiAppRuntime;
import org.wso2.siddhi.core.SiddhiManager;
import org.wso2.siddhi.core.event.Event;
import org.wso2.siddhi.core.stream.output.StreamCallback;
import org.wso2.siddhi.core.util.EventPrinter;
//import org.wso2.extension.siddhi.io.http.source.*;
public class httpTest
{
public static void main(String[] args) {
String siddhiString = "@App:name(\"haha\") " +
"@App:description(\"fasd\") " +
"@App:statistics(reporter = \"jmx\", interval = \"30\") " +
"@source(type=\"http\",receiver.url=\"http://localhost:9056/endpoints/\",@map(type=\"text\",fail.on.missing.attribute=\"true\",regex.A=\"(.*)\",@attributes(data=\"A\"))) " +
"@sink(type=\"mqtt\",url=\"tcp://120.78.71.179:1883\",topic=\"34\",@map(type=\"text\")) " +
"define stream a4P068X5YCK(data String);";
SiddhiManager siddhiManager = new SiddhiManager();
SiddhiAppRuntime siddhiAppRuntime = siddhiManager.createSiddhiAppRuntime(siddhiString);
siddhiAppRuntime.addCallback("a4P068X5YCK", new StreamCallback() {
@Override
public void receive(Event[] events) {
EventPrinter.print(events);
}
});
siddhiAppRuntime.start();
}
}
然后我向http://localhost:9056/endpoints/发送了一个POST请求,它返回了上述异常。
更新: 我回去检查了Siddhi-io-http github文档页面。我发现它说:
“……这个扩展只能在WSO2 Data Analytic Server内部工作,不能在独立的Siddhi中运行。”
我想这可能意味着siddhi库目前不支持http。我已经在siddhi存储库页面上提交了问题以请求确认。
更新2: 我已经更改了我的Siddhi查询,使其将源流复制到其他汇流流中。代码的其他部分保持不变:
String siddhiString = "@App:name(\"haha\") " +
"@App:description(\"fasd\") " +
"@App:statistics(reporter = \"jmx\", interval = \"30\") " +
"@source(type=\"http\",receiver.url=\"http://localhost:9056/endpoints/\",@map(type=\"text\",fail.on.missing.attribute=\"true\",regex.A=\"(.*)\",@attributes(data=\"A\"))) " +
"define stream a4P068X5YCK(data String); " +
"@sink(type=\"mqtt\",url=\"tcp://120.78.71.179:1883\",topic=\"34\",@map(type=\"text\")) " +
"define stream pout(data String); " +
"from a4P068X5YCK " +
"select * " +
"insert into pout; " +
"";
同样的问题仍然存在。我尝试了wso2处理器,它运行良好。现在我的猜测是:
1. 版本不匹配
2. wso2处理器依赖项中缺少某些包。
我将尝试在这两个方向上进行识别,并在我发现新内容时更新此处和问题页面。 更新3: 随着我不断添加更新,格式似乎出现了一些问题,但幸运的是,这个问题也得到了解决。我尝试从wso2处理器源代码中包含所有依赖项,我的测试程序开始工作了。因此,我认为wso2处理器中有一个组件缺少siddhi库。
我尝试逐个删除依赖项,以查看我的测试程序是否仍然有效。最后我找到了那个包。有了这个包,我的代码就可以正常工作了。
<dependency>
<groupId>org.wso2.msf4j</groupId>
<artifactId>org.wso2.msf4j.feature</artifactId>
<version>${msf4j.version}</version>
<type>zip</type>
</dependency>
作为一个编程初学者,我不确定问题出在哪里。如果有人可以解释一下问题的原因,我将不胜感激。在这个过程中,我非常感谢收到的所有帮助,它也会是一次很好的体验。
更新4: @Grainier 我尝试了你发布的示例代码,它实际上起作用了!虽然我仍然不知道为什么。我试着把你的完整代码复制到我的项目中的新.java文件中,它仍然无法工作。因此,我想与POM文件有关。
我注意到当我运行你的示例代码时,在控制台上打印出了几个警告:一点小更新:我发现警告出现是因为我使用了JDK 10。一旦我切换回1.8,警告就消失了,代码仍然可以正常工作。所以这可能不是原因。
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by io.netty.util.internal.ReflectionUtil (file:/C:/Users/ktz001/.m2/repository/io/netty/netty-common/4.1.16.Final/netty-common-4.1.16.Final.jar) to constructor java.nio.DirectByteBuffer(long,int)
WARNING: Please consider reporting this to the maintainers of io.netty.util.internal.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
第二个区别在于POM文件。相较于我的文件,你的文件中添加了一个额外的仓库。
<repository>
<id>wso2-nexus</id>
<name>WSO2 internal Repository</name>
<url>http://maven.wso2.org/nexus/content/groups/wso2-public/</url>
<releases>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
<checksumPolicy>ignore</checksumPolicy>
</releases>
</repository>
如果您能提出任何原因,那将是非常好的。感谢您的所有工作!它真的很有帮助。