Hi,
Part of my camel route consists of a JMS queue, being polled and its
messages being stored in a db, depending on message type. The route is
transacted, and therefore it's not possible to configure redeliveryDelay in
the ActiveMQXAConnectionFactory bean, but i had to use a custom processor
"redeliveryDelay" instead that checks the JMSXDeliveryCount in the header
and introduces a delay depending on the retry count.
I would like to have the possibility to configure/manage this processor and
its methods through jconsole/jmx but am having some problems with it:
- without using the annotations @ManagedResource, @ManagedAttribute i can
see the processor mbean, but cannot see its methods
- with annotations the processor mbean is not visible anymore (even if i
"implement Service" like mentioned in the camel FAQ, or if i implement the
deprecated ManagementAware). I also tried using only @ManagedResource or
@ManagedAttribute separately...
- when moving the processor to the recoverable camel:onException route
(preferable since its only executed when needed) the mbean is not visible at
all; even without annotations.
Any ideas?
regards, Tim
Relevant part of route:
<camel:route id="routeStoreInDB">
<camel:from uri="jms:queue:incoming?transacted=true" />
<camel:transacted ref="PROPAGATION_REQUIRED"/>
<camel:process ref="redeliveryDelay" id="redeliveryDelay"/>
<camel:choice>
<camel:when>
<camel:spel>#{request.headers['CamelHL7MessageType'] ==
'ADT'}</camel:spel>
<camel:bean ref="ADTHandler"
method="processADT" />
</camel:when>
<camel:when>
<camel:spel>#{request.headers['CamelHL7MessageType'] ==
'ORM'}</camel:spel>
<camel:bean ref="ORMHandler"
method="processORM" />
</camel:when>
<camel:otherwise>
<camel:log message="NOT HANDLED
Type:${header.CamelHL7MessageType}
Msg:${body}" />
</camel:otherwise>
</camel:choice>
<camel:onException>
<camel:exception>java.sql.SQLException</camel:exception>
<camel:exception>org.springframework.jdbc.CannotGetJdbcConnectionException</camel:exception>
<camel:handled>
<camel:constant>false</camel:constant>
</camel:handled>
<camel:log message="Recoverable error occurred! Will retry in a
few
seconds..." loggingLevel="ERROR" logName="routeStoreInDB_ORM"/>
<camel:rollback markRollbackOnly="true" />
</camel:onException>
<camel:onException>
<camel:exception>java.lang.Exception</camel:exception>
<camel:exception>org.springframework.jdbc.UncategorizedSQLException</camel:exception>
<camel:handled>
<camel:constant>true</camel:constant>
</camel:handled>
<camel:log message="Irrecoverable error occurred!"
loggingLevel="ERROR"
logName="routeStoreInDB_ORM"/>
<camel:to uri="jms:queue:DLQ" />
</camel:onException>
</camel:route>
Processor code:
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.api.management.ManagedAttribute;
import org.apache.camel.api.management.ManagedResource;
@ManagedResource
public class redeliveryDelay implements Processor {
private long delay = 0;
@ManagedAttribute
public long getDelay() {
return delay;
}
@ManagedAttribute
public void setDelay(long delay) {
this.delay = delay;
}
@Override
public void process(Exchange exchange) throws Exception {
String redeliveryCountAsString =
exchange.getIn().getHeader("JMSXDeliveryCount", String.class);
if(redeliveryCountAsString==null) { redeliveryCountAsString="1"; }
int redeliveryCount = Integer.parseInt(redeliveryCountAsString);
switch (redeliveryCount) {
case 0: this.setDelay(0); break;
case 1:
case 2:
case 3: this.setDelay(5000); break; // 3 x 5 seconds
case 4: this.setDelay(60*1000); break; // 1 minute
case 5: this.setDelay(5*60*1000); break; // 5 minutes
case 6: this.setDelay(30*60*1000); break; // 30 minutes
case 7: this.setDelay(60*60*1000); break; // 60 minutes
default: this.setDelay(8*60*60*1000); break; // every 8 hours
}
Thread.sleep(this.getDelay());
}
}
--
View this message in context:
http://camel.465427.n5.nabble.com/Custom-processor-methods-not-visible-in-JConsole-tp5768796.html
Sent from the Camel - Users mailing list archive at Nabble.com.