http://my.oschina.net/u/264430/blog/57318
最近老大让我使用ActiveMQ实现这么个东东:1.查询消息队列中还有多少任务没有执行;2.消息队列的持久化;
真是愁杀我也,以前没见过啊,于是又看文档,又百度又google的,最终还是在一天半之后整出来鸟~~
首先向大家介绍一本书籍《ActiveMQ in Action》,我大部分代码都是参考这本书实现的。好了,废话少说,看代码:
1.首先启动activeMQ的服务
01 | public class RunServer { |
04 |
public static void main(String[] args) throws Exception { |
05 |
RunServer rs = new RunServer(); |
06 |
BrokerService broker = rs.startServer(); |
09 |
public BrokerService startServer() throws Exception{ |
11 |
BrokerService broker = new BrokerService(); |
15 |
File dataFilterDir = new File( "targer/amq-in-action/kahadb" ); |
16 |
KahaDBStore kaha = new KahaDBStore(); |
17 |
kaha.setDirectory(dataFilterDir); |
19 |
kaha.setJournalMaxFileLength( 1024 * 100 ); |
21 |
kaha.setIndexWriteBatchSize( 100 ); |
23 |
kaha.setEnableIndexWriteAsync( true ); |
25 |
broker.setPersistenceAdapter(kaha); |
27 |
broker.addConnector( "tcp://localhost:61616" ); |
28 |
broker.setUseJmx( true ); |
34 |
ManagementContext context = broker.getManagementContext(); |
35 |
context.setConnectorPort( 2011 ); |
36 |
context.setJmxDomainName( "my-broker" ); |
37 |
context.setConnectorPath( "/jmxrmi" ); |
2.发送消息
02 |
private static final int SEND_NUMBER = 1 ; |
04 |
public static void main(String[] args) { |
06 |
ConnectionFactory connectionFactory; |
08 |
Connection connection = null ; |
12 |
Destination destination; |
14 |
MessageProducer producer; |
18 |
connectionFactory = new ActiveMQConnectionFactory( |
19 |
ActiveMQConnection.DEFAULT_USER, |
20 |
ActiveMQConnection.DEFAULT_PASSWORD, |
21 |
"tcp://localhost:61616" ); |
24 |
connection = connectionFactory.createConnection(); |
28 |
session = connection.createSession(Boolean.TRUE, |
29 |
Session.AUTO_ACKNOWLEDGE); |
31 |
destination = session.createQueue( "test-persistence" ); |
33 |
producer = session.createProducer(destination); |
35 |
producer.setDeliveryMode(DeliveryMode.PERSISTENT); |
37 |
sendMessage(session, producer); |
40 |
} catch (Exception e) { |
44 |
if ( null != connection) |
46 |
} catch (Throwable ignore) { |
52 |
public static void sendMessage(Session session, MessageProducer producer) |
54 |
for ( int i = 1 ; i <= SEND_NUMBER; i++) { |
55 |
TextMessage message = session |
56 |
.createTextMessage( "ActiveMq 发送的消息" + i); |
58 |
System.out.println( "发送消息:" + i); |
59 |
producer.send(message); |
3.收消息
01 | public class Receiver { |
02 |
public static void main(String[] args) { |
04 |
ConnectionFactory connectionFactory; |
06 |
Connection connection = null ; |
10 |
Destination destination; |
12 |
MessageConsumer consumer; |
14 |
connectionFactory = new ActiveMQConnectionFactory( |
15 |
ActiveMQConnection.DEFAULT_USER, |
16 |
ActiveMQConnection.DEFAULT_PASSWORD, "tcp://localhost:61616" ); |
19 |
connection = connectionFactory.createConnection(); |
23 |
session = connection.createSession(Boolean.TRUE, |
24 |
Session.AUTO_ACKNOWLEDGE); |
26 |
destination = session.createQueue( "test-persistence" ); |
27 |
consumer = session.createConsumer(destination); |
29 |
consumer.setMessageListener( new MessageListener() { |
30 |
public void onMessage(Message arg0) { |
33 |
} catch (InterruptedException e1) { |
36 |
System.out.println( "==================" ); |
38 |
System.out.println( "RECEIVE1第一个获得者:" |
39 |
+ ((TextMessage) arg0).getText()); |
40 |
} catch (JMSException e) { |
47 |
} catch (Exception e) { |
52 |
if ( null != connection) |
54 |
} catch (Throwable ignore) { |
4.获取消息的状态,也就是上面所说的获得消息队列中未执行的消息数、消费者数、出队数等等
01 | public class StateTest { |
07 |
public static void main(String[] args) throws Exception { |
08 |
JMXServiceURL url = new JMXServiceURL( "service:jmx:rmi:///jndi/rmi://localhost:2011/jmxrmi" ); |
09 |
JMXConnector connector = JMXConnectorFactory.connect(url, null ); |
11 |
MBeanServerConnection connection = connector.getMBeanServerConnection(); |
14 |
ObjectName name = new ObjectName( "my-broker:BrokerName=localhost,Type=Broker" ); |
15 |
BrokerViewMBean mBean = (BrokerViewMBean)MBeanServerInvocationHandler.newProxyInstance(connection, name, BrokerViewMBean. class , true ); |
18 |
for (ObjectName queueName : mBean.getQueues()) { |
19 |
QueueViewMBean queueMBean = (QueueViewMBean)MBeanServerInvocationHandler.newProxyInstance(connection, queueName, QueueViewMBean. class , true ); |
20 |
System.out.println( "\n------------------------------\n" ); |
23 |
System.out.println( "States for queue --- " + queueMBean.getName()); |
26 |
System.out.println( "Size --- " + queueMBean.getQueueSize()); |
29 |
System.out.println( "Number of consumers --- " + queueMBean.getConsumerCount()); |
32 |
System.out.println( "Number of dequeue ---" + queueMBean.getDequeueCount() ); |
到此结束,希望可以为大家做个参考~~