【问题标题】:ActiveMQ: Store JMS message permanently after consumptionActiveMQ:消费后永久存储JMS消息
【发布时间】:2014-07-02 18:18:59
【问题描述】:

我已经设置了ActiveMQ 并且能够生产和消费MapMessage。消息被存储在 Oracle 下的 ACTIVEMQ_MSGS 表中,直到被使用。数据库中的消费记录被删除后。

编写触发器并将数据手动推送到另一个表是一种选择。但我只是想和你核实一下,我是否可以设置任何属性来实现这一点。

我来自activemq.xml 的配置如下所示:

    <bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
          <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
          <property name="url" value="jdbc:oracle:thin:@localhost/XE"/>
          <property name="username" value="USERNAME"/>
          <property name="password" value="PASSWORD"/>
          <property name="maxActive" value="200"/>
          <property name="poolPreparedStatements" value="true"/>
    </bean>


    <persistenceAdapter>
            <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#oracle-ds"/>
    </persistenceAdapter>

我的 Java 代码如下所示:

// Getting JMS connection from the server and starting it
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(Constants.ACTIVEMQ_URL);
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

// Destination represents 'NIKHIL.QUEUE' on the JMS server.
Destination destination = session.createQueue("NIKHIL.QUEUE");

// MessageProducer is used for sending messages (as opposed to MessageConsumer which is used for receiving them)
producer = session.createProducer(destination);

//Message creation goes here...

【问题讨论】:

  • 不知道为什么 StackOverFlow 会隐藏给出 -1 的人名。至少他们应该要求人们写一篇关于它的评论,可以匿名与我分享。请让我知道我的问题有什么问题。谢谢! :-)
  • 我认为他们这样做可能是因为您并没有真正提出真正的问题。你希望达到什么目标?你试过什么?什么没用?等等等等。
  • 蒂姆,我想我所尝试的,我想到的方法以及我想要实现的目标在我的问题中得到了明确的分享。

标签: java jms activemq


【解决方案1】:

鉴于问题中的信息,唯一适合的答案是,不。没有属性可以让消息神奇地转到数据库中的其他表。代理按设计工作,当消息被消费时,它们被删除。如果你想要某种镜像,你可以尝试创建一个复合目标,这样到达一个队列的消息被分派到两个单独的队列,你从一个队列消费并保留另一个,但你需要以某种方式管理它。

【讨论】:

  • 我观察到在主题的情况下,如果消息是持久的并且被消费者消费(并且没有离线持久消费者),则条目仍然存在于activemq_msgs。这个条目不应该被删除吗?或者我理解错了
  • 好的,我从数据库中得到了它,它被调度程序删除了,它并没有像我预期的那样立即发生。如果您在日志中启用调试,您可以看到DEBUG | Executing SQL: DELETE FROM ACTIVEMQ_MSGS WHERE (PRIORITY=? AND ID &lt;= ( SELECT min(ACTIVEMQ_ACKS.LAST_ACKED_ID) FROM ACTIVEMQ_ACKS WHERE ACTIVEMQ_ACKS.CONTAINER=ACTIVEMQ_MSGS.CONTAINER AND ACTIVEMQ_ACKS.PRIORITY=?) ) | org.apache.activemq.store.jdbc.adapter.DefaultJDBCAdapter | Persistence Adaptor Task-1
猜你喜欢
  • 2020-12-09
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 2015-06-16
  • 2016-10-24
  • 2015-11-25
  • 1970-01-01
  • 2021-03-06
相关资源
最近更新 更多