最近公司事情稍微少了点,研究下怎么优化几个系统的交互,因为我们目前使用的是长链接的同步接口,就考虑用下MQ来处理下。
由于公司对安全有要求且和CA业务有关,则使用了SSL协议。此文使用的是Activemq的SSL协议+MYSQL作为持久化数据库,后续可能使用NIO+SSL协议。
其他实现了JMS的MQ应该也大同小异。
此文大多是参考官网文档
持久化:http://activemq.apache.org/persistence.html

相关协议:http://activemq.apache.org/configuring-transports.html

先说说我对activemq的理解,由于是用java语言开发的,给我的感觉是依赖spring并且跑在jetty上的一个java程序。有了个大概的概念里面配置的东西就更好理解。
配置mysql持久化,默认持久化是使用的kahadb写入文件里,这里修改成jdbc方式连接mysql,既然是jdbc就需要一个数据库驱动的jar包,
所以我们需要在lib文件夹下放入mysql-connector-java-5.1.34-bin.jar(其他版本一样),因为使用的是官网推荐的dbcp数据源,相关其他的依赖包在lib下面已经有了。
想要使用其他的数据源则需要引入相关依赖的jar包即可。
以下是activemq.xml的mysql持久化配置。

<persistenceAdapter>
<!--<kahaDB directory="${activemq.data}/kahadb"/>-->
<jdbcPersistenceAdapter dataSource="#mysql-ds" createTablesOnStartup="false"/>
</persistenceAdapter>
<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="poolPreparedStatements" value="true"/>
</bean>

这个不就是用spring配置一个数据源的代码吗?把标签里面对应的值修改成自己的就行。
注意,bean是和broker同级的。createTablesOnStartup第一次为true,后续修改为false,这个是自动创建表使用的,默认的是true。
一切配置成功则在启动mq的时候数据库会生成
activemq_acks
activemq_lock
activemq_msgs
三个表

在我测试的时候出现了一个错误:
java.sql.SQLException: Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging when transaction isolation level is READ COMMITTED or READ UNCOMMITTED.

就是数据库的写入日志格式,这个有点熟悉,在做mysql主从的时候也出现过。
具体的我也解释不清楚,官网有给出解释https://dev.mysql.com/doc/refman/5.7/en/binary-log-setting.html
在my.ini(在windows上的)记录日志格式BINLOG_FORMAT 设置为row或者mixed。
至此,activemq持久化到mysql已完成配置。

下面在说说使用SSL协议的配置。
单向SSL:
首先需要申请一个mq服务器的证书或者自签一个证书,私钥需要保存好。
这个是官网的原文http://activemq.apache.org/how-do-i-use-ssl,因为我有点CA背景,说白了就是在上面添加一个标签,上面指定你的服务器证书以及密钥对密码,还有信任的证书库以及密码。
看官网介绍好像还可以使用ocsp在线认证客户端证书。以下是我在activemq.xml配置的

<sslContext>
<sslContext keyStore="/activeMQ/keys/activemq.gdca.com.cn.jks"
keyStorePassword="123456789"
trustStore="/activeMQ/keys/trustca.jks"
trustStorePassword="123456"/>
</sslContext> <transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ssl" uri="ssl://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

keyStore:是你的服务器证书和密钥对合成的。
keyStorePassword:是jks的密码,最好把密钥对和jks密码设置一致。
trustStore:信任源(实际上是你的证书的中级或者顶级根证书)
trustStorePassword:信任源的jks密码

在我猜测应该还有个keyStoreType属性?
配置无误之后启动mq是没有其他错误信息的。

下面就是编码验证阶段了。

这边使用springboot模拟一个生产者,一个消费者
新建一个项目加入activemq依赖,生产者项目结构如图:

先看看application.yml

server:
port: 8888 #定义队列名称
myqueue-name: queue-springboot my-topic: topic-springboot #mq的协议相关证书文件
trustKey: D:\Work\Project\Learning\activemq_springboot\src\main\resources\trustca.jks
trustPwd: 123456
#双向认证需要用到的客户端证书
clientKey: D:\Work\Project\Learning\activemq_springboot\src\main\resources\zengcx@gdca.com.cn.key
clientKeyPwd: 12345678
#这个好像不起作用了?需要在jmsTamplate上设置?
spring:
jms:
pub-sub-domain: true

看看config类:

package com.demo.activemq.config;

import org.apache.activemq.ActiveMQSslConnectionFactory;
import org.apache.activemq.command.ActiveMQQueue;
import org.apache.activemq.command.ActiveMQTopic;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.stereotype.Component; import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Topic; @Component
@EnableJms
public class ConfigBean { @Value("${myqueue-name}")
private String queueName; @Value("${my-topic}")
private String topicName; //信任源的文件
@Value("${trustKey}")
private String trustKey;
//信任源的文件密码
@Value("${trustPwd}")
private String trustPwd; //客户端密钥文件
@Value("${clientKey}")
private String clientKey;
//客户端密钥文件密码
@Value("${clientKeyPwd}")
private String clientKeyPwd; @Bean
public Queue queue() {
return new ActiveMQQueue(queueName);
} @Bean
public Topic topic() {
return new ActiveMQTopic(topicName);
} @Bean("clientSSLConnFactory")
public ConnectionFactory clientSSLConnFactory() throws Exception {
ActiveMQSslConnectionFactory sslConnectionFactory = new ActiveMQSslConnectionFactory();
//双向认证需要的key文件和密码
// sslConnectionFactory.setKeyStore(clientKey);
// sslConnectionFactory.setKeyStoreKeyPassword(clientKeyPwd);
//单向需要在本地设置一个信任源,检测服务端的证书
sslConnectionFactory.setTrustStore(trustKey);
sslConnectionFactory.setTrustStorePassword(trustPwd);
sslConnectionFactory.setBrokerURL("ssl://activemq.gdca.com.cn:61617");
sslConnectionFactory.setUserName("admin");
sslConnectionFactory.setPassword("admin");
sslConnectionFactory.setTrustStoreType("JKS"); return sslConnectionFactory;
}
}

因为重新创建了connectionFactory,在yaml上面的配置已经不起作用。对springboot不熟悉,这个是经过测试修改成这个样子的。有知道其他方法的麻烦告诉下。

下面是生产消息:

package com.demo.activemq.producer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component; import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import java.util.UUID; @Component
public class Producer { @Autowired
JmsMessagingTemplate jmsMessagingTemplate; @Autowired
ConnectionFactory clientSSLConnFactory; @Autowired
private Queue queue; public void productMsg() {
jmsMessagingTemplate.setConnectionFactory(clientSSLConnFactory);
jmsMessagingTemplate.convertAndSend(queue, UUID.randomUUID().toString().substring(0, 5));
System.out.println("send off");
} }

到这里生产者结束,使用单元测试跑下。

MYSQL持久化 :

再来看看消费者

工程目录:

yaml:

server:
port: 8887 #定义属性直接在代码使用Value注解获取
myqueue-name: queue-springboot
my-topic: topic-springboot
trustStore: D:\Work\Project\Learning\activemq-queue-consumer\src\main\resources\trustca.jks
trustPwd: 123456

config类:

package com.demo.activemq.config;

import org.apache.activemq.ActiveMQXASslConnectionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component; import javax.jms.ConnectionFactory; @Component
public class MainConfig { @Value("${trustStore}")
private String trustStore; @Value("${trustPwd}")
private String trustPwd; @Bean
public ConnectionFactory clientSSLConnFactory() throws Exception {
//创建ssl链接工厂,应该springboot在使用jms监听的时候会自动创建链接
ActiveMQXASslConnectionFactory factory = new ActiveMQXASslConnectionFactory();
factory.setBrokerURL("ssl://activemq.gdca.com.cn:61617");
factory.setUserName("admin");
factory.setPassword("admin");
factory.setTrustStore(trustStore);
factory.setTrustStorePassword(trustPwd);
factory.setTrustStoreType("JKS");
return factory;
}
}

消费消息监听类:

package com.demo.activemq.consumer;

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component; import javax.jms.JMSConnectionFactory;
import javax.jms.JMSException;
import javax.jms.TextMessage; @Component
public class Consumer { @JMSConnectionFactory(value = "clientSSLConnFactory")
@JmsListener(destination = "${myqueue-name}")
public void receiveMsg(TextMessage textMessage) throws JMSException {
System.out.println("get msg:" + textMessage.getText());
} }

消息已出队:

以上则是Activemq配置mysql持久化并使用ssl协议生产和消费消息所有步骤,由于对springboot不是特别熟悉,可能存在代码不够好的情况。

如有较好的解决方式,麻烦大家告诉一下。

ActiveMQ持久化到MySQL以及使用SSL协议通讯的更多相关文章

  1. ActiveMQ持久化方式(转)

    消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息 中心重新启动后仍然可以将消息发送出去,如果把这种持久化 ...

  2. ActiveMQ持久化方式

    ActiveMQ持久化方式 发表于8个月前(2014-09-04 15:55)   阅读(686) | 评论(0) 17人收藏此文章, 我要收藏 赞1 慕课网,程序员升职加薪神器,点击免费学习 摘要  ...

  3. ActiveMQ持久化及测试(转)

    转:http://blog.csdn.net/xyw_blog/article/details/9128219 ActiveMQ持久化 消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持 ...

  4. ActiveMQ入门之四--ActiveMQ持久化方式

    消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和 ...

  5. 你的MySQL服务器开启SSL了吗?

    最近,准备升级一组MySQL到5.7版本,在安装完MySQL5.7后,在其data目录下发现多了很多.pem类型的文件,然后通过查阅相关资料,才知这些文件是MySQL5.7使用SSL加密连接的.本篇主 ...

  6. 你的MySQL服务器开启SSL了吗?SSL在https和MySQL中的原理思考

    最近,准备升级一组MySQL到5.7版本,在安装完MySQL5.7后,在其data目录下发现多了很多.pem类型的文件,然后通过查阅相关资料,才知这些文件是MySQL5.7使用SSL加密连接的.本篇主 ...

  7. 你的MySQL服务器开启SSL了吗?(转载)

    最近,准备升级一组MySQL到5.7版本,在安装完MySQL5.7后,在其data目录下发现多了很多.pem类型的文件,然后通过查阅相关资料,才知这些文件是MySQL5.7使用SSL加密连接的.本篇主 ...

  8. 【转】SSL协议、SET协议、HTTPS简介

    一.SSL协议简介 SSL是Secure Socket Layer的缩写,中文名为安全套接层协议层.使用该协议后,您提交的所有数据会首先加密后,再提交到网易邮箱,从而可以有效防止黑客盗取您的用户名.密 ...

  9. 基于SSL协议的双向认证 - SSL协议 [1]

    1  概要说明 在互联网通信方式中,目前用的最广泛的是HTTPS配合SSL和数字证书来保证传输和认证安全了. 2  详细介绍 2.1    HTTPS HTTPS全称:Hypertext Transf ...

随机推荐

  1. 百度大脑UNIT3.0智能对话技术全面解析

    智能客服.智能家居.智能助手.智能车机.智能政务……赋予产品智能对话能力是提升产品智能化体验.高效服务的重要手段,已经开始被越来越多的企业关注并布局.然而,智能对话系统搭建涉及NLP.知识图谱.语音等 ...

  2. css3 @page

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Python爬虫基础面试题,为2020年初就业做准备

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:qiaoziheng 一.题目部分1.python中常用的数据结构有哪些 ...

  4. IT兄弟连 HTML5教程 CSS3属性特效 3D变换1

    3D变换较2D变换多了一下的转换属性,3D转换属性及描述如表1: 表1  3D转换属性 3D的转换方法如表2: 表2  3D转换方法     1  transform-style transform- ...

  5. xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写xml

    xml xml 是 java 实现的 xml 框架. 希望以最优雅的方式进行 xml 和 java 之间的转换处理,一行代码搞定一切. 特点 对象的和 xml 的互相映射 支持注解 @Alias 指定 ...

  6. ASP.NET MVC5基础 - Global.asax详解

    简介 作用 Global.asax的处理事件 实例说明 总结 简介 Global.asax是一个文本文件,它提供全局可用代码.这些代码包括应用程序的事件处理程序以及会话事件.方法和静态变量.有时该文件 ...

  7. SpringMVC框架之第三篇

    2.高级参数绑定(重点) 2.1.数组类型 数组类型的参数可以传递一批相同的数据到Controller的方法中. 2.1.1.需求 批量删除:在商品列表页面选中多个商品,然后删除. 2.1.2.需求分 ...

  8. Vue+ElementUI的后台管理框架

    新开发的一个后台管理系统.在框架上,领导要用AdminLTE这套模板.这个其实很简单,把该引入的样式和js文件引入就可以了.这里就不多赘述了.有兴趣的可以参考:https://www.jianshu. ...

  9. Spring 框架下的 JDBC

    Spring JDBC Spring 对JDBC技术规范做了进一步封装,它又叫Spring JDBCTemplate(jdbc模板技术) 纯JDBC:代码清晰的.效率最高.代码是最烦的.    Spr ...

  10. js-03-if条件判断

    一.swich case判断语句eg <script> swich( exp){ case 值1: 执行的代码段: break; case 值2: 执行的代码段: break; ..... ...