自已整理的一些零散的知识?br />
?/strong>
AMQPQ消息队列协议,Advanced Message Queuing ProtocolQ是一U消息协?Q等同于JMSQ但是JMS只是javaq_的方案,AMQP是一个跨语言的协议?/p>
AMQP 不分语言q_,最初来自JPMorgon,因ؓ业务需要而滋生,很快从金融界推广到整个计机界流行v来?/p>
AMQP 目前q是一个草案,最新版本是Q?.10
Publisher --->Exchange ---> MessageQueue --->Consumer
整个q程是异步的.Publisher,Consumer怺不知道对方的存在
Exchange负责交换/路由Q依靠Routing Key,每个消息者有一个Routing Key
每个Binding自已感兴趣的RoutingKey告诉Exchange,以便Exchange相关的
消息转发l相应的Queue
几个概念
Producer,Routing Key,Exchange,Binding,Queue,Consumer.
Producer: 消息的创,消息的发送?/p>
Routing KeyQ唯一用来映射消息该进入哪个队列的标识
ExchangeQ负责消息的路由Q交?/p>
Binding:定义Queue和Exchange的映关p?/p>
QueueQ消息队?/p>
ConsumerQ消息的使用?/p>
Exchangecd
Fan-Out:cM于广播方式,不管RoutingKey
Direct:ҎRoutingKey,q行兌投寄
Topic:cM于Direct,但是支持多个Key兌Q以l的方式投寄?/p>
key?来定义界限。类gusea.news,usea.weather.q两个消息是一l的?/p>
QPID
QPID是AMQP的一个实玎ͼ提供C++QJAVA版本的broker,支持多种语言客户端?/p>
基本功能外提供以下特性:
采用 Corosync(?)来保证集环境下的Fault-tolerant(?) Ҏ?/p>
支持XML的Exchange,消息为XMLӞ彩用Xqueryqo
支持plugin
提供安全认证Q可对producer/consumer提供w䆾认证
qpidd --port --no-data-dir --auth
port:端口
--no-data-dir:不指定数据目?/p>
--authQ不启用安全w䆾认证
启动后自动创Z些Exchange,amp.topic,amp.direct,amp.fanout
tools:
Qpid-config:l护Queue,Exchange,内部配置
Qpid-route:配置broker Federation(联盟Q集?)
Qpid-tool:监控
参考:
关于AMQP更多信息可参考: http://www.openamq.org/doc:amqp-background
关于QPID的更多和使用可参考:http://qpid.apache.org/
sessionsq个mapx为线E安全的map,则操作map中的MҎӞ都会加锁Qƈ且会锁住sessions对象?/span> q行代码Q则在外部线E访问removeҎ时会锁住SimpleStoreq个对象?br />
可以看到Q目前在同一个类或者方法中Q有两把锁,q且锁对象不是同一个,那下面我们看看线E是怎么被死锁住的:
1, 假设AU程先调用removeҎQ则q时会把simpleStorel锁住,然后执行sessions.put(sessionID, “”)的时候,会尝试锁住sessions
2, 同时BU程调用commitҎQ在 synchronized (sessions) Ӟ会先锁住sessions对象Qƈ且在调用接下来的remove()试,会尝试锁?nbsp; SimpleStore对象Q至此,U程A和线EBl于成功完成死锁?/span>
所以在使用多线E时一定要特别注意Q用锁一定要注意你的锁对象是否一致。要不然有可能死锁了~