Jms 具有中继行为的消息服务
我正在设计一个分布式传感设备网络。这些设备将生成日志并将其发送到中央数据库。我正在使用JMS传输日志消息。主数据库服务器将运行MDB(消息驱动Bean)来处理传入消息。客户端使用GPRS发送数据。问题是我不希望我的客户处理网络问题。我需要一些中继服务,在客户端计算机上本地运行,并立即从客户端获取消息,而不阻止它,然后代表它尝试。(如果网络关闭,请在一段时间后再次尝试发送) 消息是一个简单的java对象:Jms 具有中继行为的消息服务,jms,Jms,我正在设计一个分布式传感设备网络。这些设备将生成日志并将其发送到中央数据库。我正在使用JMS传输日志消息。主数据库服务器将运行MDB(消息驱动Bean)来处理传入消息。客户端使用GPRS发送数据。问题是我不希望我的客户处理网络问题。我需要一些中继服务,在客户端计算机上本地运行,并立即从客户端获取消息,而不阻止它,然后代表它尝试。(如果网络关闭,请在一段时间后再次尝试发送) 消息是一个简单的java对象: public class Message { public int x; p
public class Message {
public int x;
public int y;
public int z;
}
客户:
Message msg = new Message();
while (True) {
/* sense data */
msg = get_data_from_environment();
/* send data to local relay service
* This is non blocking call */
relay_service.send(msg);
}
本地中继服务:
while (True) {
/* get message from local client */
msg = get_message_from_local_client();
result = send_msg_to_JMS_server(msg);
/* if not successful, persist it on a local queue and try some other time */
if (result.is_sent() != True)
store_msg_on_disk(msg);
}
有这样的消息服务吗?还是我应该自己写中继服务
在这种情况下使用JMS好吗?我应该设计自己的套接字级别协议来发送消息吗?编辑
有这样的消息服务吗?还是我应该自己写中继服务
通常,这些类型的中继服务您必须自己编写代码,除非您能够找到一个软件,它可以完全满足您的要求。在这些情况下,这样做并不罕见
在这种情况下使用JMS好吗
是的,JMS是一个非常好的中间件解决方案。您可以让许多客户端连接到JMS并向其发送消息。当您有一个服务器程序在运行时,从JMS读取消息并对其进行处理,如果有网络问题,则处理网络问题。另外,如果完全失败,服务器程序也会重新启动,并将消息发送回客户端
我应该设计自己的套接字级别协议来发送消息吗
我仍然不知道你想发送什么样的消息。如果您使用的是标准传输,如SMTP、SMS或HTTP等,则有一些库可帮助您发送和验证传递。如果必须使用自定义协议发送,则必须编写自己的套接字级别代码
看到您的代码示例,我想知道您的客户机是否成功地将消息发送到JMS。如果未发送,请保存到磁盘,稍后再试
如果收到消息,JMS服务器将自动确认。您可以从JMS消息中检查这一点,如果失败,您将获得JMSException。如果将邮件保存在磁盘上,则需要知道何时重新发送邮件。您需要一个计时器或在下一条要发送的消息中重新发送。谢谢,这样更清晰。中继服务在客户端和JMS服务器之间,对吗?或者它们之间是否有其他服务器?是的,中继服务位于JMS客户端和服务器之间。它的唯一用途是代表客户机传递消息,并让客户机尽可能快地完成其工作。我还没有写过任何代码(我正处于架构师阶段)。实际消息只有6个长整数。就这些。我明白了,你现在能做的最好的事情就是设置一个JMS服务器,比如ApacheActiveMQ(它非常容易而且快速),编写一个非常简单的客户端和服务器软件,并发送一条测试消息。一旦这样做,您将看到解决方案的完整体系结构。这应该只需要1天或更少的时间。