请配置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文件中,像上述那样加
<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文件中,像上述那样加
解决方案 »
- 问一个关于c3p0配置的问题,是c3p0作为连接池单独使用的场合的情况
- List的查找值问题
- Java编码问题,请指教。
- struts+hibernate实现用户管理出现的问题
- struts2中的小问题
- html:link动态传值问题
- 问个Struts <html:form>标记的问题!
- [求助]tomcat5.0管理员默认用户名和密码是多少??
- 急,一个小问题,http://localhost需要验证?
- 大家能否推荐一下关于Struts的书,当然要求是质量高噢.高分送给你过年
- 如何在powerPoint打开applet的java小程序,100求助
- Sql server中text字段类型在struts中乱码问题
但如果我的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>
又怎么配?
谢谢大侠!
我将以下加入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>
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
http://xpetstore.sourceforge.net/setup_jboss-3.0.x.html
只要配那个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?
我试过,还是不行.
我有点怀疑是我程序的问题,我改了一下用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");
是否是这里没弄对,请大家赐教.
谢谢回答问题的大侠们.现在问题还没解决所以还不能结贴,解决之后我会给分的
这里的url必须是这样hostname:portnumber
OK??
localhost:1099我的意思是出错是在getSendQueue()的Object obj = getContext().lookup(sendQueueName);
而我又觉得好像这个sendQueueName的Queue对象没有在这个Context里面,所以找不到才说我的Queue没有Bound,是这样吗?
大家辛苦了,接分!