package org.yamcs.artemis; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import org.apache.activemq.artemis.api.core.TransportConfiguration; import org.apache.activemq.artemis.api.core.client.ClientConsumer; import org.apache.activemq.artemis.api.core.client.ClientMessage; import org.apache.activemq.artemis.api.core.client.ClientProducer; import org.apache.activemq.artemis.api.core.client.ClientSession; import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; import org.apache.activemq.artemis.api.core.client.ActiveMQClient; import org.apache.activemq.artemis.api.core.client.ServerLocator; import org.apache.activemq.artemis.core.client.impl.ClientSessionImpl; import org.apache.activemq.artemis.core.config.Configuration; import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl; import org.apache.activemq.artemis.core.remoting.impl.invm.InVMAcceptorFactory; import org.apache.activemq.artemis.core.remoting.impl.invm.InVMConnectorFactory; import org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptorFactory; import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnection; import org.apache.activemq.artemis.core.server.ActiveMQServer; import org.apache.activemq.artemis.core.server.JournalType; import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl; import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy; import org.apache.activemq.artemis.core.settings.impl.AddressSettings; public class DeadClient { static int n=1000000; static ClientProducer producer; static class NotificationConsumer implements Runnable{ @Override public void run() { try { ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName())); ClientSessionFactory factory = locator.createSessionFactory(); ClientSession session = factory.createSession(false, true, true, true); // session.createQueue("example", "example", true); session.createTemporaryQueue("hornetq.notifications","cucubau"); ClientConsumer nconsumer=session.createConsumer("cucubau"); session.start(); while(true) { ClientMessage nmsg=nconsumer.receive(); String hq_notifType=nmsg.getStringProperty("_HQ_NotifType"); String hq_address=nmsg.getStringProperty("_HQ_Address"); if("CONSUMER_CLOSED".equals(hq_notifType) && "tempAddress".equals(hq_address)) { // System.out.println("closing producer"); producer.close(); } } } catch (Exception e) { e.printStackTrace(); } } } static class ArtemisConsumer implements Runnable{ @Override public void run() { try { ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName())); ClientSessionFactory factory = locator.createSessionFactory(); ClientSession session = factory.createSession(false, true, true, true); NettyConnection nc=(NettyConnection)((ClientSessionImpl)session).getConnection().getTransportConnection(); session.createTemporaryQueue("tempAddress","tempQueue"); ClientConsumer consumer = session.createConsumer("tempQueue",false); session.start(); nc.close(); } catch (Exception e) { e.printStackTrace(); } } } static class ArtemisProducer implements Runnable{ @Override public void run() { SimpleDateFormat sdf=new SimpleDateFormat("hh:mm:ss.SSS"); try { Thread.sleep(2000); ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName())); ClientSessionFactory factory = locator.createSessionFactory(); ClientSession session = factory.createSession(false, true, true, true); producer=session.createProducer("tempAddress"); session.start(); long t0=System.currentTimeMillis(); for(int i=0;i<n;i++) { ClientMessage message = session.createMessage(false); message.getBodyBuffer().writeString("Hello "+i+" "+sdf.format(new Date())); //if(i%1000==0) System.out.println("sending message "+i); producer.send(message); // System.out.println(sdf.format(new Date())+" answer: "+resp.getBodyBuffer().readString()); // Thread.sleep(10); } long t1=System.currentTimeMillis(); double d=t1-t0; //System.out.println(n+" messages received in "+d+" ms, speed: "+1000*d/n+" micros/message"); //System.out.println("still "+session.queueQuery(qname).getMessageCount()+" mesages in the queue"); session.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) throws Exception { Configuration config = new ConfigurationImpl(); HashSet<TransportConfiguration> transports = new HashSet<TransportConfiguration>(); Map<String,Object> params=new HashMap<String,Object>(); params.put("use-nio", true); TransportConfiguration nconfig=new TransportConfiguration(NettyAcceptorFactory.class.getName(),params); transports.add(nconfig); transports.add(new TransportConfiguration(InVMAcceptorFactory.class.getName())); config.setAcceptorConfigurations(transports); config.setJournalType(JournalType.NIO); config.setSecurityEnabled(false); config.setPersistenceEnabled(false); // config.setManagementNotificationAddress(new SimpleString("hornetq.notifications")); // System.out.println("config="+config.); ActiveMQServer server = new ActiveMQServerImpl(config); // new Thread(new SlowClient.ServerControl(server)).start(); server.start(); AddressSettings as=new AddressSettings(); as.setAddressFullMessagePolicy(AddressFullMessagePolicy.BLOCK); as.setMaxSizeBytes(1000); server.getAddressSettingsRepository().addMatch("tempAddress", as); new Thread(new DeadClient.NotificationConsumer()).start(); new Thread(new DeadClient.ArtemisConsumer()).start(); new Thread(new DeadClient.ArtemisProducer()).start(); } }