陆续更新。。。
1. 集成测试,是否测试上2个版本?
不仅测试本次发布版本功能,还需测试上2个版本在最新服务端接口上是否功能正常(git flow master库)
2. 上线测试,是否进行了小范围正式环境和数据测试。
Android可用友盟或自定义自动升级,iOS可用邀请测试,指定人员测试
3. 权限测试,是否进行权限极限测试
关闭APP需要的所以权限,测试每项功能。
以下全是linux系统上的操作,在opensuse 13.2 上实际操作。
1 下载 activemq gzip 文件
1 | $ wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/activemq/5.12.0/apache-activemq-5.12.0-bin.tar.gz |
2 解压缩
1 | $ tar zxvf activemq-x.x.x.tar.gz |
3 确认权限
确认activemq 是否有执行权限
1 | $ cd [activemq_install_dir]/bin |
进入安装目录的bin路径,启动activemq
1 | $ cd [activemq_install_dir]/bin |
正常输出
1 | INFO: Loading '[activemq_install_dir]/bin/env' |
网页监控 http://localhost:8161/admin
默认用户密码 admin/admin
可以在 conf/jetty-real.properties 中修改
网页监控
端口: 8161
配置: [activemq_install_dir]/conf/jetty.xml
activeMq 服务
openwire: 61616
amqp : 5672
stomp : 61613
mqtt : 1883
ws : 61614
配置: [activemq_install_dir]/conf/activemq.xml
1 | $ cd [activemq_install_dir]/bin |
[activemq_install_dir]/conf/activemq.xml
官网说 启动 activemq 后, http://localhost:8161/demo直接能访问, 其实5.12.0版本是不行的,不行的,不行的。
需要在 conf/jetty 中增加配置
1 | <bean class="org.eclipse.jetty.webapp.WebAppContext"> |
重启activemq, http://localhost:8161/demo可以访问了, enjoy it !
几个消息总线(龟速更新。。。)
是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的JMS Provider实现。
由LinkedIn开发的一个分布式的消息系统,开源贡献给了Apache
ActiveMQ的升级版,重新改写了内核,速度飞快,功能目前还不完全。
RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件。Erlang语言编写的。
RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。
Redis是一个基于Key-Value对的NoSQL数据库,开发维护很活跃。虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。
ZeroMQ号称最快的消息队列系统,尤其针对大吞吐量的需求场景。ZeroMQ能够实现RabbitMQ不擅长的高级/复杂的队列,但是开发人员需要自己组合多种技术框架,技术上的复杂度是对这MQ能够应用成功的挑战。ZeroMQ具有一个独特的非中间件的模式,你不需要安装和运行一个消息服务器或中间件,因为你的应用程序将扮演这个服务器角色。你只需要简单的引用ZeroMQ程序库,可以使用NuGet安装,然后你就可以愉快的在应用程序之间发送消息了。但是ZeroMQ仅提供非持久性的队列,也就是说如果宕机,数据将会丢失。其中,Twitter的Storm 0.9.0以前的版本中默认使用ZeroMQ作为数据流的传输(Storm从0.9版本开始同时支持ZeroMQ和Netty作为传输模块)。
ActiveMQ是Apache下的一个子项目。 类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。
Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制统一了在线和离线的消息处理。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统
薪水之外,工程师最应该关系的问题
可以问问企业从开发到测试都喜欢什么工具,询问开发流程,询问工程和其他团队之间的关系。建议问“在应对项目时,你们公司会给开发人员什么级别的自主性?”
你的雇主如何定义你的“成功”?不同公司的评判标准不同,要满足你觉得不舒服的目标会让你的生活苦不堪言。
询问是否有一个针对软件工程师的成长计划,询问一下,多少外部聘请 vs 公司内部晋升。
你需要了解他们的发展计划,建议可以问这样的问题,如“你们的资金消耗率(公司的负现金流)是多少?”
聊到目前的团队成员,试着和公司的内部人士聊天(面试官以外),以便于知道公司内部管理人员大致的情形, “他们好合作吗,他们做事征求意见吗,他们提供反馈吗,他或她投资团队成员并帮助他们成长吗?”
1 | import javax.jms.ConnectionFactory; |
Message Converters 提供Java 对象 message‘s 数据间的转换。Spring的默认实现 SimpleMessageConverter 可以支持String 和 TextMessage, byte[] 和 BytesMesssage, java.util.Map 和 MapMessage 之间的转换。
下面是个Map的发送:
1 | public void sendWithConversion() { |
SessionCallback 回调和 ProducerCallback 回调
同步接收 JMS 消息会堵塞, 可设置 receiveTimeout
。
类似于 EJB 里的 Message-Driven Bean (MDB) ,Spring 定义了 Message-Driven POJO (MDP) 来作为 JMS 的接收者。
一个 Message-Driven POJO (MDP) 必须实现 javax.jms.MessageListener
(或者 MessageListenerAdapter, SessionAwareMessageListener),而且必须是线程安全,它会被多线程调用。
MDP的一个例子:
1 | import javax.jms.JMSException; |
对应的配置
1 | <!-- this is the Message Driven POJO (MDP) --> |
本地事务只需要简单配置 sessionTransacted
就可以激活。发送响应是该本地事务的一部分,但其他所有资源(如数据库操作)的操作都是独立的。
1 | <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> |
分布式事务
1 | <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/> |
@JmsListener
在@Configuration
类中加入@EnableJms
来使@JmsListener
生效。
1 | @Configuration |
1 | @Configuration |
1 | @Component |
@SendTo
1 | @JmsListener(destination = "myDestination") |
运行时响应destination
1 | @JmsListener(destination = "myDestination") |
JMS(Java Messaging Service)是Java平台上有关面向消息中间件(MOM)的技术规范.
JMS客户
生产或消费基于消息的Java的应用程序或对象。
JMS生产者(Message Producer)
创建并发送消息的JMS客户。
JMS消费者(Message Consumer)
接收消息的JMS客户。
JMS消息
包括可以在JMS客户之间传递的数据的对象
JMS队列
一个容纳那些被发送的等待阅读的消息的区域。与队列名字所暗示的意思不同,消息的接受顺序并不一定要与消息的发送顺序相同。一旦一个消息被阅读,该消息将被从队列中移走。
JMS主题
一种支持发送消息给多个订阅者的机制。
JMS连接。JMS连接(Connection)表示JMS客户端和服务器端之间的一个活动的连接,是由客户端通过调用连接工厂的方法建立的。
JMS会话。JMS会话(Session)表示JMS客户与JMS服务器之间的会话状态。JMS会话建立在JMS连接上,表示客户与服务器之间的一个会话线程。
JMS目的。JMS目的( Destination ),又称为消息队列,是实际的消息源。可以是 queue 或 topic 。
JMS生产者和消费者。生产者(Message Producer)和消费者(Message Consumer)对象由Session对象创建,用于发送和接收消息。
Spring 提供类似JDBC的 JMS集成框架来简单得使用 JMS API。
JmsTemplate
是 JMS 核心包的中心类。它简化了JMS的使用,因为它处理了发送或同步接收消息时资源的创建和释放。
JmsTemplate的需要一个ConnectionFactory的引用。ConnectionFactory是JMS规范的一部分,并作为JMS切入点。
SingleConnectionFactory
SingleConnectionFactory会在所有 createConnection() 调用时返回相同的 Connection 。
CachingConnectionFactory
CachingConnectionFactory继承SingleConnectionFactory,并增加了会话,MessageProducer,和MessageConsumers的缓存
用来从JMS消息队列接收消息并驱动已经注入的 MessageListener
,负责所有线程消息的接收和分发到监听器的进程,是MDP和消息提供者之间的中介,并注册接收的消息,参与事务,资源获取和释放,异常转换等等。使程序开发人员可以编写和接收消息相关的(可能比较复杂)业务逻辑。
有以下两种监听器
SimpleMessageListenerContainer
简单,但不兼容JavaEE的JMS规范
DefaultMessageListenerContainer
最常用的。XA transaction(JtaTransactionManager), 可以自定义缓存,可以回复(默认是每5秒,可以自己实现BackOff
来制定更细的粒度,参考ExponentialBackOff
)
Spring提供了JmsTransactionManager来为单独的ConnectionFactory管理事务。
JmsTransactionManager 来管理本地事务和资源。
JtaTransactionManager 来处理分布式事务。
spring提供完整的对标准 Java web services 的支持。有2种方式 SpringBeanAutowiringSupport 和 SimpleJaxWsServiceExporter 。
SpringBeanAutowiringSupport没实验成功 :( , 下面只说 SimpleJaxWsServiceExporter 的方式。我是直接混合springMVC使用的。
EndPoint
1 | @Component("UserService") // auto scan |
xml config
1 | <bean class="org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter"> |
java config
1 | @Configuration |
wsdl
启动容器,在浏览器中访问 http://localhost:8081/UserService?wsdl , 就能看到wsdl的内容了
跨域资源共享(CORS): 访问不同域站点上的资源;比如a.com上的某页面可以访问b.com上的资源,c.com上的某页面可以访问a.com上资源。
不转载了,链接: CORS(跨域资源共享)简介
Spring通过@CrossOrigin
注解来实现对CORS的功能支持。
方法级
1 | @RestController |
类级
1 | @CrossOrigin(origins = "http://domain2.com", maxAge = 3600) |
混合
Spring结合类和方法的注解内容生成。
1 | @CrossOrigin(maxAge = 3600) |
默认是GET,HEAD和POST有效
/**
路径, 全部默认属性
1 | @Configuration |
自定义路径和属性
1 | @Configuration |
/**
路径, 全部默认属性
1 | <mvc:cors> |
自定义属性
1 | <mvc:cors> |