求助:关于jms的持久性,和消息选择的问题

03-09-17 programboy
我现在正在开发一个地税的系统,有一个关于自动复业的功能,就是在纳税人报停业的时候要填一个复业的时间,然后到了那个时间后系统就能自动复业.我的考虑是写一个message bean,当用户报停业的时候发送一个消息,包含复业的日期在消息里面.然后由系统自己去比较消息,如果消息里面的时间和当前系统时间相同或小于时,就执行复业的动作.这是我整个设计的思路.发送消息,和message bean都写好后,我发现发送消息和onmessage执行消息都可以,但是一旦在onmessage中对整个topic中的消息做了日期比较后这个消息就不在了,所以在我发送消息后只能响应一次,所有的消息就全都没了,这和我的设计是完全违背的.还有当webloigc重起的时候以前的消息也都不再了,我用的是topic,因该不存在这个问题的吧?

希望有那位大哥给于解决.

所有的代码如下:

    

programboy
2003-09-17 17:33
发送消息的代码如下

public void jmsTopicProductor(String strTopicInfo,String ss)

{

Context ctx = null;

TopicConnectionFactory topicFactory = null;

TopicConnection tcon = null;

TopicSession topicSession = null;

TextMessage msg = null;

try

{

ctx = new InitialContext();

topicFactory = (TopicConnectionFactory)ctx.lookup("autopracticeConnectionFactory");

tcon = topicFactory.createTopicConnection();

topicSession = tcon.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);

Topic topic = (Topic)ctx.lookup("autopracticetopic");

TopicPublisher publisher= topicSession.createPublisher(topic);

msg = topicSession.createTextMessage();

tcon.start();

msg.setStringProperty("char",ss);

msg.setText(strTopicInfo);

publisher.publish(msg); //发送消息到topic

_logger.debug("the message send ok.the message value is " + strTopicInfo);

publisher.close();

topicSession.close();

tcon.close();

}

catch(NamingException e)

{

_logger.debug("the throw nameingexception.");

}

catch(JMSException e)

{

_logger.debug("the throw jmsexception.");

}

}

第一个参数是消息的内容,第二个是传入的时间转化成的字符串作为消息比较的property.消息是能发送成功的,参数传的也是正确的.

programboy
2003-09-17 17:42
message bean 的onmessge代码如下

public void onMessage(Message incomingMsg){

TextMessage msgText = null;

StreamMessage msgObject = null;

String msgtime = null;

String nsr = null;

try {

if(incomingMsg instanceof TextMessage)

{

msgText = (TextMessage)incomingMsg;

String msgtype = msgText.getStringProperty("char");

String year = msgtype.substring(0,4);

_logger.debug("the str year is " + year);

String month = msgtype.substring(4,6);

_logger.debug("the str month is" + month);

String day = msgtype.substring(6,8);

_logger.debug("the str day is " + day);

GregorianCalendar curCalendar = new GregorianCalendar();

Date curDate = (Date) curCalendar.getTime();

DateConvert dateConvert = new DateConvert(curDate);

String nyear = dateConvert.getYear();

String nmonth = dateConvert.getMonth();

if(nmonth.length()==1)nmonth="0"+nmonth;

String nday = dateConvert.getDay();

if(nday.length()==1)nday="0"+nday;

_logger.debug("the year is " + nyear);

_logger.debug("the month is " + nmonth);

_logger.debug("the day is "+ nday);

if(day.equals(nday))

{

msgtime = msgText.getText();

_logger.debug("MMMMMMMMMMM MMMMMMMMMM get the message ok value is "+msgtime);

System.out.println("get the message ok value is"+msgtime);

}

else

{

_logger.debug("it is not.");

}

}

} catch (JMSException e) {

e.printStackTrace(); //To change body of catch statement use Options | File Templates.

} catch (Throwable te){

te.printStackTrace();

}

}

简单的做了一下比较,就是当传入的时间字符串和系统时间字符串相同的时候,就会执行,这也是可以的但是每次都会把topic中的所有消息都执行了

ejb-jar 的代码如下:

<?xml version="1.0"?>

<!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>

<ejb-name>AutoPracticeMSB</ejb-name>

<ejb-class>com.jt.msg.autopractice.AutoPracticeBean</ejb-class>

<transaction-type>Container</transaction-type>

<message-driven-destination>

<destination-type>javax.jms.Topic</destination-type>

</message-driven-destination>

</message-driven>

</enterprise-beans>

<assembly-descriptor>

<container-transaction>

<method>

<ejb-name>AutoPracticeMSB</ejb-name>

<method-name>*</method-name>

</method>

<trans-attribute>Required</trans-attribute>

</container-transaction>

</assembly-descriptor>

</ejb-jar>

weblogic-ejb-jar 代码如下:

<?xml version="1.0"?>

<!DOCTYPE weblogic-ejb-jar PUBLIC

'-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB//EN'

'http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd'>

<weblogic-ejb-jar>

<weblogic-enterprise-bean>

<ejb-name>AutoPracticeMSB</ejb-name>

<message-driven-descriptor>

<destination-jndi-name>autopracticetopic</destination-jndi-name>

<!--

<connection-factory-jndi-name>autopracticeConnectionFactory</connection-factory-jndi-name>

-->

</message-driven-descriptor>

</weblogic-enterprise-bean>

</weblogic-ejb-jar>

webloigc的config.xml的关于jms的配置如下:

<JMSConnectionFactory Name="autopracticeConnectionFactory"

MessagesMaximum="-1" JNDIName="autopracticeConnectionFactory" Targets="myserver"/>

<JMSFileStore Name="MyJMSFileStore" Directory="C:\bea702\jmsStore" SynchronousWritePolicy="Direct-Write"/>

<JMSServer Name="MyJMSServer" Store="MyJMSFileStore" Targets="myserver">

<JMSTopic Name="autopracticetopic" JNDIName="autopracticetopic" StoreEnabled="true"/>

</JMSServer>

这是整个bean的代码,我想解决的问题就是

1:发送到topic中的消息,如果我不手动删除是不会删除的,也就是说系统不会自动的把我发送的消息给over掉,或者说我用过的消息删除,还没有处理的消息留在topic中

2:我怎样可以用消息选择机制,自动过虑我的消息让到时间的才去执行

3:即时我的webloigc 死掉了,没有执行的消息在webloigc启动后仍然能够继续执行

希望各位前辈帮帮小弟,尽快解决一下问题

小弟在此先谢过.

charlie
2003-09-17 20:11
这本来就是消息处理的机制,消息一旦被就不能找回来,也不应该找回来,可以把消息处理后存储入数据库,通过数据库触发器来产生复业消息。

仅仅依赖JMS处理你的问题很不合理

programboy
2003-09-17 21:38
那你的意思是只要消息onmessage过这后,message就over了是么?

那消息过虑不是可以在message server 中过虑如果合适的才发给message bean的么?,如果我这样过虑的话,是不是就可以实现我的想法了那?

猜你喜欢
5Go 1 2 3 4 ... 5 下一页