1

我们正在运行 Spring Boot 应用程序。在 Spring 启动后,我们尝试在其中运行 JPOS QServer。它开始了第二季度,我们可以从模拟器客户端接收 ISOmsgs,我们也可以响应 beck。

为了启动 Q2,我们使用了 xml 配置,如下所示。

<server class="org.jpos.q2.iso.QServer" name="Server-A-Server" logger="Q2">

<attr name="port" type="java.lang.Integer">8118</attr>
<attr name="maxSessions" type="java.lang.Integer">100</attr>
<attr name="minSessions" type="java.lang.Integer">0</attr>

<!-- Format server name: "Project Name" + "-" + "Channel" -->
<channel name="Server-A-Channel" class="org.jpos.iso.channel.XMLChannel" logger="Q2"
         packager="org.jpos.iso.packager.XMLPackager">
</channel>

<request-listener class="fi.neocard.jpos.ISOMessageListener">
    <property name="timeout" value="10000"/>
</request-listener>

正如您从上面的 xml 中看到的那样,它侦听 ISOMessangerListener 类,它自然不是 spring 相关类,而且我认为 spring 和 QServer 运行在不同的 Servlet 上。所以问题来了,我们这里没有任何与 Spring 相关的 bean,我们不能 @Autowired 任何。但是我们所有的业务逻辑都已经在 spring 中编写好了。

到目前为止我们尝试了什么

1) 保持应用程序上下文静态,并在 ISOMessageListener 中需要时使用它(在接收到侦听器的消息后上下文为空)。

2)做这样的事情。SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

并阅读了很多文章如何从春天之外获得上下文。

到目前为止,我检查jvisualvm了 Q2 和 Springboot 都作为单个应用程序运行。

希望至少能得到一些建议。

4

1 回答 1

3

如果有人对此感兴趣,我是如何让它工作的,而不是通过 Q2(xml 文件)运行 ISOServer,我只是在我的 spring 已经启动时手动执行它,然后获取 ISORequestListener 已经存在的 bean 并将其传递给服务器。

@Component
public class ISOserver implements ISORequestListener {

@Autowired
ISOserver isOserver;

@EventListener(ContextRefreshedEvent.class)
public void contextRefreshedEvent() throws Exception{
    Logger logger = new Logger();
    logger.addListener(new SimpleLogListener(System.out));
    ServerChannel channel = new XMLChannel(new XMLPackager());
    ((LogSource) channel).setLogger(logger, "channel");
    ISOServer isoServer = new ISOServer(8118, channel, null);
    isoServer.setLogger(logger, "server");
    isoServer.addISORequestListener(isOserver);
    new Thread(isoServer).start();
}

@Override
public boolean process(ISOSource isoSource, ISOMsg receivedISOmsg) {

    return false;
}
}
于 2017-06-21T16:53:25.220 回答