SiddhiQL 中的语法错误,输入时没有可行的替代方案

Posted

技术标签:

【中文标题】SiddhiQL 中的语法错误,输入时没有可行的替代方案【英文标题】:Syntax error in SiddhiQL, no viable alternative at input 【发布时间】:2018-06-18 19:47:36 【问题描述】:

将 siddhi-io-rabbitmq 与 java 库一起使用。

我尝试在“@sink()”上设置rabbitmq属性“app.id”,但出现如下错误信息:

SiddhiQL 中的语法错误,输入 ' 没有可行的替代方案; @sink(type =rabbitmq, uri = amqp://guest.guest@192.168.99.100:5672, exchange.name = events, routing.key = route2, user.id = guest, type = event, message.id = my消息 ID,优先级 = 1,delivery.mode = 2,标头 = 'key1:value1','key2:value2',content.encoding = utf8,content.type = application/json,app'。

下面的代码只在没有这个属性的情况下运行:

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;

public class SiddhiRabbitMQError 
public static void main(String[] args) 
        String siddhiApp = 
                "@App:name('example') "

                + "@source(type ='rabbitmq', " 
                + "uri = 'amqp://guest:guest@192.168.99.100:5672', "
                + "exchange.name = 'events', " 
                + "exchange.type = 'topic', "
                + "routing.key= 'route1', "
                + "queue.name = 'queue1', "
                + "queue.durable.enabled = 'true', "
                + "@map(type='json', validate.json='true', @attributes(msg1 = 'msg1', msg2 = 'msg2', msg3 = 'msg3') )) "  

                + "define stream inputStream (msg1 string, msg2 string, msg3 long); "

                + "@sink(type ='rabbitmq', "
                + "uri = 'amqp://guest.guest@192.168.99.100:5672', "
                + "exchange.name = 'events', "
                + "routing.key = 'route2', "
                + "user.id = 'guest', "
                + "type = 'event', "
                + "message.id = 'my message id', "
                + "priority = '1', "
                + "delivery.mode = '2', "
                + "headers = \"'key1:value1','key2:value2'\", "
                + "content.encoding = 'utf8', "
                + "content.type = 'application/json', "
                + "app.id = 'my app id', "
                + "@map(type='json', validate.json='true' ))"

                + "define stream countOutputStream (msg4 string, msg5 long); "

                + "@name('query1') "
                + "from inputStream#window.timeBatch(10 sec) "
                + "select msg1, count(msg1) as msg5 "
                + "group by msg1, msg2 "
                + "insert into countOutputStream; ";

        SiddhiAppRuntime countLoginRuntime = new SiddhiManager().createSiddhiAppRuntime(siddhiApp);

        countLoginRuntime.start();

        countLoginRuntime.addCallback("countOutputStream", new StreamCallback() 
            public void receive(Event[] events) 
                EventPrinter.print(events);
            
        );
    

我已经阅读了https://wso2-extensions.github.io/siddhi-io-rabbitmq/api/1.0.16/ 中的文档,并在互联网上寻找示例或类似问题,但没有成功。

我的 pom.xml:

<repositories>
    <repository>
        <id>wso2.releases</id>
        <name>WSO2 Repository</name>
        <url>http://maven.wso2.org/nexus/content/repositories/releases/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>org.wso2.extension.siddhi.io.rabbitmq</groupId>
        <artifactId>siddhi-io-rabbitmq</artifactId>
        <version>1.0.16</version>
    </dependency>

    <dependency>
        <groupId>org.wso2.siddhi</groupId>
        <artifactId>siddhi-core</artifactId>
        <version>4.1.35</version>
    </dependency>

    <dependency>
        <groupId>org.wso2.siddhi</groupId>
        <artifactId>siddhi-query-api</artifactId>
        <version>4.1.35</version>
    </dependency>

    <dependency>
        <groupId>org.wso2.siddhi</groupId>
        <artifactId>siddhi-query-compiler</artifactId>
        <version>4.1.35</version>
    </dependency>

    <dependency>
        <groupId>org.wso2.extension.siddhi.map.json</groupId>
        <artifactId>siddhi-map-json</artifactId>
        <version>4.0.22</version>
    </dependency>

    <dependency>
        <groupId>org.wso2.siddhi</groupId>
        <artifactId>siddhi-annotations</artifactId>
        <version>4.1.35</version>
    </dependency>

我的消息代理是带有 Erlang 20.1.7 的 RabbitMQ 3.7.4。

如果有人可以帮助我,我非常感激。

问候。

【问题讨论】:

【参考方案1】:

解析@sink注解元素的app.id属性名时似乎有缺陷。如果您可以摆脱该属性名称,则该应用程序应该可以工作。

无论如何,我已经在 Siddhi 存储库 [1] 中报告了这个问题。这样您就可以在那里跟踪缺陷的状态。

[1]https://github.com/wso2/siddhi/issues/848

【讨论】:

非常感谢@Grainier!也许,我在错误的 repo 中打开了一个问题:https://github.com/wso2-extensions/siddhi-io-rabbitmq/issues/35 当问题解决时我会关闭。再次感谢! @pedrualves 我已经修复了 #848 问题。从 Siddhi v4.1.45 开始,您将能够使用 app.x 作为属性名称。 完美!成功地工作。谢谢@Grainier,你救了我,哈哈。

以上是关于SiddhiQL 中的语法错误,输入时没有可行的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL 嵌套 JSON 错误“输入时没有可行的替代方案”

房间数据库 - 查询错误作为输入时没有可行的替代方案

如何修复 Javadoc 注释有解析错误,详细信息:在解析 JAVADOC_TAG [NonEmptyAtClauseDescription] 时输入“*”没有可行的替代方案

如何解决“错误:输入中的语法错误(1)。”

ParseExpection:输入时没有可行的替代方案

我的验证错误消息未显示(Javascript)