部门权限控制
- 认证 权限 由 shiro 控制, 部门范围由具体业务处理
很多现代语言都有 GC
,与 GC
紧密相关的是对象的引用。
Java有4种引用类型:
强引用 StrongReference: 平常使用的都是这种,其他引用统称 弱引用
。
强引用可以直接访问目标对象。
强引用所指向的对象在任何时候都不会被系统回收。
强引用可能导致内存泄漏。
1 | Bean bean = new Bean(); |
软引用 SoftReference: 最强的弱引用, 内存紧缺时可能会被GC回收。
软引用使用 get() 方法取得对象的强引用从而访问目标对象。
软引用所指向的对象按照 JVM 的使用情况(Heap 内存是否临近阈值)来决定是否回收。
软引用可以避免 Heap 内存不足所导致的异常。
1 | SoftReference<Bean> bean = new SoftReference<Bean>(new Bean()); |
弱引用 WeakReference :
弱引用使用 get() 方法取得对象的强引用从而访问目标对象。
一旦系统内存回收,无论内存是否紧张,弱引用指向的对象都会被回收。
弱引用也可以避免 Heap 内存不足所导致的异常。
1 | WeakReference<Bean> bean = new WeakReference<Bean>(new Bean()); |
1 | ReferenceQueue<Bean> refQueue = new ReferenceQueue<Bean>(); |
有篇可以参照 blog
Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存。
Swift有3种引用类型:
1 | class Person { |
1 | class Apartment { |
无主引用 unowned : 无主引用是永远有值的。总是被定义为非可选类型(non-optional type)。总是可以被直接访问。
1 | class Customer { |
无主引用以及隐式解析可选属性
1 | class Country { |
Person和Apartment的例子展示了两个属性的值都允许为nil,并会潜在的产生循环强引用。这种场景最适合用弱引用来解决。
Customer和CreditCard的例子展示了一个属性的值允许为nil,而另一个属性的值不允许为nil,这也可能会产生循环强引用。这种场景最适合通过无主引用来解决。
Country和City的例子中两个属性都必须有值,并且初始化完成后永远不会为nil。在这种场景中,需要一个类使用无主属性,而另外一个类使用隐式解析可选属性。
更详细的内容可以参考 中译 Swift
今天用到了 activiti 5.16;它依赖 org.restlet.jee:org.restlet:2.2.1
等 jar。奇怪的事情发现了, 一向运行良好的 nexus 出问题,org.restlet.jee:org.restletxxx:2.2.1
一系列的jars都无法下载。这里吐草下,org.restlet.jee:org.restletxxx
看着就别扭,so nexus 也找不到它,自然也无法下载。
解决方案如下:
增加restlet的Repository
管理员账户登录nexus 控制台, 增加restlet的Repository,类型为proxy
具体内容参照下图,重要 Remote Storage Location
设置为 http://maven.restlet.com/
restlet 加入 Public repositories group
清除本地 Repositories
别忘了删除 maven 的本地 repositories 里的 restlet 文件夹。
上篇介绍了 集成Spring-远程调用, 本次介绍集成 Spring, 常规JMS,消息驱动。主角是 activeMq, JmsTemplate, @JmsListener。
maven管理的方式
1 | <dependency> |
activemq 的 PooledConnectionFactory 会调用 commons-pool2。
配置PropertySourcesPlaceholderConfigurer
, 下面用得着,比较优雅。
1 | @Configuration |
消息生产者和消费者都需要。
1 | import org.apache.activemq.ActiveMQConnectionFactory; |
补充说明:
首先看代码
1 | @Service("GmGameAchvServiceImpl") |
jmsSendTest
, 利用 jmsTemplate 很方便JmsReceiveTest
, 使用了 @JmsListener
,这是最简单的方式,比 jmsTemplate 更简单。@JmsListener
需要制定 destination
, 这里 ${testQueue}
的值由 conf/jms.properties
里具体制定, 由上文提到的 PropertySourcesPlaceholderConfigurer
负责转化。 如此在一个配置文件里配置,多个地方使用,如需改动,仅需修改配置文件,不用修改源代码。Spring 会自动进行消息转换, 比如上面 jmsSendTest
发送的是 TextMessage
, JmsReceiveTest
用 String 类型参数接收就好。POJO 对象一样可以如此操作。
1 | @Override |
如此这般就好了,是不是 很简单方便。
1 | @JmsListener(destination = "myQueue") |
@SendTo
就可以返回值 到 queueOut
这个destination
~~~~~~~ 嗯嗯, 很不错的样子 :)
上篇介绍了 activemq 的安装和使用,这篇介绍下集成 spring 最简单的运用,远程调用。注意,这种方式是没有事务控制的。
maven 方式
1 | <dependency> |
接口(服务端和客户端都要有)
1 | public interface IGmGameAchvService |
实现(服务端)
1 | @Service("GmGameAchvServiceImpl") |
如下内容服务端和客户端都需要配置
1 jmsConnectionFactory
2 jmsQueue
服务端另需配置
3 MessageListenerContainer
4 ServiceExporter
客户端另需配置
5 ProxyFactoryBean
以下都是java based的配置,xml的配置可以参考 Spring doc
1 | @Configuration |
服务端
1 | @Configuration |
客户端
配置
1 | @Configuration |
调用
1 | IGmGameAchvService gmservice = (IGmGameAchvService) service; |
正常启动后, 在 activemq 的监控中可以看到相应内容。
如
Queues
connections
整理一些常用的服务器知识,配置和使用实例。这里仅作简单介绍。
陆续更新。。。
tomcat
使用最广泛的 Web 应用服务器和 servlet 容器,不多说了。
tomEE(发音同“tommy”)
完全兼容tomcat,从名字看就知道和tomcat关系密切。TomEE仅仅是Tomcat的一个扩展版本,任何能在Tomcat上使用的工具,如像Eclipse WTP一样的IDE工具,全部都能用在TomEE上。 TomEE=Tomcat+java EE,TomEE嵌入了EJB、CDI和其他JavaEE特征到Tomcat里,是一个完整符合Web Profile的服务器。
[nginx](/2016/01/22/web server/nginx/nginx/)
是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 服务器。基本用的是前面的功能 :)
wildfly(Jboss as)
JBoss Application Server(JBoss AS) 改名成 wildfly, 版本升级真快。提供完整的Java EE 栈。开源免费。
jetty
开源的servlet容器
以下全是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 公司内部晋升。
你需要了解他们的发展计划,建议可以问这样的问题,如“你们的资金消耗率(公司的负现金流)是多少?”
聊到目前的团队成员,试着和公司的内部人士聊天(面试官以外),以便于知道公司内部管理人员大致的情形, “他们好合作吗,他们做事征求意见吗,他们提供反馈吗,他或她投资团队成员并帮助他们成长吗?”