Couple of questions:

 - Do you have any consumers on the DLQ?
 - Are messages being sent to the DLQ by the broker automatically (e.g.
based on delivery attempt failures) or is that being done by your
application?
 - How are you setting the expiry delay?
 - Do you have a reproducible test-case?


Justin

On Fri, Feb 23, 2018 at 4:38 AM, Ilkka Virolainen <
ilkka.virolai...@bitwise.fi> wrote:

> I'm still facing an issue with somewhat confusing behavior regarding
> message expiration in the DLQ, maybe related to the memory issues I've been
> having. My aim is to have messages routed to DLQ expire and dropped in one
> hour. To achieve this, I've set an empty expiry-address and the appropriate
> expiry-delay. The problem is, most of the messages routed to DLQ end up in
> an in-delivery state - they are not expiring and I cannot remove them via
> JMX. Messagecount in the DLQ is slightly higher than the deliveringcount
> and attempting to remove all messages only removes a number of messages
> that is equal to the difference between deliveringcount and messagecount
> which is approximately a few thousand messages while the messagecount is
> tens of thousands and increasing as message delivery failures occur.
>
> What could be the reason for this behavior and how could it be avoided?
>
> -----Original Message-----
> From: Ilkka Virolainen [mailto:ilkka.virolai...@bitwise.fi]
> Sent: 22. helmikuuta 2018 13:38
> To: users@activemq.apache.org
> Subject: RE: Artemis 2.4.0 - Issues with memory leaks and JMS message
> redistribution
>
> To answer my own question in case anyone else is wondering about a similar
> issue, turns out the change in addressing is referred in ticket [1] and
> adding the multicastPrefix and anycastPrefix described in the ticket to my
> broker acceptors seems to have fixed my problem. If the issue regarding
> memory leaks persists I will try to provide a reproducible test case.
>
> Thank you for your help, Justin.
>
> Best regards,
> - Ilkka
>
> [1] https://issues.apache.org/jira/browse/ARTEMIS-1644
>
>
> -----Original Message-----
> From: Ilkka Virolainen [mailto:ilkka.virolai...@bitwise.fi]
> Sent: 22. helmikuuta 2018 12:33
> To: users@activemq.apache.org
> Subject: RE: Artemis 2.4.0 - Issues with memory leaks and JMS message
> redistribution
>
> Having removed the address configuration and having switched from 2.4.0 to
> yesterday's snapshot of 2.5.0 it seems like the redistribution of messages
> is now working, but there also seems to have been a change in addressing
> between the versions causing another problem related to jms.queue /
> jms.topic prefixing. While the NMS clients listen and artemis jms clients
> send to the same topics as described in the previous message, Artemis 2.5.0
> prefixes the addresses with jms.topic. While the messages are being sent to
> e.g.  A.B.f64dd592-a8fb-442e-826d-927834d566f4.C.D they are only received
> if I explicitly prefix the listening address with jms.topic, for example
> topic://jms.topic.A.B.*.C.D. Can this somehow be avoided in the broker
> configuration?
>
> Best regards
>
> -----Original Message-----
> From: Justin Bertram [mailto:jbert...@apache.org]
> Sent: 21. helmikuuta 2018 15:19
> To: users@activemq.apache.org
> Subject: Re: Artemis 2.4.0 - Issues with memory leaks and JMS message
> redistribution
>
> Your first issue is probably a misconfiguration.  Your cluster-connection
> is using an "address" value of '*' which I assume is supposed to mean "all
> addresses," but the "address" element doesn't support wildcards like this.
> Just leave it empty to match all addresses.  See the documentation [1] for
> more details.
>
> Even after you fix that configuration issue you may run into issues.
> These may be fixed already via ARTEMIS-1523 and/or ARTEMIS-1680.  If you
> have a reproducible test-case then you can verify using the head of the
> master branch.
>
> For the memory issue it would be helpful to have some heap dumps or
> something to actually see what's actually consuming the memory.  Better yet
> would be a reproducible test-case.  Do you have either?
>
>
> Justin
>
> [1] https://activemq.apache.org/artemis/docs/latest/clusters.html
>
>
>
> On Wed, Feb 21, 2018 at 5:39 AM, Ilkka Virolainen <
> ilkka.virolai...@bitwise.fi> wrote:
>
> > Hello,
> >
> > I am using Artemis 2.4.0 to broker messages through JMS queues/topics
> > between a set of clients. Some are Apache NMS 1.7.2 ActiveMQ clients
> > and others are using Artemis JMS client 1.5.4 included in Spring Boot
> 1.5.3.
> > Broker topology is a symmetric cluster of two live nodes with static
> > connectors, both nodes having been setup as replicating colocated
> > backup pairs with scale down. I have two quite frustrating issues at the
> moment:
> > message redistribution not working correctly and a memory leak causing
> > eventual thread death.
> >
> > ISSUE #1 - Message redistribution / load balancing not working:
> >
> > Client 1 (NMS) connects to broker a and starts listening, artemis
> > creates the following address:
> >
> > (Broker a):
> > A.B.*.C.D
> > |-queues
> > |-multicast
> >   |-f64dd592-a8fb-442e-826d-927834d566f4
> >
> > Server 1 (artemis-jms-client) connects to broker b and sends a message
> > to
> > topic: A.B.f64dd592-a8fb-442e-826d-927834d566f4.C.D - this should be
> > routed to broker a since the corresponding queue has no consumers on
> > broker b (the queue does not exist). This however does not happen and
> > the client receives no messages. Broker b has some other clients
> > connected, causing similar (but not the same) queues having been created:
> >
> > (Broker b):
> > A.B.*.C.D
> > |-queues
> > |-multicast
> >   |-1eb48079-7fd8-40e9-b822-bcc25695ced0
> >   |-9f295257-c352-4ae6-b74b-d5994f330485
> >
> >
> > ISSUE #2: - Memory leak and eventual thread death
> >
> > Artemis broker has 4GB allocated heap space and global-max-size is set
> > up as half of that (being the default setting). Address-full-policy is
> > set to PAGE for all addresses and some individual addresses have small
> > max-size-bytes values set e.g. 104857600. As far as I know the paging
> > settings should limit memory usage but what happens is that at times
> > Artemis uses the whole heap space, encounters an out of memory error
> > and
> > dies:
> >
> > 05:39:29,510 WARN  [org.eclipse.jetty.util.thread.QueuedThreadPool] :
> > java.lang.OutOfMemoryError: Java heap space
> > 05:39:16,646 WARN  [io.netty.channel.ChannelInitializer] Failed to
> > initialize a channel. Closing: [id: ...]: java.lang.OutOfMemoryError:
> > Java heap space
> > 05:41:05,597 WARN  [org.eclipse.jetty.util.thread.QueuedThreadPool]
> > Unexpected thread death: org.eclipse.jetty.util.thread.
> > QueuedThreadPool$2@5ffaba31 in qtp20111564{STARTED,8<=8<=200,i=2,q=0}
> >
> > Are these known issues in Artemis or misconfigurations in the brokers?
> >
> > The broker configurations are as follows. Broker b has an identical
> > configuration excluding that the cluster connector's connector-ref and
> > static-connector connector-ref refer to broker b and broker a
> respectively.
> >
> > Best regards,
> >
> > broker.xml (broker a):
> >
> > <?xml version='1.0'?>
> > <configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/
> > 2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq
> > /schema/artemis-configuration.xsd">
> >     <core xmlns="urn:activemq:core" xmlns:xsi="http://www.w3.org/
> > 2001/XMLSchema-instance" xsi:schemaLocation="urn:activemq:core ">
> >         <name>[broker-a-ip]</name>
> >         <persistence-enabled>true</persistence-enabled>
> >
> >         <journal-type>NIO</journal-type>
> >
> >         <paging-directory>...</paging-directory>
> >         <bindings-directory>...</bindings-directory>
> >         <journal-directory>...</journal-directory>
> >         <large-messages-directory>...</large-messages-directory>
> >
> >         <journal-datasync>true</journal-datasync>
> >         <journal-min-files>2</journal-min-files>
> >         <journal-pool-files>-1</journal-pool-files>
> >         <journal-buffer-timeout>788000</journal-buffer-timeout>
> >         <disk-scan-period>5000</disk-scan-period>
> >
> >         <max-disk-usage>97</max-disk-usage>
> >
> >         <critical-analyzer>true</critical-analyzer>
> >         <critical-analyzer-timeout>120000</critical-analyzer-timeout>
> >         <critical-analyzer-check-period>60000</critical-
> > analyzer-check-period>
> >         <critical-analyzer-policy>HALT</critical-analyzer-policy>
> >
> >         <acceptors>
> >             <acceptor name="invm-acceptor">vm://0</acceptor>
> >             <acceptor name="artemis">tcp://0.0.0.0:61616</acceptor>
> >             <acceptor name="ssl">tcp://0.0.0.0:61617?sslEnabled=true;
> > keyStorePath=...;keyStorePassword=...</acceptor>
> >         </acceptors>
> >         <connectors>
> >             <connector name="invm-connector">vm://0</connector>
> >             <connector name="netty-connector">tcp://[
> > broker-a-ip]:61616</connector>
> >             <connector name="broker-b-connector">[
> > broker-b-ip]:61616</connector>
> >         </connectors>
> >
> >         <cluster-connections>
> >             <cluster-connection name="cluster-name">
> >                 <address>*</address>
> >                 <connector-ref>netty-connector</connector-ref>
> >                 <retry-interval>500</retry-interval>
> >                 <reconnect-attempts>5</reconnect-attempts>
> >                 <use-duplicate-detection>true</use-duplicate-detection>
> >                 <message-load-balancing>ON_DEMAND</message-load-
> balancing>
> >                 <max-hops>1</max-hops>
> >                 <static-connectors>
> >                     <connector-ref>broker-b-connector</connector-ref>
> >                 </static-connectors>
> >             </cluster-connection>
> >         </cluster-connections>
> >
> >         <ha-policy>
> >             <replication>
> >                 <colocated>
> >
> > <backup-request-retry-interval>5000</backup-request-
> > retry-interval>
> >                     <max-backups>3</max-backups>
> >                     <request-backup>true</request-backup>
> >                     <backup-port-offset>100</backup-port-offset>
> >                     <excludes>
> >                         <connector-ref>invm-connector</connector-ref>
> >                         <connector-ref>netty-connector</connector-ref>
> >                     </excludes>
> >                     <master>
> >                         <check-for-live-server>true</
> > check-for-live-server>
> >                     </master>
> >                     <slave>
> >                         <restart-backup>false</restart-backup>
> >                         <scale-down />
> >                     </slave>
> >                 </colocated>
> >             </replication>
> >         </ha-policy>
> >
> >         <cluster-user>ARTEMIS.CLUSTER.ADMIN.USER</cluster-user>
> >         <cluster-password>[the shared cluster
> > password]</cluster-password>
> >
> >         <security-settings>
> >             <security-setting match="#">
> >                 <permission type="createDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="deleteDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="createNonDurableQueue" roles="amq,
> > other-role"  />
> >                 <permission type="createAddress" roles="amq, other-role"
> />
> >                 <permission type="deleteNonDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="deleteAddress" roles="amq, other-role"
> />
> >                 <permission type="consume" roles="amq, other-role" />
> >                 <permission type="browse" roles="amq, other-role" />
> >                 <permission type="send" roles="amq, other-role" />
> >                 <permission type="manage" roles="amq" />
> >             </security-setting>
> >             <security-setting match="A.some.queue">
> >                 <permission type="createNonDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="deleteNonDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="createDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="deleteDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="createAddress" roles="amq, other-role"
> />
> >                 <permission type="deleteAddress" roles="amq, other-role"
> />
> >                 <permission type="consume" roles="amq, other-role" />
> >                 <permission type="browse" roles="amq, other-role" />
> >                 <permission type="send" roles="amq, other-role" />
> >             </security-setting>
> >                 <security-setting match="A.some.other.queue">
> >                 <permission type="createNonDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="deleteNonDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="createDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="deleteDurableQueue" roles="amq,
> > other-role" />
> >                 <permission type="createAddress" roles="amq, other-role"
> />
> >                 <permission type="deleteAddress" roles="amq, other-role"
> />
> >                 <permission type="consume" roles="amq, other-role" />
> >                 <permission type="browse" roles="amq, other-role" />
> >                 <permission type="send" roles="amq, other-role" />
> >             </security-setting>
> >             ...
> >             ... etc.
> >             ...
> >         </security-settings>
> >
> >         <address-settings>
> >             <address-setting match="activemq.management#">
> >                 <dead-letter-address>DLQ</dead-letter-address>
> >                 <expiry-address>ExpiryQueue</expiry-address>
> >                 <redelivery-delay>0</redelivery-delay>
> >                 <max-size-bytes>-1</max-size-bytes>
> >
> > <message-counter-history-day-limit>10</message-counter-
> > history-day-limit>
> >                 <address-full-policy>PAGE</address-full-policy>
> >             </address-setting>
> >             <!--default for catch all -->
> >             <address-setting match="#">
> >                 <dead-letter-address>DLQ</dead-letter-address>
> >                 <expiry-address>ExpiryQueue</expiry-address>
> >                 <redelivery-delay>0</redelivery-delay>
> >                 <max-size-bytes>-1</max-size-bytes>
> >
> > <message-counter-history-day-limit>10</message-counter-
> > history-day-limit>
> >                 <address-full-policy>PAGE</address-full-policy>
> >                 <redistribution-delay>1000</redistribution-delay>
> >             </address-setting>
> >             <address-setting match="DLQ">
> >                 <!-- 100 * 1024 * 1024 -> 100MB -->
> >                 <max-size-bytes>104857600</max-size-bytes>
> >                 <!-- 1000 * 60 * 60 -> 1h -->
> >                 <expiry-delay>3600000</expiry-delay>
> >                 <expiry-address />
> >             </address-setting>
> >             <address-setting match="A.some.queue">
> >                 <redelivery-delay-multiplier>1.0</redelivery-delay-
> > multiplier>
> >                 <redelivery-delay>0</redelivery-delay>
> >                 <max-redelivery-delay>10</max-redelivery-delay>
> >             </address-setting>
> >                 <address-setting match="A.some.other.queue">
> >                 <redelivery-delay-multiplier>1.0</redelivery-delay-
> > multiplier>
> >                 <redelivery-delay>0</redelivery-delay>
> >                 <max-redelivery-delay>10</max-redelivery-delay>
> >                 <max-delivery-attempts>1</max-delivery-attempts>
> >                 <max-size-bytes>104857600</max-size-bytes>
> >             </address-setting>
> >             ...
> >             ... etc.
> >             ...
> >         </address-settings>
> >
> >         <addresses>
> >             <address name="DLQ">
> >                 <anycast>
> >                     <queue name="DLQ" />
> >                 </anycast>
> >             </address>
> >             <address name="ExpiryQueue">
> >                 <anycast>
> >                     <queue name="ExpiryQueue" />
> >                 </anycast>
> >             </address>
> >             <address name="A.some.queue">
> >                 <anycast>
> >                     <queue name="A.some.queue">
> >                         <durable>true</durable>
> >                     </queue>
> >                 </anycast>
> >             </address>
> >             <address name="A.some.other.queue">
> >                 <anycast>
> >                     <queue name="A.some.other.queue">
> >                         <durable>true</durable>
> >                     </queue>
> >                 </anycast>
> >             </address>
> >             ...
> >             ... etc.
> >             ...
> >         </addresses>
> >     </core>
> > </configuration>
> >
>

Reply via email to