1,220
社区成员
发帖
与我相关
我的任务
分享
public class Sender implements Runnable {
int threadId;
public Sender(int threadId) {
this.threadId = threadId;
}
@Override
public void run() {
try {
String user = "admin";
String password = "activemq";
String url = "tcp://192.168.18.151:61616";
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory( user, password, url);
//配置AlwaysSyncSend,非持久化在资源耗尽的时候将得到通知,虽然速度会变慢.
connectionFactory.setProducerWindowSize(1024);
connectionFactory.setSendAcksAsync(true);//这个方法有什么用?
// connectionFactory.setAlwaysSyncSend(true);//同步
// connectionFactory.setProducerWindowSize(1024*1024);
connectionFactory.setUseAsyncSend(true);//异步
Connection connection = connectionFactory.createConnection();
connection.start();
Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("test."+this.threadId);
MessageProducer producer = session.createProducer(destination);
Date date = new Date();
long t1 = date.getTime();
System.out.println("connThread"+threadId+" 开始时间:"+new Date());
int p = 0;
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (int i = 0; i < 100000; i++) {
TextMessage message = session.createTextMessage();
message.setText(Integer.toString(i));
//Thread.sleep(1);
try {
producer.send(message);
p++;
if(p%1000 == 0){
// session.commit();
System.out.println("connThread"+threadId+" 已发送:"+p+"条,用时:"+(new Date().getTime() - t1));
}
// System.out.println("connThread"+threadId+" 已发送:"+p+"条,用时:"+(new Date().getTime() - t1));
} catch (Exception e) {
e.printStackTrace();
}
// session.commit();
//System.out.println("--发送消息:" + date);
}
System.out.println("connThread"+threadId+" 共发送"+p+"条,结束时间:"+new Date());
// System.out.println("connThread"+threadId+" 共用时:"+(new Date().getTime() - t1));
//session.commit();
session.close();
connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
消费者代码:public class ConnConsumer {
public static int threadId = 0;
public static void main(String[] args) throws JMSException, InterruptedException{
for(int i=0; i<15; i++){
ConnConsumer.receive(threadId++);
}
Thread.sleep(3*24*60*60*1000);
}
public static void receive(int threadId) throws InterruptedException{
try {
String user = "admin";
String password = "activemq";
String url = "tcp://192.168.18.151:61616"; //
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory( user, password, url);
//异步分发,当使用listener时是异步,receive是同步
// connectionFactory.setDispatchAsync(true);
Connection connection = connectionFactory.createConnection();
connection.start();
final Session session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("TEST."+threadId);
MessageConsumer message = session.createConsumer(destination);
message.setMessageListener(new MsgListener(threadId));
//Thread.sleep(3*24*60*60*1000);
//session.close();
//connection.close();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
public class MsgListener implements MessageListener {
int threadId;
int count = 0;
Date date = new Date();
long t1 = date.getTime();
int sum = 0;
public MsgListener(int threadId) {
System.out.println("threadId:"+threadId+"启动监听");
this.threadId = threadId;
}
@Override
public void onMessage(Message msg) {
TextMessage message = (TextMessage) msg;
// try {
// sum += Integer.parseInt(message.getText());
// } catch (NumberFormatException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (JMSException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//System.out.println("--收到消息:" + new Date(message.getLong("count")));
count ++;
if(count%1000 == 0){
System.out.println("connThread"+threadId+" 接收:"+count+"条,用时:"+(new Date().getTime() - t1));
}else if(count == 1){
System.out.println("connThread"+threadId+" 开始时间:"+new Date());
}
// System.out.println("sum is " + sum);
//session.commit();
}
}
配置文件:….
<policyEntry queue=">" producerFlowControl="true" memoryLimit="50mb">
<!-- 使用VM游标,非持久化消息放在内存中,达到指定内存后停掉生产者-->
<pendingQueuePolicy>
<vmQueueCursor/>
<pendingQueuePolicy>
</policyEntry>
….
<systemUsage>
<!-- 当资源耗尽时,生产者阻塞5秒后,API报错-->
<systemUsage sendFailIfNoSpaceAfterTimeOut="5000">
<memoryUsage>
<memoryUsage percentOfJvmHeap="70" />
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="50 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
…