Siddhi HTTP NoSuchMethodError - PullRequest
       6

Siddhi HTTP NoSuchMethodError

0 голосов
/ 25 апреля 2018

Этот вопрос касается библиотеки Java Siddhi - CEP

Описание:

Я попытался установить источник HTTP для получения данных.Не было ошибки при создании и запуске среды выполнения.

[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

ОС, БД, другие сведения и версии среды:
IntelliJIDEA 2017.3.5 (Community Edition), сборка № IC-173.4674.33, построена 6 марта 2018 г. JRE: 1.8.0_152-release-1024-b15 amd64 JVM: 64-битная виртуальная машина OpenJDK от JetBrains sro 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();
    }
}

Затем я отправляю запрос POST на http://localhost:9056/endpoints/. Возвращает исключение, опубликованное выше.

Обновление: Я вернулся и проверил страницу документации Siddhi-io-http github .Я обнаружил, что он говорит:

... Это расширение работает только внутри сервера аналитики данных WSO2 и не может быть запущено с автономным siddhi.

Я думаю, это может предложитьчто http не поддерживается библиотекой siddhi в данный момент.Я отправил запрос на страницу хранилища 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>

Было бы здорово, если бы вы могли предложить какую-либо причину.Спасибо за всю вашу работу!Это было действительно полезно.

1 Ответ

0 голосов
/ 27 апреля 2018

Кажется, есть проблема с документацией ... Это должно работать с автономной сиддхи. Все, что вам нужно сделать, это добавить следующие зависимости в ваш проект (также mqtt, который я не включил ниже);

<dependencies>
    <dependency>
        <groupId>org.wso2.siddhi</groupId>
        <artifactId>siddhi-core</artifactId>
        <version>${siddhi.version}</version>
    </dependency>
    <dependency>
        <groupId>org.wso2.siddhi</groupId>
        <artifactId>siddhi-annotations</artifactId>
        <version>${siddhi.version}</version>
    </dependency>
    <dependency>
        <groupId>org.wso2.siddhi</groupId>
        <artifactId>siddhi-query-compiler</artifactId>
        <version>${siddhi.version}</version>
    </dependency>
    <dependency>
        <groupId>org.wso2.extension.siddhi.io.http</groupId>
        <artifactId>siddhi-io-http</artifactId>
        <version>${siddhi.io.http.version}</version>
    </dependency>
    <dependency>
        <groupId>org.wso2.extension.siddhi.map.text</groupId>
        <artifactId>siddhi-map-text</artifactId>
        <version>${siddhi.mapper.text.version}</version>
    </dependency>
</dependencies>

Однако в вашем запросе есть проблема: вы определили @source и @sink для одного потока. Что не так. Если вы хотите сделать его проходным, вам нужно определить два потока (один для источника и один для приемника) и написать запрос для вставки событий из исходного потока в поток приемника.

UPDATE:

Образец можно найти здесь ; Пожалуйста, попробуйте и посмотрите, работает ли он.

...