首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMS setTimeToLive

JMS setTimeToLive
EN

Stack Overflow用户
提问于 2009-10-09 10:41:00
回答 3查看 1.7K关注 0票数 4

我正在使用JMS主题发布消息。在消息生成器上,我设置了setTimeToLive.我希望消息在16小时后被删除。但即使在16小时后,消息仍然存在于DB和topic中。对此有什么想法吗?我是不是遗漏了什么?

代码语言:javascript
复制
private static final long DEFAULT_TIME_TO_LIVE = 16 * 60 * 60 * 1000;
....
session = getSession(jndiContext);
MessageProducer mp = createTopicMessageProducer(session, jndiContext, topicName);
mp.setTimeToLive(DEFAULT_TIME_TO_LIVE);
Message msg = session.createObjectMessage(obj);
....

我的oracele-jdbc2-service.xml有以下查询

代码语言:javascript
复制
<mbean code="org.jboss.mq.pm.jdbc2.PersistenceManager"
  name="jboss.mq:service=JDBCPersistenceManager">
    <depends optional-attribute-name="ConnectionManager">jboss.jca:service=DataSourceBinding,name=OracleDS</depends>
    <attribute name="SqlProperties">
      INSERT_EMPTY_BLOB = INSERT INTO JMS_MESSAGES (MESSAGEID, DESTINATION, MESSAGEBLOB, TXID, TXOP) VALUES(?,?,EMPTY_BLOB(),?,?)
      LOCK_EMPTY_BLOB = SELECT MESSAGEID, MESSAGEBLOB FROM JMS_MESSAGES WHERE MESSAGEID = ? AND DESTINATION = ? FOR UPDATE
      BLOB_TYPE=BINARYSTREAM_BLOB
      INSERT_TX = INSERT INTO JMS_TRANSACTIONS (TXID) values(?)
      INSERT_MESSAGE = INSERT INTO JMS_MESSAGES (MESSAGEID, DESTINATION, MESSAGEBLOB, TXID, TXOP) VALUES(?,?,?,?,?)
      SELECT_ALL_UNCOMMITED_TXS = SELECT TXID FROM JMS_TRANSACTIONS
      SELECT_MAX_TX = SELECT MAX(TXID) FROM (SELECT MAX(TXID) AS TXID FROM JMS_TRANSACTIONS UNION SELECT MAX(TXID) AS TXID FROM JMS_MESSAGES)
      DELETE_ALL_TX = DELETE FROM JMS_TRANSACTIONS
      SELECT_MESSAGES_IN_DEST = SELECT MESSAGEID, MESSAGEBLOB FROM JMS_MESSAGES WHERE DESTINATION=?
      SELECT_MESSAGE_KEYS_IN_DEST = SELECT MESSAGEID FROM JMS_MESSAGES WHERE DESTINATION=?
      SELECT_MESSAGE = SELECT MESSAGEID, MESSAGEBLOB FROM JMS_MESSAGES WHERE MESSAGEID=? AND DESTINATION=?
      MARK_MESSAGE = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE MESSAGEID=? AND DESTINATION=?
      UPDATE_MESSAGE = UPDATE JMS_MESSAGES SET MESSAGEBLOB=? WHERE MESSAGEID=? AND DESTINATION=?
      UPDATE_MARKED_MESSAGES = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE TXOP=?
      UPDATE_MARKED_MESSAGES_WITH_TX = UPDATE JMS_MESSAGES SET TXID=?, TXOP=? WHERE TXOP=? AND TXID=?
      DELETE_MARKED_MESSAGES_WITH_TX = DELETE FROM JMS_MESSAGES MESS WHERE TXOP=? AND EXISTS (SELECT TXID FROM JMS_TRANSACTIONS TX WHERE TX.TXID = MESS.TXID)
      DELETE_TX = DELETE FROM JMS_TRANSACTIONS WHERE TXID = ?
      DELETE_MARKED_MESSAGES = DELETE FROM JMS_MESSAGES WHERE TXID=? AND TXOP=?
      DELETE_TEMPORARY_MESSAGES = DELETE FROM JMS_MESSAGES WHERE TXOP='T'
      DELETE_MESSAGE = DELETE FROM JMS_MESSAGES WHERE MESSAGEID=? AND DESTINATION=?
      CREATE_MESSAGE_TABLE = CREATE TABLE JMS_MESSAGES ( MESSAGEID INTEGER NOT NULL, \
         DESTINATION VARCHAR(255) NOT NULL, TXID INTEGER, TXOP CHAR(1), \
         MESSAGEBLOB BLOB, PRIMARY KEY (MESSAGEID, DESTINATION) )
      CREATE_IDX_MESSAGE_TXOP_TXID = CREATE INDEX JMS_MESSAGES_TXOP_TXID ON JMS_MESSAGES (TXOP, TXID)
      CREATE_IDX_MESSAGE_DESTINATION = CREATE INDEX JMS_MESSAGES_DESTINATION ON JMS_MESSAGES (DESTINATION)
      CREATE_TX_TABLE = CREATE TABLE JMS_TRANSACTIONS ( TXID INTEGER, PRIMARY KEY (TXID) )
      CREATE_TABLES_ON_STARTUP = TRUE
    </attribute>
    <!-- Uncomment to override the transaction timeout for recovery per queue/subscription, in seconds -->
    <!--attribute name="RecoveryTimeout">0</attribute-->
    <!-- The number of blobs to load at once during message recovery -->
    <attribute name="RecoverMessagesChunk">0</attribute>
  </mbean>
EN

回答 3

Stack Overflow用户

发布于 2010-11-14 12:15:57

JMS规范不要求提供者删除消息。有些提供商删除过期消息的速度相当快。有些不会删除它们,直到浏览或获取操作评估消息是否过期。有些应用程序会随意删除消息,而不管客户端是否试图浏览或获取它们。保持后台任务活动以快速删除过期消息显然会消耗资源,因此大多数提供者将选择某种程度的“惰性”过期。

有趣的是,JMS规范还声明“客户端不应该接收已经过期的消息;但是,JMS不保证这种情况不会发生”。大多数提供商在防止过期消息传递方面做得很好,但这并不是一个硬性要求。

因此,答案是,尽管在到期后在数据库或队列/主题中看到消息可能不像“预期”行为那样直观,但它在规范范围内。更重要的问题是,是否将上述消息传递给您的应用程序。希望它不是-但即使它是,规范也不排除这一点。

票数 2
EN

Stack Overflow用户

发布于 2009-12-17 00:43:36

您的发布者/订阅者应该按照JMS规范丢弃过期的消息。不能保证消息过期后会从队列中删除。

票数 0
EN

Stack Overflow用户

发布于 2017-06-02 13:25:16

如果你使用的是Jboss 6,那么它内部使用的是HornetQ for JMS,因此需要在standalone-full.xml中进行一些配置才能让TTL有效地工作。

为使TTL正常工作,需要配置message-expiry-scan-period,max-delivery-尝试次数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1543052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档