Bug in JMSProducer? Settings retained in JMSContext if retained in ApplicationContext
genman Jun 4, 2014 9:24 PMI'm not sure this is a spec thing, but in WildFly I observe the following:
1. Obtain a JMSContext using @Inject into an @ApplicationScoped bean.
2. Create a JMSProducer using JMSContext.createProducer()
3. Set the scheduled delivery time of a message
4. Send the message.
For the second call to send the message, the scheduled delivery time is used once again, although in a totally different thread. Which is totally mysterious.
The work around is something like this:
@RequestScoped class JMSProducerProducer { @Inject JMSContext context; @Produces @RequestScoped JMSProducer getProducer() { JMSProducer producer = context.createProducer(); producer.clearProperties(); producer.setDeliveryDelay(0); producer.setTimeToLive(0); return producer; } }
I'm guessing the code is wrong in that the create method. Perhaps it should simply create a new instance each time?
public class HornetQJMSContext implements JMSContext { @Override public JMSProducer createProducer() { checkSession(); try { return new HornetQJMSProducer(this, getInnerProducer()); } catch (JMSException e) { throw JmsExceptionUtils.convertToRuntimeException(e); } } private synchronized MessageProducer getInnerProducer() throws JMSException { if (innerProducer == null) { innerProducer = session.createProducer(null); } return innerProducer; }
For example:
diff --git a/hornetq-jms-client/src/main/java/org/hornetq/jms/client/HornetQJMSContext.java b/hornetq-jms-client/src/main/java/org/hornetq/jms/client/HornetQJMSContext.java index 27b8e2d..f3c51c5 100644 --- a/hornetq-jms-client/src/main/java/org/hornetq/jms/client/HornetQJMSContext.java +++ b/hornetq-jms-client/src/main/java/org/hornetq/jms/client/HornetQJMSContext.java @@ -58,7 +58,6 @@ private final HornetQConnectionForContext connection; private Session session; private boolean autoStart = HornetQJMSContext.DEFAULT_AUTO_START; - private MessageProducer innerProducer; private boolean xa; private boolean closed; @@ -112,7 +111,7 @@ public JMSProducer createProducer() checkSession(); try { - return new HornetQJMSProducer(this, getInnerProducer()); + return new HornetQJMSProducer(this, session.createProducer(null)); } catch (JMSException e) { @@ -120,16 +119,6 @@ public JMSProducer createProducer() } } - private synchronized MessageProducer getInnerProducer() throws JMSException - { - if (innerProducer == null) - { - innerProducer = session.createProducer(null); - } - - return innerProducer; - } - /** * */