0

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

message 是一个简单的 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 好吗?我应该设计自己的套接字级协议来发送消息吗?

4

1 回答 1

1

编辑

是否有这样的消息服务或者我应该自己编写中继服务?

通常,这些类型的中继服务您必须自己编写代码,除非您能够找到完全符合您要求的软件。在这些情况下这样做并不少见。

在这种情况下使用 JMS 好吗?

是的,JMS 是用作中间件的非常好的解决方案。您可以让许多客户端连接到 JMS 并向其发送消息。当您有一个正在运行的服务器程序从 JMS 读取消息并对其进行处理并处理网络问题(如果有)时。同样作为奖励,服务器程序在完全失败的情况下将消息发送回客户端。

我应该设计自己的套接字级协议来发送消息吗?

我仍然不知道您要发送什么样的消息。如果您使用的是标准传输,如 SMTP、SMS 或 HTTP 或类似的东西,那么有一些库可以帮助您发送和验证交付。如果您必须使用自定义协议发送,那么您必须编写自己的套接字级别代码。

看到您的代码示例表明您想知道您的客户是否成功地将他的消息发送到 JMS。如果未发送,则保存到磁盘并稍后重试。

如果收到消息,JMS 服务器将自动确认。您可以从 JMS 消息中检查这一点,或者如果失败,您将收到 JMSException。如果您将消息保存在磁盘上,您将需要知道何时重新发送它们。您将需要一个计时器或重新发送下一条要发送的消息。

于 2012-05-23T14:46:22.703 回答