添加队列时WSO2消息代理错误 - 无效对象名

时间:2015-12-16 20:24:08

标签: sql-server wso2 wso2carbon wso2mb

我刚刚建立了连接到SQL Server数据库的 WSO2 Message Broker 3.0.0

Carbon MB组件的DB也已成功创建。

创建了Message Broker数据存储的数据库,其中包含表 MB_QUEUE_MAPPING

但是,当通过MB UI添加队列时,我在堆栈跟踪中看到以下错误:

[2015-12-16 15:00:41,472] ERROR {org.wso2.andes.store.rdbms.RDBMSMessageStoreImpl} -  Error occurred while retrieving destination queue id for destina
tion queue TestQ
java.sql.SQLException: Invalid object name 'MB_QUEUE_MAPPING'.
        at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372)
        at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988)
        at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421)
        at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:671)
        at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:505)
        at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:1029)
        at org.wso2.andes.store.rdbms.RDBMSMessageStoreImpl.getQueueID(RDBMSMessageStoreImpl.java:1324)
        at org.wso2.andes.store.rdbms.RDBMSMessageStoreImpl.getCachedQueueID(RDBMSMessageStoreImpl.java:1298)
        at org.wso2.andes.store.rdbms.RDBMSMessageStoreImpl.addQueue(RDBMSMessageStoreImpl.java:1634)
        at org.wso2.andes.store.FailureObservingMessageStore.addQueue(FailureObservingMessageStore.java:445)
        at org.wso2.andes.kernel.AMQPConstructStore.addQueue(AMQPConstructStore.java:116)
        at org.wso2.andes.kernel.AndesContextInformationManager.createQueue(AndesContextInformationManager.java:154)
        at org.wso2.andes.kernel.disruptor.inbound.InboundQueueEvent.updateState(InboundQueueEvent.java:151)
        at org.wso2.andes.kernel.disruptor.inbound.InboundEventContainer.updateState(InboundEventContainer.java:167)
        at org.wso2.andes.kernel.disruptor.inbound.StateEventHandler.onEvent(StateEventHandler.java:67)
        at org.wso2.andes.kernel.disruptor.inbound.StateEventHandler.onEvent(StateEventHandler.java:41)
        at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:128)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

“添加队列”屏幕不会消失,但是队列确实会在数据库中添加到 MB_QUEUE 表中。两个表 MB_QUEUE_MAPPING & MB_QUEUE_COUNTER 为空。

尽管MB_QUEUE表中有许多队列,但“列表队列”屏幕仍为空白。堆栈跟踪也显示错误,但不包括在内,因为它与上述错误无关。

但我可以创建一个主题就好了。

我想知道为什么当表格明确存在时,MB会说MB_QUEUE_MAPPING表是无效的对象名称

2 个答案:

答案 0 :(得分:0)

我怀疑你配置mysql数据库的方式是不正确的。所以你可以更好地尝试以下两种情况之一,以确保这个问题。

1)首次使用-Dsetup参数或

启动服务器

2)您可以参考文档(https://docs.wso2.com/display/MB300/Configuring+MySQL)“配置MySQL”并按顺序执行分步说明。

我已经尝试了第二种方案,当我添加queue时,我没有得到任何异常。我提到的文档必须更新如下。

您可以在步骤3中看到此命令。

 mysql -u <db_user_name> -p -D<database_name> < '<WSO2MB_HOME>/dbscripts/mb-store/mysql-mb.sql ';

db_user_name - db的用户名。

database_name - 您在步骤1中创建的数据库名称。

WSO2MB_HOME - MB的主目录路径。

希望这可以帮助您解决此问题。

答案 1 :(得分:0)

似乎用户连接到MSSQL数据库没有正确的权限。最有可能SELECT许可。我之所以说的原因是,当您添加队列时,它确实会被添加。这意味着用户具有INSERT权限。添加队列后,页面将重定向到“队列列表”页面。用户必须具有SELECT权限才能检索队列列表。主题没有被添加到数据库,它保持在注册表中。您可以通过wso2mb-3.0.0/repository/conf/datasources/master-datasources.xml中的配置验证连接到MSSQL的用户。

<datasource>
   <name>WSO2_MB_STORE_DB</name>
   <jndiConfig>
       <name>WSO2MBStoreDB</name>
   </jndiConfig>
   <definition type="RDBMS">
         <configuration>
                    <url>jdbc:jtds:sqlserver://localhost:1433/wso2_mb</url>
                    <username>sa</username>
                    <password>sa</password>
                    <driverClassName>net.sourceforge.jtds.jdbc.Driver</driverClassName>
                    <maxActive>200</maxActive>
                    <maxWait>60000</maxWait>
                    <minIdle>5</minIdle>
                    <testOnBorrow>true</testOnBorrow>
                    <validationQuery>SELECT 1</validationQuery>
                    <validationInterval>30000</validationInterval>
                    <defaultAutoCommit>false</defaultAutoCommit>
         </configuration>
     </definition>
</datasource>