activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Gary Tully <gary.tu...@gmail.com>
Subject Re: ClassCastException having relation to expired messages
Date Thu, 09 Jul 2009 16:24:40 GMT
forget that, I just created the issue, please add to it if needed:
https://issues.apache.org/activemq/browse/AMQ-2322

2009/7/9 Gary Tully <gary.tully@gmail.com>:
> Can you create a jira issue [1] for this (include as much of this
> detail as possible) and I will try and get it into 5.3
>
> [1] https://issues.apache.org/activemq/secure/CreateIssue!default.jspa
>
> 2009/7/9 sic <sic_1234@naver.com>:
>>
>> The problem still occured in the latest 5.3-SNAPSHOT.
>>
>> I make reference to sample of this URL
>> http://www.nabble.com/ActiveMQ-message-delivery-td18355245.html
>>
>> import javax.jms.Connection;
>> import javax.jms.ConnectionFactory;
>> import javax.jms.DeliveryMode;
>> import javax.jms.Destination;
>> import javax.jms.JMSException;
>> import javax.jms.MessageProducer;
>> import javax.jms.ObjectMessage;
>> import javax.jms.Session;
>>
>> import org.apache.activemq.ActiveMQConnectionFactory;
>>
>> import junit.framework.TestCase;
>>
>> /**
>>  * @author Marjan Sterjev
>>  *
>>  */
>> public class ProducerTester extends TestCase {
>>
>>        public void testSendQueue() throws JMSException, InterruptedException
{
>>                ConnectionFactory connectionFactory = new
>> ActiveMQConnectionFactory("tcp://localhost:61616");
>>                Connection connection = connectionFactory.createConnection();
>>                Session session = connection.createSession(false,
>>                        Session.AUTO_ACKNOWLEDGE);
>>                Destination destination = session.createQueue("test.queue");
>>                MessageProducer producer = session.createProducer(destination);
>>                producer.setDeliveryMode(DeliveryMode.PERSISTENT);
>>                producer.setTimeToLive(10000);
>>                int msgCount = 20;
>>                int sleep = 100;
>>                String payload = "Test Message";
>>                for (int i = 0; i < msgCount; i++) {
>>                        ObjectMessage message = session.createObjectMessage();
>>                        String p = String.format("%s:%d", payload, (i
+ 1));
>>                        message.setObject(p);
>>                        producer.send(message);
>>                        Thread.sleep(sleep);
>>                }
>>                producer.close();
>>                session.close();
>>                connection.close();
>>        }
>> }
>>
>> I have already known a workaround which works a periodic message expiry task
>> as you refer.
>>
>> However unusual case can occur as I mentioned.
>>
>> Test steps are followed :
>> start an ActiveMQ setting a vm queue cursor.
>> set a MessageConsumer to consume only those messages that had expired in
>> every 5 minutes.
>> send a message(set TimeToLive to 10 seconds) by junit test case
>> (ProducerTester class)
>> After between 10 seconds and 5 minutes(hope that message is expired while
>> MessageConsumer doesn't work yet), make server shutdown abruptly so that
>> messages which has been expired leaves on queue.
>> restart an ActiveMQ.
>> In this states, an ActiveMQ cannot be stated by ClassCastException.
>>
>>
>>
>> Gary Tully wrote:
>>>
>>> would it be possible to provide a junit test case that demonstrates this
>>> behavior? I wonder does the problem persist with the latest 5.3-SNAPSHOT?
>>>
>>> Trunk has a resolution to
>>> https://issues.apache.org/activemq/browse/AMQ-1112that provides a
>>> periodic message expiry task. That should help but it may be
>>> that there still remains some assumptions about the type of message.
>>> A junit test case would help lots.
>>>
>>>
>>>
>>> 2009/7/7 sic <sic_1234@naver.com>
>>>
>>>>
>>>> While expired messages remain on queue, server cannot be re-started with
>>>> ClassCastException until I delete persistent file(e.g. file :
>>>> data\kr-store\data\hash-index-queue-data_queue#3a#2f#2fTEST.QUEUE,
>>>> QueueName
>>>> : TEST.QUEUE) of the queue which has expired messages
>>>>
>>>> Yet, this way has disadvantage that all of messages on specified queue
>>>> have
>>>> been purged regardless of expiration.
>>>>
>>>> Does anyone have other ways?
>>>>
>>>>
>>>> sic wrote:
>>>> >
>>>> > While testing ActiveMQ5.2.0, I have a question about expired message.
>>>> >
>>>> > Note that testing messages are Persistent and using a queue, set
>>>> message
>>>> > expiration time to 10 seconds. configurations are same except
>>>> destination
>>>> > policy(using a vm queue cursor) as below
>>>> > <destinationPolicy>
>>>> >       <policyMap>
>>>> >               <policyEntries>
>>>> >                       <policyEntry queue=">" memoryLimit="5mb">
>>>> >                               <dispatchPolicy>
>>>> >                                       <strictOrderDispatchPolicy
/>
>>>> >                               </dispatchPolicy>
>>>> >                               <deadLetterStrategy>
>>>> >                                       <individualDeadLetterStrategy
>>>> queuePrefix="DLQ."/>
>>>> >                               </deadLetterStrategy>
>>>> >                               <pendingQueuePolicy>
>>>> >                                       <vmQueueCursor
/>
>>>> >                               </pendingQueuePolicy>
>>>> >                       </policyEntry>
>>>> >               </policyEntries>
>>>> >       </policyMap>
>>>> > </destinationPolicy>
>>>> > Additionally, it turns out that the activemq broker actually does not
>>>> > proactively purge expired messages from queues. so we set
>>>> > a thread that periodically cleared my queues of expired messages by
>>>> help
>>>> > of this forum's advisor.
>>>> > We suppose that a server is stopped unexpectedly when expired message
>>>> > leaves on queue without disposed by the thread
>>>> > After recovering a server, we will expect that remained messages
>>>> including
>>>> > both normal and expired message are loaded normally
>>>> > However server stopped abnormally and some error occured while starting
>>>> > ActiveMQ. Errors are like that
>>>> >
>>>> > 2009-07-01 17:13:45,125 [main           ] INFO  BrokerService
>>>> > - For help or more information please see: http://activemq.apache.org/
>>>> > 2009-07-01 17:13:45,421 [main           ] INFO  KahaStore
>>>> > - Kaha Store using data directory
>>>> > D:\apache\apache-activemq-5.2.0\binary\bin\..\data\kr-store\data
>>>> > 2009-07-01 17:13:45,796 [main           ] ERROR BrokerService
>>>> > - Failed to start ActiveMQ JMS Message Broker. Reason:
>>>> > java.lang.ClassCastException:
>>>> > org.apache.activemq.command.ActiveMQObjectMessage
>>>> > java.lang.ClassCastException:
>>>> > org.apache.activemq.command.ActiveMQObjectMessage
>>>> >       at
>>>> > org.apache.activemq.broker.region.Queue.messageExpired(Queue.java:1114)
>>>> >       at
>>>> > org.apache.activemq.broker.region.Queue.messageExpired(Queue.java:1106)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.region.Queue$5.recoverMessage(Queue.java:173)
>>>> >       at
>>>> >
>>>> org.apache.activemq.store.amq.RecoveryListenerAdapter.recoverMessage(RecoveryListenerAdapter.java:45)
>>>> >       at
>>>> >
>>>> org.apache.activemq.store.amq.RecoveryListenerAdapter.recoverMessageReference(RecoveryListenerAdapter.java:56)
>>>> >       at
>>>> >
>>>> org.apache.activemq.store.kahadaptor.KahaReferenceStore.recoverReference(KahaReferenceStore.java:82)
>>>> >       at
>>>> >
>>>> org.apache.activemq.store.kahadaptor.KahaReferenceStore.recover(KahaReferenceStore.java:93)
>>>> >       at
>>>> >
>>>> org.apache.activemq.store.amq.AMQMessageStore.recover(AMQMessageStore.java:481)
>>>> >       at
>>>> org.apache.activemq.broker.region.Queue.initialize(Queue.java:167)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.region.DestinationFactoryImpl.createDestination(DestinationFactoryImpl.java:83)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.region.AbstractRegion.createDestination(AbstractRegion.java:434)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.jmx.ManagedQueueRegion.createDestination(ManagedQueueRegion.java:56)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.region.AbstractRegion.addDestination(AbstractRegion.java:120)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.region.RegionBroker.addDestination(RegionBroker.java:261)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.BrokerFilter.addDestination(BrokerFilter.java:142)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.BrokerFilter.addDestination(BrokerFilter.java:142)
>>>> >       at
>>>> >
>>>> org.apache.activemq.advisory.AdvisoryBroker.addDestination(AdvisoryBroker.java:147)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.BrokerFilter.addDestination(BrokerFilter.java:142)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.MutableBrokerFilter.addDestination(MutableBrokerFilter.java:149)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.region.AbstractRegion.start(AbstractRegion.java:94)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.region.RegionBroker.start(RegionBroker.java:176)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.jmx.ManagedRegionBroker.start(ManagedRegionBroker.java:103)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.TransactionBroker.start(TransactionBroker.java:112)
>>>> >       at
>>>> org.apache.activemq.broker.BrokerFilter.start(BrokerFilter.java:154)
>>>> >       at
>>>> org.apache.activemq.broker.BrokerFilter.start(BrokerFilter.java:154)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.MutableBrokerFilter.start(MutableBrokerFilter.java:161)
>>>> >       at
>>>> org.apache.activemq.broker.BrokerService.start(BrokerService.java:468)
>>>> >       at
>>>> >
>>>> org.apache.activemq.xbean.XBeanBrokerService.afterPropertiesSet(XBeanBrokerService.java:52)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
>>>> >       at java.security.AccessController.doPrivileged(Native Method)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
>>>> >       at
>>>> >
>>>> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
>>>> >       at
>>>> >
>>>> org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
>>>> >       at
>>>> >
>>>> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
>>>> >       at
>>>> >
>>>> org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:64)
>>>> >       at
>>>> >
>>>> org.apache.xbean.spring.context.ResourceXmlApplicationContext.<init>(ResourceXmlApplicationContext.java:52)
>>>> >       at
>>>> >
>>>> org.apache.activemq.xbean.XBeanBrokerFactory.createApplicationContext(XBeanBrokerFactory.java:96)
>>>> >       at
>>>> >
>>>> org.apache.activemq.xbean.XBeanBrokerFactory.createBroker(XBeanBrokerFactory.java:52)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:71)
>>>> >       at
>>>> >
>>>> org.apache.activemq.broker.BrokerFactory.createBroker(BrokerFactory.java:54)
>>>> >       at
>>>> >
>>>> org.apache.activemq.console.command.StartCommand.startBroker(StartCommand.java:115)
>>>> >       at
>>>> >
>>>> org.apache.activemq.console.command.StartCommand.runTask(StartCommand.java:74)
>>>> >       at
>>>> >
>>>> org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
>>>> >       at
>>>> >
>>>> org.apache.activemq.console.command.ShellCommand.runTask(ShellCommand.java:129)
>>>> >       at
>>>> >
>>>> org.apache.activemq.console.command.AbstractCommand.execute(AbstractCommand.java:57)
>>>> >       at
>>>> >
>>>> org.apache.activemq.console.command.ShellCommand.main(ShellCommand.java:79)
>>>> >       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>> >       at
>>>> >
>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>> >       at
>>>> >
>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>> >       at java.lang.reflect.Method.invoke(Method.java:585)
>>>> >       at org.apache.activemq.console.Main.runTaskClass(Main.java:225)
>>>> >       at org.apache.activemq.console.Main.main(Main.java:106)
>>>> > 2009-07-01 17:13:45,812 [main           ] INFO  BrokerService
>>>> > - ActiveMQ Message Broker (localhost, null) is shutting down
>>>> > 2009-07-01 17:13:45,828 [main           ] INFO  NetworkConnector
>>>> > - Network Connector default-nc Stopped
>>>> >
>>>> > It's in Windows XP.
>>>> >
>>>> > Regards
>>>> >
>>>>
>>>> --
>>>> View this message in context:
>>>> http://www.nabble.com/ClassCastException-having-relation-to-expired-messages-tp24287023p24369696.html
>>>> Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>>>>
>>>>
>>>
>>>
>>> --
>>> http://blog.garytully.com
>>>
>>> Open Source Integration
>>> http://fusesource.com
>>>
>>>
>>
>> --
>> View this message in context: http://www.nabble.com/ClassCastException-having-relation-to-expired-messages-tp24287023p24407653.html
>> Sent from the ActiveMQ - User mailing list archive at Nabble.com.
>>
>>
>
>
>
> --
> http://blog.garytully.com
>
> Open Source Integration
> http://fusesource.com
>



-- 
http://blog.garytully.com

Open Source Integration
http://fusesource.com

Mime
View raw message