uso inicial activemq

Recientemente, el uso de activemq hacer algo, aunque no estoy soportar directamente el módulo, pero ya participar en este proyecto, aprender un poco, pero sigue siendo buena. Construyó un entorno en su conjunto no es más difícil, pero el medio de algunos de los boxes, llegar a decir. (No es demasiado profundo, para dar la bienvenida al dios de la corrección)

En primer lugar, el sitio oficial de los paquetes relacionados ahora, http://activemq.apache.org/download.html resto se necesita el ordenador tiene un entorno Java, (que se menciona directorio en el directorio bin, el directorio de paquetes por defecto activemq bajo), de acuerdo con su propio entorno de ordenador inicia una de 64 bits o 32 bits.La característica principal es la persistencia activemq entrega del retardo de los mensajes y el apoyo mensaje, a fin de garantizar que el mensaje no se pierde, que se utiliza principalmente en este proyecto incluso una función, pero que necesita para configurar el retraso en activemq, el valor por defecto no está abierto, un poco hoyuelos .activemq.xml abierto bajo conf, se encontró una etiqueta corredor, además de schedulerSupport dentro del soporte del ángulo de inclinación = "true", si se está ejecutando, es necesario reiniciar para tener efecto, en esta función de retardo de tiempo para apoyar ninguna otra configuración temporal.

Establecer proyectos básicos de primavera para proyectar experto como un ejemplo, en el pom añadido:

<dependency>
            <groupId> org.apache.activemq </ groupId>
            <artifactId> activemq-all </ artifactId>
            <versión> 5.12.0 </ versión>
        </ dependency>

paquete de ingeniería no pom para añadir el frasco correspondiente, el archivo de configuración applicationContext.xml:

<bean id = clase "targetConnectionFactory" = "org.apache.activemq.spring.ActiveMQConnectionFactory">
        <nombre de propiedad = valor "brokerURL" = "tcp: // localhost: 61616" />
        <nombre de propiedad = valor "useAsyncSend" = "true" />
    </ bean>
    <bean id = clase "ConnectionFactory" = "org.springframework.jms.connection.SingleConnectionFactory">
        <property name = "targetConnectionFactory" ref = "targetConnectionFactory" />
    </ bean>
    <! -这个是队列目的地,点对点的->
    <id = clase "queueDestination" grano = "org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg>
            <Valor> MyQueue </ value>
        </ Arg-constructor>
    </ el grano>
    <! - Spring proporciona las herramientas JMS, puede enviar un mensaje, recepción, etc ->
    <Bean lo anterior mencionado ID = "la JmsTemplate" class = "org.springframework.jms.core.JmsTemplate">
        <! - ConnectionFactory este objeto ConnectionFactory que corresponde a la definición de nuestra oferta de primavera ->
        <Property name = "ConnectionFactory" ref = "ConnectionFactory" />
        <Property name = "defaultDestination" REF = "queueDestination" />
        <Property name = "pubSubDomain es" value = "false" />
        <Property name = "explicitQosEnabled" value = "true" /> <! - deliveryMode, la prioridad, el interruptor timeToLive, para ser eficaz, debe estar configurado como true, defecto es false ->
        <nombre = valor de la propiedad "deliveryMode" = /> < "2" - el modo de transmisión DeliveryMode.NON_PERSISTENT = 1 :! no persistente; DeliveryMode.PERSISTENT = 2: persistencia ->
        <Nombre de la propiedad = valor "SessionAcknowledgeMode" = /" 1" .>
        <! - Mensaje de respuesta de manera
        Session.AUTO_ACKNOWLEDGE 1 sesión automáticamente mensajes
        Session.CLIENT_ACKNOWLEDGE 2 cliente llama a un método para reconocer la recepción manualmente
        Session.DUPS_OK_ACKNOWLEDGE 3 no necesariamente tiene que ser firmado, el mensaje puede ser enviado en varias ocasiones
        ->
    </ el grano>
    <! - escucha de mensajes ->
    <= la clase bean id "consumerMessageListener" = "com.wei.activemq.MsgListener" />
    <! - mensaje contenedor oyente ->
    <bean id = la clase "jmsContainer" = "org.springframework.jms.listener.DefaultMessageListenerContainer">
        <Property name = "ConnectionFactory" REF = "ConnectionFactory" />
        <Property name = "¿Dónde quieres" REF = /> "queueDestination"
        <Property name = "MessageListener" REF = "consumerMessageListener" />
    </ Bean>


然后添加相应的支持

定义我们要发送的消息任务:

public class MsgTask implements Serializable {
    private long id;
    private String name;
    private long delayTime;
    //getter setter...
}

定义消息生产者

@Service
public class MsgProducer {
    @Autowired
    public JmsTemplate jmsTemplate;
    /**
     * send message
     */
    public void sendMessage(final MsgTask msgTask) {
        jmsTemplate.send(jmsTemplate.getDefaultDestination(), new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                ObjectMessage objectMessage = session.createObjectMessage(msgTask);
//                objectMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, msgTask.getDelayTime());打开注解,即可发送延时的消息
                objectMessage.setJMSExpiration(msgTask.getDelayTime());
                objectMessage.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
                objectMessage.setJMSType("延迟发送的消息");
                Constants.map.put(msgTask.hashCode(),msgTask);
               
return objectMessage;
            }
        });
    }
}

定义消息接收者:

public class MsgListener implements MessageListener {


    public void onMessage(Message m) {
        System.out.println("[receive message]");


        ObjectMessage om = (ObjectMessage) m;
        try {
            MsgTask msgTask = (MsgTask) om.getObject();
            Constants.receivemap.put(msgTask.hashCode(), msgTask);
            System.out.println("延迟发送时间:" + msgTask.getDelayTime() / 1000);
            System.out.println("model:" + om.getJMSDeliveryMode());
            System.out.println("destination:" + om.getJMSDestination());
            System.out.println("type:" + om.getJMSType());
            System.out.println("messageId:" + om.getJMSMessageID());
            System.out.println("time:" + om.getJMSTimestamp());
            System.out.println("expiredTime:" + om.getJMSExpiration());
            System.out.println("priority:" + om.getJMSPriority());
            System.out.println("到达率:" + Constants.receivemap.size() * 1.0 / Constants.map.size());
//            System.out.println("long Propertity:" + om.getLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY));
            Random random = new Random();


            if (msgTask.getId() % 2 == 0) {
                om.acknowledge();
                System.out.println("耗时为:" + (System.currentTimeMillis() - Constants.beginTime) + " s");
                msgTask.setId(msgTask.getId() + 1);
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}


添加一些测试参数

public class Constants {
    public static ConcurrentHashMap<Integer, MsgTask> map = new ConcurrentHashMap<>();
    public static ConcurrentHashMap<Integer, MsgTask> receivemap = new ConcurrentHashMap<>();


    public static int size = 1000;
    public static long beginTime = 1000;
}


好了,可以写测试一下

public class MainTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        MsgProducer msgProducer = (MsgProducer) applicationContext.getBean("msgProducer");
        Constants.beginTime = System.currentTimeMillis();
        for (int i = 0; i < 2; i++) {
            MsgTask msgTask = new MsgTask();
            msgTask.setName("test" + i);
            msgTask.setId(i);
            msgTask.setDelayTime((long) Math.random() * 1000);
            msgProducer.sendMessage(msgTask);
        }
    }
}


基本的功能已经可用,可以在大部分场合中使用。


发布了20 篇原创文章 · 获赞 0 · 访问量 1万+

Supongo que te gusta

Origin blog.csdn.net/u011248560/article/details/48413933
Recomendado
Clasificación