关于使用JBOSS写JMS的奇怪问题

liweisnake 2004-08-03 05:00:24
首先感谢大家能进来看看.
我遇到了这样的问题:在使用JBOSS服务器的条件下写JMS我在程序中指定了消息队列发送和接收队列为myQueue,但运行时一直出错说myQueue没有bound.而且无论我改成哪个都不行,我试过在jboss的jmx中配和在配置文件中配两种方法都没通过,请大侠们赐教,我使用的JMS的程序是JBUILDER10中直接生成的,以下是出错的堆栈:
log4j:WARN No appenders could be found for logger (org.jboss.mq.referenceable.SpyConnectionFactoryObjectFactory).

log4j:WARN Please initialize the log4j system properly.

javax.naming.NameNotFoundException: testQueue not bound

at org.jnp.server.NamingServer.getBinding(NamingServer.java:495)

at org.jnp.server.NamingServer.getBinding(NamingServer.java:503)

at org.jnp.server.NamingServer.getObject(NamingServer.java:509)

at org.jnp.server.NamingServer.lookup(NamingServer.java:282)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:324)

at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:261)

at sun.rmi.transport.Transport$1.run(Transport.java:148)

at java.security.AccessController.doPrivileged(Native Method)

at sun.rmi.transport.Transport.serviceCall(Transport.java:144)

at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)

at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)

at java.lang.Thread.run(Thread.java:536)

at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)

at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)

at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:133)

at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)

at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:530)

at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:509)

at javax.naming.InitialContext.lookup(InitialContext.java:347)

at datatransfer.Jms.getSendQueue(Jms.java:122)

at datatransfer.Jms.getQueueSender(Jms.java:107)

at datatransfer.Jms.sendText(Jms.java:91)

at datatransfer.JmsClient.transfer(JmsClient.java:93)

at datatransfer.JmsClient.mutiTransfer(JmsClient.java:69)

at datatransfer.testJmsCilent.main(testJmsCilent.java:22)
...全文
252 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
TGITCIC 2004-08-04
  • 打赏
  • 举报
回复
你用的QUEUE不用配那个jbossmq-state.xml
只要配那个destination-service.xml
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=order">
<attribute name="JNDIName">queue/order</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
<depends security>千万不能要,要不你就成了要权限的QUEUE了,OK?
hailin217 2004-08-04
  • 打赏
  • 举报
回复
you can reference this page too
http://xpetstore.sourceforge.net/setup_jboss-3.0.x.html
hailin217 2004-08-04
  • 打赏
  • 举报
回复
add the follow code in file destinations-service.xml

<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=order">
<attribute name="JNDIName">queue/order</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
modify order to your queue jndi name
liweisnake 2004-08-04
  • 打赏
  • 举报
回复
我刚刚试过,好像还是不行.
我将以下加入jboss/server/default/deploy/jms/jbossmq-destination-service.xml中
<mbean code="org.jboss.mq.server.jmx.Queue"
name="jboss.mq.destination:service=Queue,name=myQueue">
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>

<depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager</depends>
<attribute name="SecurityConf">
<security>
<role name="guest" read="true" write="true"/>
<role name="publisher" read="true" write="true" create="true"/>
<role name="noacc" read="true" write="true" create="true"/>
</security>
</attribute>
</mbean>
然后我的jbossmq-state.xml是这样的
<?xml version="1.0" encoding="UTF-8"?>
<StateManager>
<Users>
<User>
<Name>john</Name>
<Password>needle</Password>
<Id>DurableSubscriberExample</Id>
</User>
<User>
<Name>guest</Name>
<Password>guest</Password>
</User>
<User>
<Name>nobody</Name>
<Password>nobody</Password>
</User>
<User>
<Name>dynsub</Name>
<Password>dynsub</Password>
</User>
</Users>
<Roles>
<Role name="guest">
<UserName>guest</UserName>
<UserName>john</UserName>
</Role>
<Role name="subscriber">
<UserName>john</UserName>
</Role>
<Role name="publisher">
<UserName>john</UserName>
<UserName>dynsub</UserName>
</Role>
<Role name="durpublisher">
<UserName>john</UserName>
<UserName>dynsub</UserName>
</Role>
<Role name="noacc">
<UserName>john</UserName>
<UserName>nobody</UserName>
</Role>
</Roles>
<DurableSubscriptions>
</DurableSubscriptions>
</StateManager>
liweisnake 2004-08-04
  • 打赏
  • 举报
回复
lifetragedy(生活是场悲剧)大侠,先在此谢过.
但如果我的JMS是用Queue而不是Topic呢?是否还要配jbossmq-state.xml文件,jbossmq-destination-service.xml文件的<mbean>中的<attribute name="SecurityConf">
<security>
<role name="subscriber" read="true" write="true" create="true"/>
<role name="publisher" read="true" write="true" create="true"/>
</security>
又怎么配?
谢谢大侠!
TGITCIC 2004-08-04
  • 打赏
  • 举报
回复
请配置jboss/server/default/conf下的jbossmq-state.xml文件:
<Users>

<User>

<Name>csmjboss</Name>

<Password>isdnymk</Password>

<Id>csmjbossid</Id>

</User>

<User>

<Name>csm</Name>

<Password>isdnymk</Password>

<Id>csmid</Id>

</User>

<User>
<Role name="subscriber">

<UserName>csm</UserName>

<UserName>csmsub</UserName>

<UserName>csmjboss</UserName>

<UserName>client1</UserName>

<UserName>client2</UserName>

<UserName>client3</UserName>

<UserName>client4</UserName>

<UserName>client5</UserName>
<UserName>client6</UserName>
<UserName>client7</UserName>
<UserName>client8</UserName>
</Role>

<Role name="test">

<UserName>csm</UserName>

</Role>
然后配置jboss/server/default/deploy/jms/jbossmq-destination-service.xml文件:

<mbean code="org.jboss.mq.server.jmx.Topic"
name="jboss.mq.destination:service=Topic,name=csmjms">
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>

<depends optional-attribute-name="SecurityManager">jboss.mq:service=SecurityManager</depends>
<attribute name="SecurityConf">
<security>
<role name="subscriber" read="true" write="true" create="true"/>
<role name="publisher" read="true" write="true" create="true"/>
</security>
</attribute>
</mbean>

记住,如果是持久订阅消息一定要设USERNAME,ROLE然后把ROLE加到jbossmq-destination-service文件中,像上述那样加
hq1305018 2004-08-04
  • 打赏
  • 举报
回复
JBOSS不熟,但注意大小写。
帮顶吧!
liweisnake 2004-08-04
  • 打赏
  • 举报
回复
谢谢大家的关心,这个问题已经得到解决了.我到www.jboss.com上找到一个例子才知道我的queue写错了,应该写queue/myQueue作为sendQueueName.
大家辛苦了,接分!
liweisnake 2004-08-04
  • 打赏
  • 举报
回复
我的url是这样的,也没错啊.
localhost:1099

我的意思是出错是在getSendQueue()的Object obj = getContext().lookup(sendQueueName);
而我又觉得好像这个sendQueueName的Queue对象没有在这个Context里面,所以找不到才说我的Queue没有Bound,是这样吗?
TGITCIC 2004-08-04
  • 打赏
  • 举报
回复
ht.put(Context.PROVIDER_URL, url);
这里的url必须是这样

hostname:portnumber
OK??
liweisnake 2004-08-04
  • 打赏
  • 举报
回复
多谢上面这位仁兄!
我试过,还是不行.
我有点怀疑是我程序的问题,我改了一下用jbuilder生成的程序(加了一个方法setEnviroment()和getInitialContext那里改成了return new javax.naming.InitialContext(environment);),如下:
package datatransfer;

import javax.jms.MessageListener;
import javax.naming.Context;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueConnection;
import javax.jms.QueueSession;
import javax.jms.QueueSender;
import javax.jms.QueueReceiver;
import javax.jms.Queue;
import java.io.Serializable;
import javax.jms.Message;
import java.util.Hashtable;

public class Jms
implements MessageListener {
private static Context context;
private boolean transacted = false;
private int acknowledgementMode = javax.jms.Session.AUTO_ACKNOWLEDGE;
private QueueConnectionFactory queueConnectionFactory;
private QueueConnection queueConnection;
private QueueSession queueSession;
private QueueSender queueSender;
private QueueReceiver queueReceiver;
private Queue queue;
private String queueConnectionFactoryName = "ConnectionFactory";
private String sendQueueName = "myQueue";
private String recvQueueName = "myQueue";
private Hashtable environment;

public Jms()
{

}

public Jms(String queueConnectionFactoryName,String sendQueueName,String recvQueueName)
{
this.queueConnectionFactoryName = queueConnectionFactoryName;
this.sendQueueName = sendQueueName;
this.recvQueueName = recvQueueName;
}

public void setEnvironment(Hashtable environment)
{
this.environment = environment;
}
public void setTransacted(boolean transacted)
{
this.transacted = transacted;
}

public void sendObject(Serializable message) throws Exception
{
javax.jms.ObjectMessage objectMessage = getQueueSession().
createObjectMessage();
objectMessage.clearBody();
objectMessage.setObject(message);
getQueueSender().send(objectMessage);
if (isTransacted()) {
getQueueSession().commit();
}
}

public void sendText(String message) throws Exception {
javax.jms.TextMessage textMessage = getQueueSession().createTextMessage();
textMessage.clearBody();
textMessage.setText(message);
getQueueSender().send(textMessage);
if (isTransacted()) {
getQueueSession().commit();
}
}

public QueueReceiver getQueueReceiver() throws Exception {
if (queueReceiver == null) {
queueReceiver = getQueueSession().createReceiver(getRecvQueue());
queueReceiver.setMessageListener(this);
}
return queueReceiver;
}

public QueueSender getQueueSender() throws Exception {
if (queueSender == null) {
queueSender = getQueueSession().createSender(getSendQueue());
}
return queueSender;
}

public Queue getRecvQueue() throws Exception {
if (queue == null) {
Object obj = getContext().lookup(recvQueueName);
queue = (Queue) obj;
}
return queue;
}

public Queue getSendQueue() throws Exception {
if (queue == null) {
System.out.print(sendQueueName);
Object obj = getContext().lookup(sendQueueName);
queue = (Queue) obj;
}
return queue;
}

public QueueSession getQueueSession() throws Exception {
if (queueSession == null) {
queueSession = getQueueConnection().createQueueSession(isTransacted(),
getAcknowledgementMode());
}
return queueSession;
}

public QueueConnection getQueueConnection() throws Exception {
if (queueConnection == null) {
queueConnection = getQueueConnectionFactory().createQueueConnection();
queueConnection.start();
}
return queueConnection;
}

public QueueConnectionFactory getQueueConnectionFactory() throws Exception {
if (queueConnectionFactory == null) {
Object obj = getContext().lookup(queueConnectionFactoryName);
queueConnectionFactory = (QueueConnectionFactory) obj;
}
return queueConnectionFactory;
}

private Context getInitialContext() throws Exception {
try {
return new javax.naming.InitialContext();
}
catch (Exception ex) {
ex.printStackTrace();
throw ex;
}
}

public void setRecvQueueName(String recvQueueName) {
this.recvQueueName = recvQueueName;
}

public String getRecvQueueName() {
return recvQueueName;
}

public void setSendQueueName(String sendQueueName) {
this.sendQueueName = sendQueueName;
}

public String getSendQueueName() {
return sendQueueName;
}

public void setQueueConnectionFactoryName(String queueConnectionFactoryName) {
this.queueConnectionFactoryName = queueConnectionFactoryName;
}

public String getQueueConnectionFactoryName() {
return queueConnectionFactoryName;
}

public void setAcknowledgementMode(int acknowledgementMode) {
this.acknowledgementMode = acknowledgementMode;
}

public int getAcknowledgementMode() {
return acknowledgementMode;
}

public boolean isTransacted() {
return transacted;
}

private Context getContext() throws Exception {
if (context == null) {
try {
context = getInitialContext();
}
catch (Exception ex) {
ex.printStackTrace();
throw ex;
}
}
return context;
}

public void onMessage(Message message) {
if (message instanceof javax.jms.BytesMessage) {
javax.jms.BytesMessage bytesMessage = (javax.jms.BytesMessage) message;
/** @todo Process bytesMessage here */
}
else if (message instanceof javax.jms.MapMessage) {
javax.jms.MapMessage mapMessage = (javax.jms.MapMessage) message;
/** @todo Process mapMessage here */
}
else if (message instanceof javax.jms.ObjectMessage) {
javax.jms.ObjectMessage objectMessage = (javax.jms.ObjectMessage) message;
/** @todo Process objectMessage here */
}
else if (message instanceof javax.jms.StreamMessage) {
javax.jms.StreamMessage streamMessage = (javax.jms.StreamMessage) message;
/** @todo Process streamMessage here */
}
else if (message instanceof javax.jms.TextMessage) {
javax.jms.TextMessage objectMessage = (javax.jms.TextMessage) message;
/** @todo Process textMessage here */
try{
System.out.print(objectMessage.getText());
DataWriter dw = new DataWriter((String)objectMessage.getText());
dw.write();
}catch(Exception e)
{
e.printStackTrace();
}
}
if (isTransacted()) {
try {
getQueueSession().commit();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
}

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();
}
}
}
但我觉得这个initialContext是用我的environment生成的,而我的environment里面就没有放有关Queue的东西,如下:
ht = new Hashtable();//这个ht就是传入的environment
ht.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
ht.put(Context.PROVIDER_URL, url);
ht.put(Context.URL_PKG_PREFIXES, "org.jnp.interfaces");
是否是这里没弄对,请大家赐教.
谢谢回答问题的大侠们.现在问题还没解决所以还不能结贴,解决之后我会给分的

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧