Jms 具有中继行为的消息服务

Jms 具有中继行为的消息服务,jms,Jms,我正在设计一个分布式传感设备网络。这些设备将生成日志并将其发送到中央数据库。我正在使用JMS传输日志消息。主数据库服务器将运行MDB(消息驱动Bean)来处理传入消息。客户端使用GPRS发送数据。问题是我不希望我的客户处理网络问题。我需要一些中继服务,在客户端计算机上本地运行,并立即从客户端获取消息,而不阻止它,然后代表它尝试。(如果网络关闭,请在一段时间后再次尝试发送) 消息是一个简单的java对象: public class Message { public int x; p

我正在设计一个分布式传感设备网络。这些设备将生成日志并将其发送到中央数据库。我正在使用JMS传输日志消息。主数据库服务器将运行MDB(消息驱动Bean)来处理传入消息。客户端使用GPRS发送数据。问题是我不希望我的客户处理网络问题。我需要一些中继服务,在客户端计算机上本地运行,并立即从客户端获取消息,而不阻止它,然后代表它尝试。(如果网络关闭,请在一段时间后再次尝试发送)

消息是一个简单的java对象:

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天或更少的时间。