對jms不是很熟悉,弄了幾天終於有了點思路。這裡有兩個程序、增加了個queue-example-service.XML配置文件很簡單,復雜點的在以後在說。
package org.jboss.tutorial.mdb.bean;
import Javax.ejb.MessageDriven;
import Javax.ejb.ActivationConfigProperty;
import Javax.jms.Message;
import Javax.jms.MessageListener;
@MessageDriven(activateConfig =
{
@ActivationConfigProperty(propertyName="destinationType", propertyValue="Javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination", propertyValue="queue/tutorial/example")
})
//A destination is the object on the JBossMQ server that clIEnts
//use to send and receive messages. There are two types of
//destination objects, Queues and Topics.
public class ExampleMDB implements MessageListener
{
public void onMessage(Message recvMsg)
{
System.out.println("----------------");
System.out.println("Received message");
System.out.println("----------------");
}
}
英文注釋是我在The JBoss 4 Application Server Guide找的,可以知道destination是在jboss 服務器裡負責收發消息 ( message ) 的地方。Destination根據消息發布方式的不同分兩種:Queues 和 Topics .
topic發布允許一對多,或多對多通訊通道,消息的產生者被叫做publisher, 消息接受者叫做subscriber,故稱為 發布/訂閱(publish/Subscribe)。
queue 是另外一種方式,僅僅允許一個消息傳送給一個客戶。一個發送者將消息放在消息隊列中,接受者從隊列中抽取並得到消息,消息就會在隊列中消失。第一個接受者抽取並得到消息後,其他人就不能在得到它。又稱為 點對點(point to point) .
關於activateConfig跟queue-example-service.XML有關,這裡只要知道destination就行了。從程序可以看到其接口為MessageListener可猜出這個程序負責監聽消息,收到消息後打印。就是這樣 :)
ClIEnt.Java
package org.jboss.tutorial.mdb.clIEnt;
import Javax.jms.Queue;
import Javax.jms.QueueConnection;
import Javax.jms.QueueConnectionFactory;
import Javax.jms.QueueSender;
import Javax.jms.QueueSession;
import Javax.jms.TextMessage;
import Javax.naming.InitialContext;
public class ClIEnt
{
public static void main(String[] args) throws Exception
{
QueueConnection cnn = null;
QueueSender sender = null;
QueueSession session = null;
InitialContext ctx = new InitialContext();
Queue queue = (Queue) ctx.lookup("queue/tutorial/example");
//這裡lookup的內容在queue-example-service.XML有定義jndi
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
cnn = factory.createQueueConnection();
session = cnn.createQueueSession(false,//不需要事務
QueueSession.AUTO_ACKNOWLEDGE);//自動接收消息
TextMessage msg = session.createTextMessage("Hello World");
sender = session.createSender(queue);
sender.send(msg);
System.out.println("Message sent successfully to remote queue.");
}
}
ClIEnt在這裡的執行順序是 QueueConnectionFactoryà QueueConnection à QueueSession àQueueSender
如果這樣說還是不清楚的話就要先補習下jms咯。呵呵,我也是這樣的。
ClIEnt的任務呢就是發送個消息,然後由服務器接收。
queue-example-service.XML
name="jboss.mq.destination:service=Queue,name=tutorial">
queue/tutorial/example
首先給我的感覺就是這個XML跟jmx有關,mbean代表manage bean ,這個問題不大。
這個XML的作用就是instance個queue,名字為tutorial ( 可以自己改過 ) ,然後由jmx-console這個控制台統一管理,運行完這個程序可以在http://localhost:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.mq.destination%3Aservice%3DQueue%2Cname%3Dtutorial (希望你還沒來的及更改上面的配置,我找不到能讓你更快找到這個queue的地址了,太多了。) 看到這個配置文件上的queue ,jboss裡已經有了幾個queue了。
然後就是定義個jndi,ClIEnt.Java就可以lookup了。
這裡附上log4j.properties 在jboss-EJB-3.0_PrevIEw_5.zip 裡面沒有這個老是顯示缺少appender。有了這個將在該目錄下生成個record.log日志文件。
log4j.propertIEs
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=record.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %d{hh:mm:ss} %t %c{1} -%m%n
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.MaxFileSize=100KB
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) -%m%n
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.rootLogger=stdout,R
運行:參考installing.Html
Windows下
打開命令提示符cmd,到 jboss_home/bin
Run.bat –c all
用ant
先build後run 就行了。
看看jboss窗口可以看到
01:01:20,828 INFO [STDOUT] ----------------
01:01:20,828 INFO [STDOUT] Received message
01:01:20,828 INFO [STDOUT] ----------------
討論:
雖然就兩個程序,但是由於我以前沒怎麼了解jms 就花了些時間。查找相關的資料對於理解以上問題是很重要。
http://www.cn-Java.com/target/news.PHP?news_id=2730
http://blog.blogchina.com/category.225381.Html
The JBoss 4 Application Server Guide