我已经在windows7上安装了Rifidi边缘服务器(开源RFID中间件以osgi捆绑包的形式提供服务),我正在尝试开发一个java应用程序来连接和通信Rifidi边缘服务器。我尝试了两种方式,第一种是从Rifidi Edge Server外部的应用程序,第二种是从Rifidi Edge服务器内部的OSGi捆绑包,链接http://wiki.rifidi.net/index.php?title=EdgeServerJMS,我在两方面都面临以下问题。
1)从Rfifid边缘服务器外部的应用程序
rifidi.xml的代码是
<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name ="brokerURL" value="tcp://localhost:1099"/>
<property name="useAsyncSend" value="true"/>
</bean>
<bean id="topic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="org.rifidi.edge.external.tags"/>
</bean>
java文件的代码是
Connection connection;
ApplicationContext ctx = new ClassPathXmlApplicationContext("rifiditest/rifidi.xml");
ConnectionFactory cf=(ConnectionFactory) ctx.getBean("connectionFactory");
connection = cf.createConnection();
Destination dest1=(Topic) ctx.getBean("topic");
Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
在这种情况下,代码运行良好,但在Session Session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE)处出现异常java.io.EOFException
2)从Rifidi边缘服务器内部的OSGi捆绑包在这种情况下,我使用两种方法来使用JMS获取数据。首先使用JMS ConnectionFactory和JMS Topic对象,其次使用MessageListener接口
2)(i)通过使用JMS ConnectionFactory和JMS Topic对象
spring-xml的代码是
<bean id="connectionFactory" class="org.apache.activemq.spring.ActiveMQConnectionFactory">
<property name ="brokerURL" value="vm://externalBroker"/>
<property name="useAsyncSend" value="true"/>
</bean>
<bean id="externalMB" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="org.rifidi.edge.external.tags"/>
</bean>
<bean name="hello" class="com.javaworld.rifiditest.Helloworld"
init-method="start" destroy-method="stop" >
<property name="connectionFactory" ref="connectionFactory"/>
<property name="externalMB" ref="externalMB"/>
</bean>
com.javaworld.rifidiest.Helloworld.java的代码是
Connection connection;
connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
connection.start();
Destination dest=externalMB;
MessageConsumer consumer=session.createConsumer(dest);
TextMessage m=(TextMessage) consumer.receive();
System.out.println("---"+m.getText());
connection.close();
它执行良好,但执行挂起在TextMessage m=(TextMessage)consumer.rereceive()并且没有给出任何错误。
2)(ii)通过使用MessageListener接口
当使用org.rifidi.edge.internal未获取任何数据并且发出警告时,WARN org.apache.activemq.broker.jmx.ManagementContext:357-无法启动jmx连接器:无法绑定到URL[rmi://localhost:1099/jmxrmi]:javax.naming.NameAlreadyBoundException:jmxrmi[根异常为java.rmi.AlreadyBoundException:jmxrmi]
使用org.rifidi.edge.external.tags时没有错误,也没有获取任何数据。
帮助我解决这个问题
对Rifidi边缘服务器一无所知,但从OSGi/JMS的角度来看,解决方案在一定程度上取决于您想要什么:
- 如果您想在Rifidi服务器运行的OSGi框架内运行自己的应用程序,您需要创建一个捆绑包并订阅JMS主题名称(根据您指示的链接)
org.rifidi.edge.internal
(问号上的名称) - 如果您想在Rifidi服务器OSGi框架之外运行自己的应用程序(作为一个单独的VM),JMS主题名称为
org.rifidi.edge.external.tags
。在这种情况下,您当然也需要在自己的应用程序中设置JMS。根据你的帖子,我无法确定你是否在第一步就成功了
Rifidi 3.1现在支持rest和mqtt与示例应用的集成
在这里下载最新版本
http://sourceforge.net/projects/rifidi/files/?source=navbar
Wiki
Wiki.rifidi.net