ActiveMQ

activemq

JMS

Java Message Service - Message Oriented MiddleWare
- asynchronous communication (send - receive)
- pub/sub (one to many)

term
  • Provider
  • Consumer
  • P2P point to point (queue)
  • Pub/Sub publish/subscribe (topic)
  • ConnectionFactory
  • Connection app <–> mqServer
  • Session create with connection
  • Destination create with session

activemq

conf:
activemq.xml、jetty.xml、jetty-realm.properties
data:
message persistence, default use kahadb also can use leveldb or jdbc to mysql etc

message component
head(router) + attribute(selector) + body(5 kind)
messageSelector
message.setIntProperty("xx",1);
message.setIntProperty("xx",2);
message.setIntProperty("xx",3);

----------

String condition = "xx >= 2";
session.createMessageConsumer(destination,condition);
acknowledgeMode
  • AUTO_ACKNOWLEDGE 1
    when consumer receive message simultaneously sign up
  • CLIENT_ACKNOWLEDGE 2
    with manual sign up when message be handled successfully(in actual uesd)
  • DUPS_OK_ACKNOWLEDGE 3
    never matter
priority

theoretically, not guaranteed the the messages with high priority is comsumed earlier than the lower ones;

  • 0-4 normal, default is 4
  • 5-9 urgent
async receive

Dead loop: MessageConsumer.receive()/receive(long)/receiveNoWait
listener: MessageConsumer.setMessageListener(MessageListener - onMessage)

durable sub

When subscriber offline with reboot or other event, some message will lost because the sub-thread must be always running. To avoid the case, use durable sub to keep the message in MQ server when subscriber online.

  1. modify conf/activemq.xml
<bean id="mqDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/activemq?releaseAutoCommit=true"/>
    <property name="username" value="root"/>
    <property name="password" value="xxx"/>
    <property name="maxActive" value="200"/>
    <property name="poolPreparedStatements" value="true"/>
</bean>

----------

<persistenceAdapter>
      <jdbcPersistenceAdapter dataSource="#mqDataSource" />
</persistenceAdapter>

ps: check “lib” with mysql-connector-java-5.1.31.jar and commons-dbcp2-2.1.1.jar

code impl(pub/sub)

activemq api:

connection.setClientID("xxx");
session.createDurableSubscriber(destination,"xxx");

spring-integrate(deliveryPersistent or deliveryMode, clientId):

<property name="deliveryPersistent" value="true" /> or <property name="deliveryMode" value="2" />

CachingConnectionFactory:
<property name="clientId" value="Client-A" />

DefaultMessageListenerContainer:
<property name="clientId" value="Client-A" />
<property name="durableSubscriptionName" value="clientA"/>
  • how to use spring-activemq to impl durable *
persist to mysql
use api impl P2P/Pub-Sub

connectionFactory = new ActiveMQConnectionFactory(Consumer.USERNAME, Consumer.PASSWORD,
                Consumer.BROKEURL);

connection = connectionFactory.createConnection();

connection.start();

session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

destination = session.createQueue("HelloWorld");

destination = session.createTopic("testTopic");


messageProducer = session.createProducer(destination);

messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

TextMessage message = session.createTextMessage("ActiveMQ Send msg" + i);


messageProducer.send(message);
session.commit();

connecttion.close();

messageConsumer = session.createConsumer(destination);
messageConsumer.receive(100000);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值