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() );
到此结束,希望可以为大家做个参考~~