具有中继行为的消息服务

时间:2012-05-23 11:38:24

标签: jms

我正在设计传感设备的分布式网络。这些设备将生成日志并将其发送到中央数据库。我正在使用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是否合适?我应该设计自己的套接字级协议来发送消息吗?

1 个答案:

答案 0 :(得分:1)

修改

  

是否有这样的留言服务,或者我自己应该写中继服务?

通常这些类型的中继服务必须为您自己编写代码,除非您能够找到一个完全符合您希望的软件。在这些情况下,这并不罕见。

  

在这种情况下,使用JMS是否合适?

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

  

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

我仍然不知道您要发送什么类型的邮件。如果您使用的是SMTP或SMS或HTTP等标准传输,则可以使用库来帮助您发送和验证传送。如果必须使用自定义协议发送,则必须编写自己的套接字级代码。

查看您的代码示例向我显示您想知道您的客户端是否成功将其消息发送到JMS。如果没有发送,请保存到磁盘,稍后再试。

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