首页 > 其他分享 >ActiveMQ的最简单应用-队列消息

ActiveMQ的最简单应用-队列消息

时间:2022-09-29 10:08:39浏览次数:84  
标签:activemq ActiveMQConnectionFactory 队列 JMS connection session 应用 ActiveMQ


有一段时间不使用JMS了。现在的项目又有可能需要应用JMS,来提高服务质量和提高系统资源的利用率。

提高服务质量,主要是保证不间断的服务。用JMS服务器接收任务,排成队列。应用服务可以暂停做维护,不影响接收的任务。应用服务运行后,再从队列中获取任务。

提高系统资源的利用率,主要是任务的派发不是24小时平均的,而是高峰时期任务量很多,比如1秒1000多个,有的时候很低,比如十几秒钟才来一个。应用服务通过JMS队列一个一个的取任务,做完一个再领一个,使系统资源的运用趋于平均。而JMS,比如JMS接收消息的效率是很高的,比如ActiveMQ,在赛扬(2.40GHz)机器上能够达到2000/s,消息大小为1-2k。好一些的服务器可以达到2万以上/秒。

 

ActiveMQ是开源免费的JMS实现,并且有很多扩展功能。地址:

​http://activemq.apache.org​

安装和运行很简单,下载后解压缩,执行:

activemq.bat

将启动默认配置的activemq。可以通过:

​http://localhost:8161/admin​

访问activemq的管理界面。查看队列(queue)和主题(topic)下的消息内容。

编写ActiveMQ程序前需要准备类库,如果使用maven就简单了:


<
dependency
>


<
groupId
>
org.apache.activemq
</
groupId
>


<
artifactId
>
activemq-core
</
artifactId
>


<
version
>
5.2.0
</
version
>


</
dependency
>


编写最简单的向JMS队列发送文本消息的程序:

 


ActiveMQConnectionFactory connectionFactory 
=

new
ActiveMQConnectionFactory(

"
tcp://localhost:61616
"
);
Connection connection
=
connectionFactory.createConnection();
connection.start();
System.out.println(
"
start...
"
);

Session session
=
connection.createSession(
true
,
Session.AUTO_ACKNOWLEDGE);
Queue destination
=
session.createQueue(
"
example.C
"
);

MessageProducer producer
=
session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);

TextMessage message
=
session.createTextMessage(
"
中文
"
);
producer.send(message);
session.commit();

connection.close();
System.out.println(
"
send text ok.
"
);


执行程序后可通过上面提到的web界面查看example.C队列中收到的消息。不过中文信息显示的是??。这没有关系,是admin web应用自身的问题(使用的是iso-8859-1编码)。队列里的数据是对的。

异步接收数据的代码如下:


ActiveMQConnectionFactory connectionFactory 
=

new
ActiveMQConnectionFactory(

"
tcp://localhost:61616
"
);
Connection connection
=
connectionFactory.createConnection();
connection.start();

final
Session session
=
connection.createSession(
true
,
Session.AUTO_ACKNOWLEDGE);
Queue destination
=
session.createQueue(
"
example.C
"
);

MessageConsumer consumer
=
session.createConsumer(destination);
consumer.setMessageListener(
new
MessageListener(){
@Override

public

void
onMessage(Message message) {
System.out.println(message);

try
{
session.commit();
}
catch
(JMSException e) {
e.printStackTrace();
}
}
});

标签:activemq,ActiveMQConnectionFactory,队列,JMS,connection,session,应用,ActiveMQ
From: https://blog.51cto.com/u_15810749/5721696

相关文章

  • 为假人扩展后端应用程序
    为假人扩展后端应用程序Photoby西格蒙德/不飞溅也许您和每个开发人员一样,都面临过应用程序开始变慢并显示性能不佳的情况。我知道,这很令人失望,但它只是发生了。......
  • 序列的应用
     实验目的在python中序列是最基本的数据结构,他是一块用于存放多个值的连续内存空间,并且按一定顺序排列,每一个值(称为元素)都分配一个数字,称为位置和索引。通过该索引可以取......
  • 快速提示:如何加速 Django 应用程序
    快速提示:如何加速Django应用程序提高Django应用程序性能的简短指南Photoby费萨尔on不飞溅避免使用Django模型序列化器Djangorest框架允许开发人员快速......
  • 由于系统缺少足够的缓冲区空间或队列已满,无法对套接字执行操作.An operation on a soc
    由于系统缺少足够的缓冲区空间或队列已满,无法对套接字执行操作。其实这个是由于操作系统的tcp连接被用完了,dkron不断打开关闭连接,有些操作完成后没有正常关闭,导致大量连接......
  • 剪贴板被占用导致应用使用剪贴板拷贝内容失败抛出 COMException 0x800401D0 错误
    本文记录某些软件,例如向日葵远程控制软件占用剪贴板,导致WPF应用使用剪贴板拷贝内容和设置剪贴板时,抛出System.Runtime.InteropServices.COMException(0x800401D0):O......
  • WPF 应用启动过程同时启动多个 UI 线程且访问 ContentPresenter 可能让多个 UI 线程互
    在应用启动过程里,除了主UI线程之外,如果还多启动了新的UI线程,且此新的UI线程碰到ContentPresenter类型,那么将可能存在让新的UI线程和主UI线程互等。这是多线程......
  • WPF 已知问题 某些设备上的应用在 WindowChromeWorker 抛出 System.OverflowException
    准确来说,这个不算是WPF的问题,而是系统等的问题。在某些设备上的使用了WindowChrome功能的WPF应用,将在运行过程,在WindowChromeWorker类里面抛出System.OverflowExc......
  • 序列的应用
    importdatetime#定义一个列表mot=["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别无选择。","今天星期二:\n含泪播种的人一定能笑着收获。",......
  • 序列的应用
    一、输出每日一帖    二、分两列显示2017~20118赛季NBA西部联盟前八名的球队   三、向NBA名人堂列表中追加2018年新进入的球星    四、使用二维......
  • 序列的应用
    实例1、输出每日一贴importdatetimemot=["今天星期一:\n坚持下去不是因为我很坚强,而是因为我别无选择。","今天星期二:\n含泪播种的人一定能笑着收获。","今天......