在weblogic的控制台上
1、先设置jms的connection factory,
2、然后设置stores,存储成directory还是jdbc你自己选
3、设置jms的server,在desitantions中设置Topic和Queuequeue就是你说的点对点
1、先设置jms的connection factory,
2、然后设置stores,存储成directory还是jdbc你自己选
3、设置jms的server,在desitantions中设置Topic和Queuequeue就是你说的点对点
解决方案 »
- jTable动态显示求救
- Hibernate映射视图的问题(复合主键)
- struts标签的问题
- ssh
- 解析PDF问题
- 一个ServerSocket只能响应50个Socket连接,那如果服务器端有成千上万个客户端连接怎么办?
- 为什么我的jbuilder7在redhat8下面不能安装?????
- JAVASCRIPT如何处理XML数据?哪位有资料共享,多谢。
- weblogic5.1的javamail发邮件为什么发不出去?j2ee就可以了。
- Caused by: java.lang.ClassNotFoundException: com.bdyj.po.Bdrolemodule这是怎么回事,求帮助
- 请教关于Crystal Report的问题
- 整合Tomcat服务器和Apache服务器有什么用处
private static Context context = null;
private boolean transacted = true;
private int acknowledgementMode = Session.AUTO_ACKNOWLEDGE;
private Hashtable environment = null;
private QueueConnectionFactory queueConnectionFactory = null;
private QueueConnection queueConnection = null;
private QueueSession queueSession = null;
private QueueSender queueSender = null;
private QueueReceiver queueReceiver = null;
private Queue queue = null;
private String queueConnectionFactoryName = "nameofjndi"; //这个值是在console设置过的
private String queueName = "MyJMSQueue_jndi";//这个值是在console设置过的
。
。
。
public void sendText(String message) throws Exception {
System.out.println("method sendtext");
TextMessage textMessage = getQueueSession().createTextMessage();
textMessage.clearBody();
textMessage.setText(message);
getQueueSender().send(textMessage);
if (isTransacted()) {
getQueueSession().commit();
}
System.out.println("method sendtext end");
}
public void onMessage(Message message) {
if (message instanceof BytesMessage) {
BytesMessage bytesMessage = (BytesMessage) message;
//Process bytesMessage here
}
else {
if (message instanceof MapMessage) {
MapMessage mapMessage = (MapMessage) message;
//Process mapMessage here
}
else {
if (message instanceof ObjectMessage) {
ObjectMessage objectMessage = (ObjectMessage) message;
//Process objectMessage here
}
else {
if (message instanceof StreamMessage) {
StreamMessage streamMessage = (StreamMessage) message;
//Process streamMessage here
}
else {
if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
//Process textMessage here
}
}
}
}
}
try {
if (isTransacted()) {
getQueueSession().commit();
}
}
catch(Exception ex) {
ex.printStackTrace();
}
}有一个问题是为什么上面这个文件中会出现onmessage,这个方法应该出现在mdb中才对呀?
我想直接用上面这个文件可以了吧,我调用了sendtext,发送了一个字符串,运行时不出错,并且“method sendtext”和“method sendtext end”都能打印出来,好象已经发送成功,但我有一个mdb,xml文件中已经定义jndi名:<message-driven-descriptor>
<destination-jndi-name>MyJMSQueue_jndi</destination-jndi-name>
<connection-factory-jndi-name>nameofjndi</connection-factory-jndi-name>
</message-driven-descriptor>它的onmessage中的语句没反应,也就是说,没有收到信息,怎么回事?
另外发送完信息后怎么样知道信息已经被mdb接收了呢?
http://www-900.ibm.com/developerWorks/cn/java/j-jms11/index.shtml
http://www-900.ibm.com/developerWorks/cn/education/java/j-jms/tutorial/
“呵呵,很弱的错误,没有启动j2ee的jms服务器,所以看不到消息收到。”是什么意思?要先启动JMS吗?怎么启动?
System.out.println("received");
TextMessage textMsg = (TextMessage) msg;
try {
String text = textMsg.getText();
System.out.println("Received new message: " + text);
} catch (JMSException e) {
e.printStackTrace();
}
}
执行没有任何反应啊?不打印任何文本是不是mdb要先启动让它处于监听状态啊?怎么启动?
把<destination-jndi-name>和<connection-factory-jndi-name>都设置成不存在的jndi名字,竟然也可以deploy,不出错。
你去掉发送程序的onmessage 还有不要实现messagelistener试试看mdb能不能收到
private static Context context = null;
//private boolean transacted = true;
private int acknowledgementMode = Session.AUTO_ACKNOWLEDGE;
private Hashtable environment = null;
private QueueConnectionFactory queueConnectionFactory = null;
private QueueConnection queueConnection = null;
private QueueSession queueSession = null;
private QueueSender queueSender = null;
private QueueReceiver queueReceiver = null;
private Queue queue = null;
private String queueConnectionFactoryName = "nameofjndi";
private String queueName = "MyJMSQueue_jndi"; public void sendText(String messageText) throws Exception {
InitialContext initContext = new InitialContext();
QueueConnectionFactory factory =
(QueueConnectionFactory) initContext.lookup(queueConnectionFactoryName);
Queue queue = (Queue) initContext.lookup(queueName);
initContext.close();
QueueConnection connection = factory.createQueueConnection();
connection.start();
QueueSession session =connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(queue);
TextMessage message = session.createTextMessage(messageText);
sender.send(message); }public void close() throws Exception {
if (queueSender != null) {
queueSender.close();
}
if (queueReceiver != null) {
queueReceiver.close();
}
if (queueSession != null) {
queueSession.close();
}
if (queueConnection != null) {
queueConnection.close();
}
}
}
没有onmessage,也没有实现messagelistener
你的客户端只需要象上面的那样就行了。
不正确
改为如下
import java.util.*;
import javax.naming.*;
import javax.jms.*;public class JmsUpdateDictionary {
private static Context context = null;
//private boolean transacted = true;
private int acknowledgementMode = Session.AUTO_ACKNOWLEDGE;
private Hashtable environment = null;
private QueueConnectionFactory queueConnectionFactory = null;
private QueueConnection queueConnection = null;
private QueueSession queueSession = null;
private QueueSender queueSender = null;
private QueueReceiver queueReceiver = null;
private Queue queue = null;
public Context ctx = null;
private String queueConnectionFactoryName = "nameofjndi";
private String queueName = "MyJMSQueue_jndi";
public final static String JNDI_FACTORY =
"weblogic.jndi.WLInitialContextFactory"; private Context getInitialContext() throws NamingException {
if (ctx == null) {
try {
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
ctx = new InitialContext(p);
}
catch (NamingException ne) {
System.err.println("** Unable to connect to the server");
ne.printStackTrace();
throw ne;
}
}
return ctx;
} public void sendText(String messageText) throws Exception {
Context initContext = getInitialContext(); ;
QueueConnectionFactory factory =
(QueueConnectionFactory) initContext.lookup(queueConnectionFactoryName);
Queue queue = (Queue) initContext.lookup(queueName);
initContext.close();
QueueConnection connection = factory.createQueueConnection();
connection.start();
QueueSession session = connection.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
QueueSender sender = session.createSender(queue);
TextMessage message = session.createTextMessage(messageText);
sender.send(message); } public void close() throws Exception {
if (queueSender != null) {
queueSender.close();
}
if (queueReceiver != null) {
queueReceiver.close();
}
if (queueSession != null) {
queueSession.close();
}
if (queueConnection != null) {
queueConnection.close();
}
} public static void main(String[] args) {
JmsUpdateDictionary mdb = new JmsUpdateDictionary();
try {
mdb.sendText("hello");
}
catch (Exception e) {
e.printStackTrace();
}
}
}
然后做个接收程序 经测试可以收到消息 我用的weblogic7 + jb8
<2003-8-13 上午01时54分45秒> <Notice> <WebLogicServer> <000360> <Server started
in RUNNING mode>
TextMessage[ID:P<97920.1060741372750.0>, hello]
ejb-jar.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<enterprise-beans>
<message-driven>
<display-name>Updatedictionary</display-name>
<ejb-name>Updatedictionary</ejb-name>
<ejb-class>com.ejb.mdb.UpdatedictionaryBean</ejb-class>
<transaction-type>Container</transaction-type>
<message-driven-destination>
<destination-type>javax.jms.Queue</destination-type>
</message-driven-destination>
</message-driven>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>Updatedictionary</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>weblogic-ejb-jar.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB//EN' 'http://www.bea.com/servers/wls700/dtd/weblogic-ejb-jar.dtd'>
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>Updatedictionary</ejb-name>
<message-driven-descriptor>
<destination-jndi-name>MyJMSQueue_jndi1</destination-jndi-name>
<connection-factory-jndi-name>nameofjndi1</connection-factory-jndi-name>
</message-driven-descriptor>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
MyJMSQueue 0 0 0 1553 Messages Pending Messages High Messages Received Messages Threshold Time
0 1553 10 0 Bytes Bytes Pending Bytes Received Bytes Threshold Time
13977 0 90 0
但显示消费掉的数目为0按照你这种思路,监控了mdb,结果如下:EJBName
Updatedictionary
Pool Idle Beans Count
0
Pool Beans In Use Count
0
Pool Waiter Total Count
0
Pool Timeout Total Count
0
JMSConnection Alive
false 显示mdb不是活动的
JMSConnection Alive 为 false 显示mdb没有被激活,希望大家帮忙!
<!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB//EN' 'http://www.bea.com/servers/wls700/dtd/weblogic-ejb-jar.dtd'>
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>Updatedictionary</ejb-name>
<message-driven-descriptor>
<destination-jndi-name>MyJMSQueue_jndi</destination-jndi-name>
<connection-factory-jndi-name>nameofjndi</connection-factory-jndi-name>
</message-driven-descriptor>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
我又发现一个解决的方法,就是把MDB设置成Bean管理而非Containor管理。