有没有办法在JBoss 4.2.2消息队列中重新发送过期的消息?问题是它们超过了重试量,但现在问题已解决,有没有办法重新发送它们?
在JBoss 3中,它们只是您可以移动的文本文件。既然存储在数据库中,你怎么能这样做呢?
答案 0 :(得分:1)
看看Hermes JMS。它是一个用于浏览JMS队列和主题的开源工具。它可以重放最终在代理无法传递的队列中的消息。
答案 1 :(得分:0)
这就是我最终做的事情:
Hashtable t = new Hashtable();
t.put(Context.PROVIDER_URL, "localhost:1099");
t.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
Context ctx = new InitialContext(t);
Queue q = (Queue) ctx.lookup("/queue/DLQ");
//----------------------------
ConnectionFactory cf = (ConnectionFactory) ctx.lookup("/ConnectionFactory");
Connection connection = cf.createConnection();
Session session = connection.createSession(true, 0);
//---------------------------------
MessageConsumer consumer = session.createConsumer(q);
connection.start();
SpyObjectMessage m;
Queue originialDestination = null;
//There can only be one in my case, but really you have to look it up every time.
MessageProducer producer = null;
while ((m = (SpyObjectMessage) consumer.receive(5000)) != null) {
Object o = m.getObject();
Date messageDate = new Date(m.getJMSTimestamp());
String originalQueue = m.getStringProperty("JBOSS_ORIG_DESTINATION");
if (originialDestination == null) {
originialDestination = (Queue) ctx.lookup("/queue/" +
originalQueue.substring(originalQueue.indexOf('.') + 1));
producer = session.createProducer(originialDestination);
}
producer.send(session.createObjectMessage((Serializable) o));
m.acknowledge();
}
//session.commit(); //Uncomment to make this real.
connection.close();
ctx.close();
答案 2 :(得分:0)
注意:我为CodeStreet工作
我们的JMS ReplayService'产品完全针对此用例构建:搜索和检索以前发布的消息(n次交付) - JMS实际上是为一次性交付而设计的。
使用ReplayService for JMS,您可以配置WebLogic记录以记录发布到主题或队列的所有消息。通过基于Web的GUI,您可以搜索单个消息(通过子字符串,XPath或JMS选择器),然后再次将它们重播到原始JMS目标。
有关详细信息,请参阅http://www.codestreet.com/marketdata/jms/jms_details.php。