activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Justin Bertram <jbert...@apache.com>
Subject Re: ActiveMQ does not send some messages
Date Thu, 28 Jan 2016 16:02:49 GMT
You could potentially simplify your configuration code as follows...

  Configuration config = new ConfigurationImpl()
     .setJournalType(JournalType.NIO)
     .setPersistenceEnabled(true)
     .setSecurityEnabled(false)
     .addAcceptorConfiguration(new TransportConfiguration(InVMAcceptorFactory.class.getName()))
     .addAcceptorConfiguration(new TransportConfiguration(NettyAcceptorFactory.class.getName(),
params))
     .addAddressesSetting("jms.queue.*", new AddressSettings()
        .setAddressFullMessagePolicy(AddressFullMessagePolicy.PAGE)
        .setMaxSizeBytes(30 * 1024 * 1024)
        .setPageSizeBytes(10 * 1024 * 1024)
        .setPageCacheMaxSize(20));

The connector was removed because if your clients use URIs then you don't need a connector.
 Here is an example URI that would be equivalent to what you had previously - vm://0?reconnectAttempts=-1&minLargeMessageSize=250000.
 Connection monitoring is disabled by default so you don't need to set clientFailureCheckPeriod
or connectionTTL explicitly.  Also, HA defaults to false so there no real need to set that
either.  Here's an example using the client code you provided:

  ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("vm://0?reconnectAttempts=-1&minLargeMessageSize=250000");
  javax.jms.Connection consumerConnection = connectionFactory.createConnection();
  javax.jms.Connection producerConnection = connectionFactory.createConnection();

I also removed the queue configurations because JMS queues are now auto-created by default
so there's no need to configure them explicitly unless you just want to.  Also, instead of
looking the queues up the clients can simply instantiate them using the JMS API javax.jms.Session#createQueue
or even org.apache.activemq.artemis.api.jms.ActiveMQJMSClient#createQueue.

The other main difference here is the utilization of the fluent API to string together all
the method calls which eliminates a lot of code duplication.

Regarding messages that don't get consumed, I'd need a bit more information about your use-case
and the circumstances around the unconsumed messages to comment further.


Justin

----- Original Message -----
From: "ipolevoy" <igor@expresspigeon.com>
To: users@activemq.apache.org
Sent: Wednesday, January 27, 2016 8:58:23 PM
Subject: Re: ActiveMQ does not send some messages

Hi, Justin. 

here is some compressed code that shows configuration: 
Configuration config = new ConfigurationImpl();
        JMSConfiguration jmsConfig = new JMSConfigurationImpl();
        config.setJournalType(JournalType.NIO);
        config.setPersistenceEnabled(true);
        config.setSecurityEnabled(false);
        config.getAcceptorConfigurations().add(new
TransportConfiguration(InVMAcceptorFactory.class.getName()));
        config.getConnectorConfigurations().put("connector", new
TransportConfiguration(InVMConnectorFactory.class.getName()));
        config.getAcceptorConfigurations().add(new
TransportConfiguration(NettyAcceptorFactory.class.getName(), params));
        ConnectionFactoryConfiguration cfConfig = new
ConnectionFactoryConfigurationImpl();
       
cfConfig.setName("cf").setHA(false).setConnectorNames(singletonList("connector")).setBindings("/cf");
        cfConfig.setClientFailureCheckPeriod(Long.MAX_VALUE);
        cfConfig.setConnectionTTL(-1);
        cfConfig.setReconnectAttempts(-1);
        cfConfig.setMinLargeMessageSize(250000);
        jmsConfig.getConnectionFactoryConfigurations().add(cfConfig);
        for (WorkQueue queue : WorkQueue.values()) {
            JMSQueueConfigurationImpl configuration = new
JMSQueueConfigurationImpl();
           
configuration.setName(queue.getName()).setSelector(null).setDurable(true).setBindings(queue.getQueuePath());
            jmsConfig.getQueueConfigurations().add(configuration);
        }

        AddressSettings addressSettings = new AddressSettings();
       
addressSettings.setAddressFullMessagePolicy(AddressFullMessagePolicy.PAGE);
        addressSettings.setMaxSizeBytes(30 * 1024 * 1024);
        addressSettings.setPageSizeBytes(10 * 1024 * 1024);
        addressSettings.setPageCacheMaxSize(20);
        config.getAddressesSettings().put("jms.queue.*", addressSettings);

        EmbeddedJMS embeddedJMS = new EmbeddedJMS();
        embeddedJMS.setConfiguration(config);
        embeddedJMS.setJmsConfiguration(jmsConfig);


Here are how clients are connected: 

ConnectionFactory connectionFactory = (ConnectionFactory)
embeddedJMSserver.lookup("/cf");
javax.jms.Connection  consumerConnection =
connectionFactory.createConnection();
javax.jms.Connection  producerConnection =
connectionFactory.createConnection();

Session s = consumerConnection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
s.createConsumer(queue).setMessageListener(new DBCommandListener(this));

where DBCommandListener implements MessageListener. 

Also, when we had Hornet, it too was creating large messages.
To be honest, I'm less concerned about  creation of large messages, than the
fact that some messages are not processed until restart of process. 

tx



--
View this message in context: http://activemq.2283324.n4.nabble.com/ActiveMQ-does-not-send-some-messages-tp4706550p4706555.html
Sent from the ActiveMQ - User mailing list archive at Nabble.com.

Mime
View raw message